it-swarm.com.de

Werden die Entwicklungsvorteile der Verwendung von Docker bei Verwendung von Java im Vergleich zu anderen Sprachen, die näher an Unix-Binärdateien liegen) negiert?

Ich hatte einen Freund, der sagte:

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

Dies wäre nun wahr, wenn die Entwickler Ruby schreiben würden, PHP oder Go - wo es eine binäre Richtungsverbindung zum Betriebssystem gibt.

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

In diesem Fall sind die Vorteile der lokalen Ausführung von Docker für Entwickler zur Replikation der Produktionsumgebung wahrscheinlich 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 Verwendung von Java im Vergleich zu anderen Sprachen, die näher an Unix-Binärdateien liegen) negiert?

53
hawkeye

Ganz und gar 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, beide mit Java.

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 von dem 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 stört Sie möglicherweise nicht zu sehr (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 für winzige möglich macht Käfer zum Einschleichen.

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

86

Sie stellen selten nur eine "Java App" bereit. Ihre Java -Anwendung verfügt über viele verschiedene Unterstützungsprogramme. Wir verwenden Apache HTTPD, Apache Tomcat, ActiveMQ für Messaging, ein FTP-Deamon, MySQL und eine Handvoll benutzerdefinierter Dienste, um diese in Programme zu integrieren arbeite nicht direkt mit Java.

Dies geht nicht einmal in die dazugehörige Entwicklungssoftware ein - Eclipse, Ant, Adobe Flex, Groovy, Firefox und Subversion (ich überspringe einige)

Das Einrichten einer neuen Workstation dauert zwischen einem ganzen Tag und einer Woche. Wir haben die Umstellung auf Docker erörtert, um dieses Problem zu vereinfachen. 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 mehr als 20 Server warten müssen. Docker fängt an, ziemlich gut auszusehen!

(20 scheint ziemlich schmerzhaft für eine App zu sein, die jeweils nur auf einem einzelnen Server ausgeführt wird ... aber multiplizieren Sie diesen einen Server mit Clustern (x2), Test/Staging/Produkt (x3), internem/externem (x2) und primärem Standort/backup site (x2) und du kommst ziemlich schnell hoch)

35
Bill K

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

Hier sind zwei Punkte zu beantworten:

Erstens: dort muss ein besserer Weg sein, und es gibt: Sie können kleinere (und effizientere) Docker-Container nur mit der Installationsumgebung erstellen, was zu ähnlichen Vorteilen führt wie im Fall von Golang- With-Environment versus Golang-Just-Binaries-Container. Im Fall von Java können Sie ein Fat Jar oder eine installierbare App erstellen, die alle Bibliotheksgläser und ein Shell-Skript enthält. Im Fall von Python können Sie Auditwheel verwenden, um eigenständige Räder zu erstellen, die von der Build-Umgebung unabhängig sind (und Sie können C++ mit statischer Verknüpfung verwenden, um fast den gleichen Effekt zu erzielen).

Zwei: wofür benötigen Sie Docker? In Java Land) können Sie mithilfe von Klassenladern viele verschiedene Komponenten trennen, aber der Hauptpunkt ist, was befindet sich in der Nähe der Java -Anwendung. Nein Java -Anwendung wird von selbst ausgeführt - wenn sie nicht im Docker ausgeführt wird, muss sie normalerweise von Supervisord oder Systemd überwacht werden oder ähnliches. Geben Sie die Kubernetes-, Marathon- oder Docker-Cloud ein, die die Containerabstraktion verwendet, um nicht den Host selbst zu virtualisieren, sondern das gesamte Netzwerk so zu virtualisieren, dass Sie nur Container bereitstellen können und diese auf einem zufälligen Host ausgeführt werden.

Microservices werden normalerweise in Docker-basierten Clouds ausgeführt, da Sie damit Ihre Docker-Hosts als Vieh und nicht als Haustiere behandeln können, ähnlich wie bei Docker-Anwendungen. Natürlich wird diese Abstraktion undicht, sobald Sie Host-Volumes auf Docker bereitstellen und Docker-Container auf genau dem Host ausführen müssen, auf dem diese Volumes vorhanden sind. Einige Leute kommen sogar darum herum.

8
Yannick

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

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

Container stellen wirklich viele meiner Annahmen über die Entwicklung in Frage, die sich aus meiner Erfahrung ergeben. Wenn beispielsweise jemand einen Pfad zu einer Ressourcendatei in einer Anwendung fest codiert, wissen viele erfahrene Entwickler, dass dies problematisch ist, und Sie sollten ihn konfigurierbar machen. Aber wenn Sie auf einen Container abzielen, ist dies wirklich der Fall? Wenn Sie den Container erstellen, teilen Sie ihm die Verzeichnisstrukturen mit. Dort konfigurieren Sie den Pfad. Sollten Sie es also zweimal konfigurieren? Was ist der Vorteil? Wenn Sie sie nicht zusammenbringen, funktioniert es nicht so ... TROCKEN?

Ich habe kürzlich eine Prototypanwendung mit Java und Docker) erstellt, die im Wesentlichen die GC-Ereignisse beobachtete. Wenn der alte Teil des Heaps einen Schwellenprozentsatz erreichte, wurde er selbst heruntergefahren. Docker (Schwarmmodus) würde dies tun Drehen Sie dann einen neuen hoch. Im Wesentlichen wurden keine größeren GC-Zyklen in der JVM erforderlich, und Docker konnte sie verwalten. Es funktionierte nicht so gut, wie ich es mir erhofft hatte (Kunden sahen einige Auswirkungen des Herunterfahrens), aber es war funktional genug, um eine Live-Demo vor einer Menge zu machen.

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

5
JimmyJames