Les avantages en termes de développement de l’utilisation de Docker avec Java comparés à d’autres langages plus proches des fichiers binaires Unix sont-ils compromis?

53

J'ai eu un ami qui a dit:

Docker est incroyable. Vous pouvez l'utiliser pour répliquer la production et tous ses défauts sur votre ordinateur local. Ensuite , vous pouvez déployer cette ligne droite par exemple à travers toute la mise en scène des flux de travail super rapide .

Or, cela serait vrai si les développeurs écrivaient Ruby, PHP ou Go , où il existait un lien binaire directionnel vers le système d'exploitation.

Mais lors de l'utilisation de Java , il existe déjà une couche virtuelle entre le système d'exploitation et le langage, assurant la cohérence des opérations quel que soit le système d'exploitation sous-jacent.

Dans ce cas, les avantages de l'exécution de Docker pour les développeurs localement afin de répliquer l'environnement de production sont niés . (Comparé à Ruby, PHP ou Go).

Je suis ouvert à la discussion à ce sujet et je souhaite entendre un point de vue dissident (avec des preuves).

Les avantages en termes de développement de l’utilisation de Docker avec Java comparés à d’autres langages plus proches des fichiers binaires Unix sont-ils compromis?

oeil de faucon
la source
34
Pourquoi pensez-vous que ruby ​​et php sont binaires? Ruby et php sont techniquement encore plus virtuels que Java - en Java, vous devez d'abord compiler, puis exécuter votre programme sur une machine virtuelle. En Ruby et PHP, vous envoyez le code source et la machine virtuelle lit directement le code source.
slebetman
12
"Mais lors de l'utilisation de Java, il existe déjà une couche virtuelle entre le système d'exploitation et le langage, assurant la cohérence des opérations quel que soit le système d'exploitation sous-jacent." LOL. Java a inventé "écrire une fois, tester partout".
Andy
2
Java est une cible mouvante. De temps en temps, des fonctionnalités sont introduites qui cassent des choses (le renforcement de la sécurité il y a quelques années en étaient des exemples probants) ou vous rencontrez un bogue qui vous oblige à utiliser une version spécifique. Il est beaucoup plus facile de contrôler cela dans docker que d'utiliser le système de packaging natif de l'ordinateur hôte.
Thorbjørn Ravn Andersen
1
"assurer la cohérence des opérations quel que soit le système d'exploitation sous-jacent" Notez que le comportement cohérent du langage d'exécution n'annule pas le fait que vous avez probablement encore des dépendances externes. Pourrait être quelque chose d'aussi simple que d'utiliser un chemin de fichier particulier pour vos journaux.
jpmc26

Réponses:

86

Pas du tout.

Imaginez que vous exécutiez la version 1.8.0 de Java sur votre ordinateur de développement et sur le serveur. En passant, vous travaillez simultanément sur deux projets, tous deux utilisant Java.

Un jour, un bogue est détecté dans la machine virtuelle Java et les serveurs sur lesquels est exécuté le premier projet sur lequel vous travaillez sont migrés vers la version 1.8.1. Soit dit en passant, les serveurs exécutant le deuxième projet ne sont pas affectés par le bogue et sont gérés par une autre équipe d’administrateurs système, qui ne souhaitent peut-être pas passer à la version 1.8.1.

Maintenant, au moins pour l’un des projets, vous exécutez une version différente de Java.

Cela ne vous dérangera peut-être pas trop (jusqu'à ce qu'un serveur migre vers la version 1.9, tandis que l'autre conserve l'ancienne version), mais cela signifierait que vous ne répliquez plus l'environnement de production sur votre ordinateur local, ce qui permet insectes à se glisser po

Si vous imaginez que votre système de fichiers, vos dépendances, vos paramètres de sécurité, votre configuration locale et votre version de Linux diffèrent de ceux de la production, vous vous exposez à un risque d'écriture de code qui échouera en production. Au lieu de prendre ce risque, vous pouvez utiliser la virtualisation ou Docker, avec une perte de productivité minime voire nulle.

Arseni Mourzenko
la source
20
De plus, ce genre de chose arrive TOUT le temps dans les grandes entreprises. Ce n'est pas juste une chose théorique.
enderland
5
Que faites-vous lorsque vous découvrez un bogue dans Docker?
Owen
Aussi Java 9 va casser des choses. Des efforts seront nécessaires.
Thorbjørn Ravn Andersen
8
@ Owen Même chose que lorsque vous trouvez un bogue dans Java. Ou sous {Linux, Windows}. Ou dans votre CPU .
Kroltan
1
@Trilarion: Oui, bien que la plupart du temps sous la forme de blogs de développeurs de sociétés. Cela dit, tous les liens "En savoir plus" sur docker.com/customers donneront des exemples de grandes entreprises utilisant docker pour résoudre de tels problèmes. Cela dit, ces sociétés prenaient généralement pour acquis qu'elles avaient besoin d'une adéquation parfaite entre production et développement, et le faisaient avec les ordinateurs virtuels. Plus tard, ils se sont rendus compte: "Hé, Docker résout le même problème que les ordinateurs virtuels, à la différence qu'il fonctionne plus rapidement et peut être utilisé pour maintenir la cohérence des déploiements."
Brian
35

Vous ne faites que rarement déployer une "application Java". Votre application java comporte de nombreux programmes d'assistance différents. Nous utilisons Apache HTTPD, Apache Tomcat, ActiveMQ pour la messagerie, un FTP Deamon, MySQL et une poignée de services personnalisés à intégrer à des programmes qui ne fonctionnent pas directement avec Java.

Cela ne va même pas dans le logiciel de développement qui va avec - éclipse, fourmi, adobe flex, groovy, firefox et subversion (j'en saute assez)

La configuration d’un nouveau poste de travail prend entre une journée et une semaine. Nous avons envisagé de passer à Docker pour simplifier ce problème. Ce serait étonnant si nous pouvions déployer de manière fiable un nouveau poste de travail en quelques heures.

Sans oublier le fait que lorsque nous déployons, nous devons maintenir plus de 20 serveurs; Docker commence à ressembler à une très bonne affaire!

(20 semble assez pénible pour une application qui ne s'exécute que sur un serveur à la fois ... mais multipliez ce serveur par des clusters (x2), des tests / de la staging / des prod (x3), des internes / externes (x2) et des sites principaux / backup site (x2) et vous y montez assez rapidement)

Bill K
la source
Pourquoi ne pas faire des images?
Dmitry Kudriavtsev
Nous espérons. Nous sommes une petite équipe qui essaie d'ajouter des fonctionnalités à un système assez utilisé / important et qui ne contrôlent pas suffisamment les serveurs pour dicter leur déploiement. Cependant, nous pourrions déjà l’utiliser pour les développeurs, nous sommes déjà assez limités en 32 Mo de RAM - je suppose que courir à partir d’une image de menu fixe aura des frais généraux ... mais notre plan est de progresser dans cette direction.
Bill K
Je voulais dire pour les postes de travail
Dmitry Kudriavtsev
Temps et mémoire - nous devons déjà laisser des morceaux sur nos postes de travail de 32 Go (les serveurs de 64 Go fonctionnent parfaitement). Nous avons cependant un peu expérimenté et nous pourrons l'essayer la prochaine fois que nous aurons besoin de construire un nouveau poste de travail dev.
Bill K
8

Cette question serait également pertinente pour golang, où vous pouvez simplement extraire des binaires liés statiquement et les exécuter quelque part, contrairement à Python ou C ++ où vous avez généralement un grand nombre de bibliothèques liées, ce qui incite les utilisateurs à créer un conteneur docker à partir du environnement de développement.

Il y a deux points à répondre ici:

Un: il doit y avoir un meilleur moyen , et il y a: vous pouvez construire des conteneurs de docker plus petits (et plus efficaces) en utilisant uniquement l'environnement d'installation, ce qui offre des avantages similaires à ceux de Golang avec environnement par rapport à Golang -binaires conteneurs. Dans le cas de Java, vous pouvez créer un gros fichier jar ou une application installable contenant tous les fichiers jar de la bibliothèque et un script shell. dans le cas de Python, vous pouvez utiliser auditwheel pour créer des roues autonomes indépendantes de l'environnement de construction (et vous pouvez utiliser C ++ avec des liens statiques produisant presque le même effet).

Deux: pour quoi avez-vous besoin de docker? En Java, vous pouvez faire beaucoup de séparation entre différents composants en utilisant des chargeurs de classes, mais l’essentiel est ce qui est autour de l’application Java. Aucune application Java ne s'exécute par elle-même - si elle ne s'exécute pas dans le menu fixe, elle devrait généralement être supervisée par supervisord, systemd ou autres. Entrez dans le nuage Kubernetes, Marathon ou Docker, qui utilise l'abstraction de conteneur pour virtualiser non pas l'hôte lui-même, mais virtualise l'ensemble du réseau de sorte que vous ne puissiez déployer que des conteneurs et qu'ils s'exécutent sur un hôte aléatoire.

Les microservices fonctionnent généralement sur des nuages ​​basés sur un menu fixe, car ils vous permettent de traiter vos hôtes du menu fixe comme du bétail, et non comme des animaux domestiques, et de la même manière avec les applications dockerisées. Bien sûr, cette abstraction présente des fuites dès que vous montez des volumes d’hôte sur le menu fixe et que vous devez exécuter des conteneurs de menu fixe sur l’hôte qui possède ces volumes. Certaines personnes parviennent même à éviter cela.

Yannick
la source
5

C'est une très bonne question, mais après avoir travaillé avec Docker, je la renversais:

Les avantages de la machine virtuelle Java sont-ils annulés par la conteneurisation (par exemple, Docker)?

Les conteneurs remettent vraiment en cause un grand nombre de mes hypothèses de développement découlant de mon expérience. Par exemple, si quelqu'un codait en dur un chemin d'accès à un fichier de ressources dans une application, de nombreux développeurs expérimentés sauraient que cela pose problème et vous devez le rendre configurable. Mais si vous ciblez un conteneur, est-ce vraiment le cas? Lorsque vous construisez le conteneur, vous lui indiquez quelles sont les structures de répertoires. Vous configurez le chemin là-bas. Alors devriez-vous le configurer deux fois? Quel est l'avantage? Si vous ne les faites pas correspondre, cela ne fonctionnera pas, alors ... SEC?

J'ai récemment créé un prototype d'application avec Java et Docker qui surveillait essentiellement les événements GC et lorsque la partie ancienne du segment de mémoire atteignait un pourcentage seuil, elle s'arrêtait d'elle-même. Docker (mode essaim) en créerait alors un nouveau. Pour l’essentiel, cela éliminait le besoin de cycles GC majeurs dans la JVM et permettait à docker de les gérer. Cela n'a pas fonctionné aussi bien que j'aurais pu l'espérer (les clients ont constaté l'impact de la fermeture), mais il était suffisamment fonctionnel pour faire une démonstration en direct devant un public.

Vous devriez vraiment juste essayer des conteneurs si vous êtes curieux. C'est vraiment une technologie perturbatrice et vous devrez vous y attaquer. Docker est un excellent endroit pour commencer, mais il existe au moins une autre alternative viable qui convient à tout le monde, l’OMI.

JimmyJames
la source
"... mais il y a au moins une autre alternative viable qui convient à tout le monde" Alors, quelle pourrait être cette alternative viable?
Trilarion
@Trilarion Rkt (ou fusée) . Il est actuellement supporté par Kubernetes avec Docker.
JimmyJames