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?
quelle
Antworten:
Ü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.
quelle
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
quelle
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.
quelle
Dies ist eine wirklich gute Frage, aber nachdem ich mit Docker gearbeitet habe, würde ich es umkehren:
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.
quelle