Werden die Entwicklungsvorteile der Verwendung von Docker bei der Verwendung von Java im Vergleich zu anderen Sprachen, die eher Unix-Binärdateien entsprechen, negiert?


53

Ich hatte einen Freund, der sagte:

Docker ist unglaublich. Sie können es verwenden, um die Produktion und alle ihre Macken auf Ihrem lokalen Computer zu replizieren . Dann können Sie diese Instanz bereitstellen gerade durch die alle Staging - Workflows super- schnell .

Nun, das wäre wahr, wenn die Entwickler Ruby, PHP oder Go schreiben würden - wo es eine binäre Richtungsverknüpfung zum Betriebssystem gibt.

Bei der Verwendung von Java gibt es jedoch bereits eine virtuelle Ebene zwischen dem Betriebssystem und der Sprache, die die Konsistenz des Betriebs unabhängig vom zugrunde liegenden Betriebssystem gewährleistet.

In diesem Fall werden die Vorteile der lokalen Ausführung von Docker für Entwickler zur Replikation der Produktionsumgebung möglicherweise negiert . (Im Vergleich zu Ruby, PHP oder Go).

Ich bin offen für Diskussionen darüber und bin gespannt auf einen abweichenden Standpunkt (mit Beweisen).

Werden die Entwicklungsvorteile der Verwendung von Docker bei der Verwendung von Java im Vergleich zu anderen Sprachen, die eher Unix-Binärdateien entsprechen, negiert?


34
Warum denkst du, dass Ruby und PHP binär sind? Ruby und PHP sind technisch noch virtueller als Java - in Java müssen Sie zuerst kompilieren und dann Ihr Programm in einer virtuellen Maschine ausführen. In Ruby und PHP wird der Quellcode ausgeliefert und die virtuelle Maschine liest den Quellcode direkt.
Slebetman

12
"Bei der Verwendung von Java gibt es jedoch bereits eine virtuelle Ebene zwischen dem Betriebssystem und der Sprache, die eine einheitliche Funktionsweise unabhängig vom zugrunde liegenden Betriebssystem gewährleistet." LOL. Java hat "einmal schreiben, überall testen" erfunden.
Andy

2
Java ist ein bewegliches Ziel. Gelegentlich werden Funktionen eingeführt, die Probleme lösen (die vor einigen Jahren vorgenommenen Sicherheitsmaßnahmen waren erstklassige Beispiele), oder Sie stoßen auf einen Fehler, für den Sie eine bestimmte Version verwenden müssen. Dies lässt sich im Docker viel einfacher steuern als mit dem systemeigenen Paketierungssystem des Host-Computers.
Thorbjørn Ravn Andersen

1
"Konsistenz des Betriebs unabhängig vom zugrunde liegenden Betriebssystem herstellen" Beachten Sie, dass das konsistente Verhalten der Sprachlaufzeit nicht die Tatsache negiert, dass Sie wahrscheinlich noch einige externe Abhängigkeiten haben. Könnte so einfach sein wie die Verwendung eines bestimmten Dateipfads für Ihre Protokolle.
jpmc26

Antworten:


86

Überhaupt nicht.

Stellen Sie sich vor, Sie führen die Version 1.8.0 von Java sowohl auf Ihrem Entwicklungscomputer als auch auf dem Server aus. Übrigens arbeiten Sie gleichzeitig an zwei Projekten, die beide Java verwenden.

Eines Tages wird in JVM ein Fehler gefunden, und die Server, auf denen das erste Projekt ausgeführt wird, an dem Sie arbeiten, werden auf 1.8.1 migriert. Übrigens sind die Server, auf denen das zweite Projekt ausgeführt wird, nicht vom Fehler betroffen und werden von einem anderen Team von Systemadministratoren verwaltet, die möglicherweise nicht bereit sind, auf 1.8.1 zu aktualisieren.

Zumindest für eines der Projekte führen Sie jetzt eine andere Java-Version aus.

Dies wird Sie vielleicht nicht allzu sehr stören (bis ein Server auf 1.9 migriert, während der andere die alte Version beibehält), aber dies würde bedeuten, dass Sie die Produktionsumgebung nicht mehr auf Ihrem lokalen Computer replizieren, was es winzigen Benutzern möglich macht Käfer, die sich einschleichen.

Wenn Sie sich vorstellen, dass Ihr Dateisystem, Ihre Abhängigkeiten, Ihre Sicherheitseinstellungen, Ihre lokale Konfiguration und Ihre Linux-Version selbst von der Produktion abweichen, riskieren Sie, Code zu schreiben, der in der Produktion fehlschlägt. Anstatt dieses Risiko einzugehen, können Sie Virtualisierung oder Docker mit geringen oder keinen Produktivitätsverlusten verwenden.


20
Auch so etwas passiert in größeren Unternehmen immer wieder. Es ist nicht nur eine theoretische Sache.
Enderland

5
Was tun Sie, wenn Sie einen Fehler in Docker entdecken?
Owen

Auch Java 9 wird die Dinge kaputt machen. Es wird einige Anstrengungen erforderlich sein.
Thorbjørn Ravn Andersen

8
@Owen Dasselbe tun Sie, wenn Sie einen Fehler in Java finden. Oder in {Linux, Windows}. Oder in Ihrer CPU .
Kroltan

1
@Trilarion: Ja, allerdings hauptsächlich in Form von Blogposts von Unternehmensentwicklern. Unter den Links "Weitere Informationen " auf docker.com/customers finden Sie jedoch Beispiele für große Unternehmen, die Docker zur Lösung solcher Probleme verwenden. In der Regel hielten es solche Unternehmen jedoch für selbstverständlich, dass sie eine perfekte Übereinstimmung zwischen Produktion und Entwicklung benötigten, und dies gelang mit VMs. Später stellten sie fest, "hey, Docker löst das gleiche Problem wie VMs, außer dass es schneller läuft und verwendet werden kann, um Bereitstellungen konsistent zu halten."
Brian

35

Sie stellen selten nur eine "Java-App" bereit. Ihre Java-Anwendung verfügt über viele verschiedene Support-Programme. Wir verwenden Apache HTTPD, Apache Tomcat, ActiveMQ für Messaging, FTP Deamon, MySQL und eine Handvoll angepasster Dienste, um Programme zu integrieren, die nicht direkt mit Java zusammenarbeiten.

Dies betrifft nicht einmal die Entwicklungssoftware, die damit einhergeht - Eclipse, Ant, Adobe Flex, Groovy, Firefox und Subversion (ich überspringe einige).

Das Einrichten einer neuen Workstation dauert zwischen einem vollen Tag und einer Woche. Wir haben den Umstieg auf Docker zur Vereinfachung dieses Problems erörtert. Es wäre erstaunlich, wenn wir in ein paar Stunden zuverlässig eine neue Workstation einführen könnten.

Ganz zu schweigen von der Tatsache, dass wir bei der Bereitstellung mindestens - 20 Server warten müssen. Docker sieht schon ziemlich gut aus!

(20 scheint für eine App, die jeweils nur auf einem Server ausgeführt wird, ziemlich schmerzhaft zu sein. Multiplizieren Sie diesen Server jedoch mit Clustern (x2), Test / Staging / Prod (x3), Intern / Extern (x2) und Primärstandort / backup site (x2) und du stehst ziemlich schnell auf


Warum nicht Bilder machen?
Dmitry Kudriavtsev

Wir hoffen. Wir sind ein kleines Team, das versucht, einem ziemlich stark genutzten / wichtigen System Funktionen hinzuzufügen, und haben nicht genügend Kontrolle über die Server, um deren Bereitstellung zu bestimmen. Könnte es aber für Entwickler verwenden, wir sind bei 32 MB RAM bereits ziemlich eingeschränkt - ich gehe davon aus, dass das Ausführen eines Docker-Images einen gewissen Overhead hat ... aber unser Plan ist, in diese Richtung zu gehen.
Bill K

Ich meinte für die Arbeitsplätze
Dmitry Kudriavtsev

Zeit und Speicher - wir müssen bereits einige Teile weglassen, um auf unseren 32-GB-Workstations ausgeführt zu werden (auf den 64-GB-Servern läuft alles einwandfrei). Wir haben ein wenig experimentiert und versuchen es vielleicht das nächste Mal, wenn wir eine neue Entwickler-Workstation bauen müssen.
Bill K

8

Diese Frage ist auch relevant für Golang, wo Sie einfach statisch verknüpfte Binärdateien extrahieren und sie irgendwo ausführen können, im Gegensatz zu Python oder C ++, wo Sie normalerweise eine große Anzahl verknüpfter Bibliotheken haben, die die Leute dazu bringen, einfach einen Docker-Container aus dem zu erstellen Entwicklungsumgebung.

Hier sind zwei Punkte zu beantworten:

Erstens: Es muss einen besseren Weg geben , und zwar: Sie können kleinere (und effizientere) Docker-Container nur unter Verwendung der Installationsumgebung erstellen, was zu ähnlichen Vorteilen führt wie im Fall von Golang-mit-Umgebung gegenüber Golang-nur -Binaries-Container. Im Falle von Java können Sie ein Fat-Jar oder eine installierbare App erstellen, die alle Library-Jars und ein Shell-Skript enthält. Im Fall von Python könnten Sie auditwheel verwenden, um eigenständige, von der Build-Umgebung unabhängige Räder zu erstellen (und Sie könnten C ++ mit statischer Verknüpfung verwenden, um fast denselben Effekt zu erzielen).

Zweitens: Wofür brauchen Sie Docker? In Java-Land können Sie mithilfe von Klassenladeprogrammen viele verschiedene Komponenten voneinander trennen, aber der wichtigste Punkt ist, was sich um die Java-Anwendung dreht. Keine Java-Anwendung wird von selbst ausgeführt. Wenn sie nicht in Docker ausgeführt wird, muss sie normalerweise von Supervisord, SystemD oder Ähnlichem überwacht werden. Betreten Sie die Kubernetes-, Marathon- oder Docker-Cloud, die die Container-Abstraktion verwendet, um nicht den Host selbst zu virtualisieren, sondern das gesamte Netzwerk so zu virtualisieren, dass Sie nur Container bereitstellen können, die auf einem zufälligen Host ausgeführt werden.

Microservices werden normalerweise in Docker-basierten Clouds ausgeführt, da Sie Ihre Docker-Hosts wie Rinder und nicht wie Haustiere behandeln können. Dies gilt auch für die Docker-Anwendungen. Natürlich wird diese Abstraktion undicht, sobald Sie Host-Volumes auf Docker mounten und Docker-Container auf genau dem Host ausführen müssen, auf dem diese Volumes vorhanden sind. Manche Leute umgehen das sogar.


5

Dies ist eine wirklich gute Frage, aber nachdem ich mit Docker gearbeitet habe, würde ich es umkehren:

Werden die Vorteile der JVM durch Containerisierung zunichte gemacht (z. B. Docker)?

Container stellen viele meiner Annahmen über die Entwicklung, die aus meiner Erfahrung stammen, wirklich in Frage. Wenn zum Beispiel jemand einen Pfad zu einer Ressourcendatei in einer Anwendung fest codieren würde, würden viele erfahrene Entwickler wissen, dass dies problematisch ist und dass Sie es konfigurierbar machen sollten. Aber wenn Sie einen Container anvisieren, ist dies wirklich der Fall? Wenn Sie den Container erstellen, teilen Sie ihm die Verzeichnisstrukturen mit. Sie konfigurieren dort den Pfad. Also sollten Sie es zweimal konfigurieren? Was ist der vorteil Wenn Sie sie nicht zusammenbringen, funktioniert es nicht so ... TROCKEN?

Ich habe kürzlich eine Prototyp-Anwendung mit Java und Docker erstellt, die im Wesentlichen die GC-Ereignisse überwacht und sich selbst herunterfährt, wenn der alte Teil des Heaps einen bestimmten Prozentsatz erreicht. Docker (Schwarmmodus) würde dann einen neuen starten. Im Wesentlichen wurden keine größeren GC-Zyklen in der JVM erforderlich, und Docker konnte sie verwalten. Es hat nicht so gut funktioniert, wie ich es mir erhofft hatte (Kunden sahen einige Auswirkungen des Herunterfahrens), aber es war funktionell genug, um einer Menschenmenge eine Live-Demo vorzuführen.

Sie sollten wirklich nur Container ausprobieren, wenn Sie neugierig sind. Es ist wirklich eine disruptive Technologie, mit der Sie sich auseinandersetzen müssen. Docker ist ein großartiger Ausgangspunkt, aber es gibt mindestens eine andere Alternative, die für alle von Vorteil ist: IMO.


"... aber es gibt mindestens eine andere brauchbare Alternative, die für alle gut ist." Also, welche könnte es diese eine andere brauchbare Alternative sein?
Trilarion

@Trilarion rkt (oder Rakete) . Es wird derzeit von Kubernetes zusammen mit Docker unterstützt.
JimmyJames
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.