Dois-je utiliser Vagrant ou Docker pour créer un environnement isolé?

J’utilise Ubuntu pour le développement et le déploiement et j’ai besoin de créer un environnement isolé.

Je considère soit Vagrant ou Docker à cette fin. Quels sont les avantages et les inconvénients, ou comment ces solutions se comparent-elles?

    Si votre but est l’isolement, je pense que Docker est ce que vous voulez.

    Vagrant est un gestionnaire de machine virtuelle. Il vous permet de programmer la configuration de la machine virtuelle ainsi que le provisionnement. Cependant, il s’agit toujours d’une machine virtuelle dépendant de VirtualBox (ou d’autres) avec une surcharge énorme. Cela nécessite que vous ayez un fichier de disque dur qui peut être énorme, il faut beaucoup de RAM, et les performances peuvent ne pas être très bonnes.

    Docker utilise quant à lui le cgroup du kernel et l’espace de noms via LXC . Cela signifie que vous utilisez le même kernel que l’hôte et le même système de fichiers. Vous pouvez utiliser Dockerfile avec la commande docker build pour gérer l’approvisionnement et la configuration de votre conteneur. Vous avez un exemple à docs.docker.com sur la façon de créer votre fichier Docker; c’est très intuitif.

    La seule raison pour laquelle vous pourriez vouloir utiliser Vagrant, c’est si vous devez effectuer un développement BSD, Windows ou autre non-Linux sur votre box Ubuntu. Sinon, optez pour Docker.

    Disclaimer: J’ai écrit Vagrant! Mais comme j’ai écrit Vagrant, je passe le plus clair de mon temps dans le monde DevOps, qui comprend des logiciels comme Docker. Je travaille avec beaucoup d’entresockets en utilisant Vagrant et beaucoup utilisent Docker, et je vois comment les deux interagissent.

    Avant de trop parler, une réponse directe: dans votre scénario spécifique (vous-même travaillant seul, travaillant sous Linux, en utilisant Docker en production), vous pouvez restr seul avec Docker et simplifier les choses. Dans beaucoup d’autres scénarios (je discuterai plus loin), ce n’est pas si facile.

    Il n’est pas correct de comparer directement Vagrant à Docker. Dans certains scénarios, ils se chevauchent et, dans la grande majorité des cas, ils ne le font pas. En fait, la comparaison la plus appropriée serait Vagrant contre quelque chose comme Boot2Docker (système d’exploitation minimal capable d’exécuter Docker). Le vagrant est un niveau au-dessus de Docker en termes d’abstractions, donc ce n’est pas une comparaison juste dans la plupart des cas.

    Vagrant lance des choses pour exécuter des applications / services à des fins de développement. Cela peut être sur VirtualBox, VMware. Il peut être distant comme AWS, OpenStack. Parmi ceux-ci, si vous utilisez des conteneurs, Vagrant s’en moque et les accepte: il peut par exemple installer, déployer, générer et exécuter automatiquement des conteneurs Docker. Avec Vagrant 1.6, Vagrant propose des environnements de développement basés sur les dockers et prend en charge l’utilisation de Docker avec le même stream de travail que Vagrant sur Linux, Mac et Windows. Vagrant n’essaie pas de remplacer Docker ici, il emarmse les pratiques de Docker.

    Docker gère spécifiquement les conteneurs Docker. Si vous comparez directement à Vagrant: c’est une solution plus spécifique (peut uniquement exécuter des conteneurs Docker), moins flexible (nécessite un hôte Linux ou Linux quelque part). Bien sûr, si vous parlez de production ou de CI, il n’y a pas de comparaison avec Vagrant! Vagrant ne vit pas dans ces environnements et Docker devrait donc être utilisé.

    Si votre organisation ne gère que des conteneurs Docker pour tous leurs projets et que seuls des développeurs fonctionnent sous Linux, Docker pourrait certainement fonctionner pour vous!

    Sinon, je ne vois aucun avantage à utiliser Docker seul, car vous perdez beaucoup de ce que Vagrant a à offrir, ce qui présente de réels avantages pour votre entreprise / votre productivité:

    • Vagrant peut lancer des machines VirtualBox, VMware, AWS, OpenStack, etc. Peu importe ce dont vous avez besoin, Vagrant peut le lancer. Si vous utilisez Docker, Vagrant peut installer Docker sur l’un de ces fichiers afin de pouvoir les utiliser à cette fin.

    • Vagrant est un workflow unique pour tous vos projets. Autrement dit, les gens doivent apprendre à exécuter un projet, que ce soit dans un conteneur Docker ou non. Si, par exemple, à l’avenir, un concurrent devait concurrencer directement Docker, Vagrant serait en mesure de le faire aussi.

    • Vagrant fonctionne sous Windows (retour à XP), Mac (retour à 10.5) et Linux (retour au kernel 2.6). Dans les trois cas, le workflow est le même. Si vous utilisez Docker, Vagrant peut lancer une machine (VM ou distante) capable d’exécuter Docker sur ces trois systèmes.

    • Vagrant sait comment configurer certaines fonctions avancées ou non, telles que la mise en réseau et la synchronisation des dossiers. Par exemple: Vagrant sait comment attacher une adresse IP statique à une machine ou transférer des ports, et la configuration est la même quel que soit le système utilisé (VirtualBox, VMware, etc.) Pour les dossiers synchronisés, Vagrant propose plusieurs mécanismes fichiers sur la machine distante (dossiers partagés VirtualBox, NFS, rsync, Samba [plugin], etc.). Si vous utilisez Docker, même Docker avec une VM sans Vagrant, vous devrez le faire manuellement ou ils devront réinventer Vagrant dans ce cas.

    • Vagrant 1.6 prend en charge les environnements de développement basés sur les dockers . Cela ne lancera pas de machine virtuelle sous Linux et lancera automatiquement une machine virtuelle sur Mac et Windows. Le résultat final est que le travail avec Docker est uniforme sur toutes les plates-formes, tandis que Vagrant gère toujours les détails fastidieux tels que la mise en réseau, les dossiers synchronisés, etc.

    Pour répondre aux arguments spécifiques que j’ai entendus en faveur de l’utilisation de Docker au lieu de Vagrant:

    • “C’est moins de pièces mobiles” – Oui, cela peut être le cas si vous utilisez Docker exclusivement pour chaque projet. Même dans ce cas, il sacrifie la flexibilité pour le locking Docker. Si vous décidez de ne pas utiliser Docker pour un projet, passé, présent ou futur, vous aurez plus de pièces mobiles. Si vous aviez utilisé Vagrant, vous avez cette partie mobile qui prend en charge le rest.

    • “C’est plus rapide!” – Une fois l’hôte capable d’exécuter des conteneurs Linux, Docker est nettement plus rapide à exécuter un conteneur que n’importe quelle machine virtuelle à lancer. Mais lancer une machine virtuelle (ou une machine distante) est un coût ponctuel. Au cours de la journée, la plupart des utilisateurs de Vagrant ne détruisent jamais leur VM. C’est une optimisation étrange pour les environnements de développement. En production, où Docker brille vraiment, je comprends le besoin de faire tourner rapidement les conteneurs.

    J’espère maintenant qu’il est clair qu’il est très difficile, et je crois que ce n’est pas correct, de comparer Docker à Vagrant. Pour les environnements de développement, Vagrant est plus abstrait, plus général. Docker (et les différentes manières de le faire se comporter comme Vagrant) est un cas d’utilisation spécifique de Vagrant, ignorant tout ce que Vagrant peut offrir.

    En conclusion: dans des cas d’utilisation très spécifiques, Docker est certainement un remplacement possible de Vagrant. Dans la plupart des cas, ce n’est pas le cas. Le vagrant ne gêne pas votre utilisation de Docker; en fait, il fait tout ce qui est en son pouvoir pour rendre cette expérience plus fluide. Si vous trouvez que ce n’est pas vrai, je suis heureux de prendre des suggestions pour améliorer les choses, car l’un des objectives de Vagrant est de fonctionner de manière égale avec n’importe quel système.

    Espérons que cela arrange les choses!

    Je suis l’auteur de Docker.

    La réponse courte est que si vous voulez gérer des machines, vous devez utiliser Vagrant. Et si vous souhaitez créer et exécuter des environnements d’application, vous devez utiliser Docker.

    Vagrant est un outil de gestion de machines virtuelles. Docker est un outil permettant de créer et de déployer des applications en les conditionnant dans des conteneurs légers. Un conteneur peut contenir à peu près n’importe quel composant logiciel avec ses dépendances (exécutables, bibliothèques, fichiers de configuration, etc.) et l’exécuter dans un environnement d’exécution garanti et reproductible. Il est donc très facile de créer votre application une seule fois et de la déployer n’importe où – sur votre ordinateur portable pour les tester, puis sur différents serveurs pour un déploiement en direct, etc.

    Il est courant de penser que vous ne pouvez utiliser Docker que sous Linux. C’est incorrect vous pouvez également installer Docker sur Mac, et le support Windows est en cours. Lorsqu’il est installé sur Mac, Docker intègre une petite machine virtuelle Linux (25 Mo sur le disque!) Qui sert de wrapper à votre conteneur. Une fois installé, c’est complètement transparent. vous pouvez utiliser la ligne de commande Docker exactement de la même manière. Cela vous donne le meilleur des deux mondes: vous pouvez tester et développer votre application à l’aide de conteneurs très légers, faciles à tester et faciles à déplacer (voir par exemple https://hub.docker.com pour partager des conteneurs réutilisables avec la communauté Docker), et vous n’avez pas besoin de vous soucier des détails les plus difficiles de la gestion des machines virtuelles, qui ne sont qu’un moyen de parvenir à une fin.

    En théorie, il est possible d’utiliser Vagrant comme couche d’abstraction pour Docker. Je le déconseille pour deux raisons:

    • Tout d’abord, Vagrant n’est pas une bonne abstraction pour Docker. Vagrant a été conçu pour gérer des machines virtuelles. Docker a été conçu pour gérer un environnement d’exécution d’application. Cela signifie que Docker, de par sa conception, peut interagir avec une application de manière plus riche et dispose de plus d’informations sur l’exécution de l’application. Les primitives dans Docker sont des processus, des stream de journal, des variables d’environnement et des liens réseau entre les composants. Les primitives dans Vagrant sont des machines, des périphériques de bloc et des clés ssh. Vagrant se trouve simplement plus bas dans la stack, et la seule façon dont il peut interagir avec un conteneur est de prétendre que c’est juste un autre type de machine, que vous pouvez “démarrer” et “vous connecter”. Donc, bien sûr, vous pouvez taper “vagrant” avec un plugin Docker et quelque chose de bien va se passer. Est-ce un substitut à toute la gamme de ce que Docker peut faire? Essayez Docker pendant quelques jours et voyez par vous-même 🙂

    • Deuxièmement, l’argument de locking. “Si vous utilisez Vagrant comme une abstraction, vous ne serez pas enfermé dans Docker!”. Du sharepoint vue de Vagrant, conçu pour gérer des machines, cela est parfaitement logique: les conteneurs ne sont-ils pas un autre type de machine? Tout comme Amazon EC2 et VMware, nous devons veiller à ne pas lier nos outils de provisioning à un fournisseur particulier! Cela créerait un blocage – mieux vaut tout résumer avec Vagrant. Sauf que cela manque complètement le sharepoint Docker. Docker ne fournit pas de machines; il enveloppe votre application dans un environnement d’exécution portable léger qui peut être déposé n’importe où.

    Le temps d’exécution que vous choisissez pour votre application n’a rien à voir avec la façon dont vous configurez vos machines! Par exemple, il est assez fréquent de déployer des applications sur des machines provisionnées par une autre personne (par exemple une instance EC2 déployée par votre administrateur système, peut-être en utilisant Vagrant), ou de mettre à niveau des machines que Vagrant ne peut pas fournir du tout. À l’inverse, vous pouvez utiliser Vagrant pour mettre à disposition des machines qui n’ont rien à voir avec le développement de votre application, par exemple un boîtier Windows IIS prêt à l’emploi ou quelque chose du genre. Vous pouvez également utiliser Vagrant pour provisionner des machines pour des projets qui n’utilisent pas Docker. Peut-être utilisent-elles une combinaison de rubygems et de rvm pour la gestion des dépendances et le sandboxing, par exemple.

    En résumé: Vagrant est destiné à la gestion des machines et Docker est destiné à la création et à l’exécution des environnements d’application.

    En préambule à ma réponse, en admettant que je n’ai aucune expérience avec Docker, sauf en tant qu’observateur assidu de ce qui semble être une solution vraiment intéressante qui gagne en popularité.

    J’ai une bonne expérience avec Vagrant et je le recommande vivement. C’est certainement une solution plus lourde en termes de VM basée au lieu de LXC. Cependant, j’ai trouvé un ordinateur portable décent (8 Go de RAM, processeur i5 / i7) qui n’a aucune difficulté à exécuter une machine virtuelle en utilisant Vagrant / VirtualBox avec des outils de développement.

    L’une des grandes choses de Vagrant est l’intégration avec les scripts Puppet / Chef / shell pour automatiser la configuration. Si vous utilisez l’une de ces options pour configurer votre environnement de production, vous pouvez créer un environnement de développement qui soit aussi identique que possible, et c’est exactement ce que vous souhaitez.

    L’autre grande chose avec Vagrant est que vous pouvez mettre à jour votre fichier Vagrant avec votre code d’application. Cela signifie que tous les membres de votre équipe peuvent partager ce fichier et que vous êtes assuré que tout le monde travaille avec la même configuration d’environnement.

    Fait intéressant, Vagrant et Docker peuvent être complémentaires. Vagrant peut être étendu pour prendre en charge différents fournisseurs de virtualisation, et il est possible que Docker soit l’un de ces fournisseurs qui bénéficiera d’une assistance dans un avenir proche. Voir https://github.com/dotcloud/docker/issues/404 pour une discussion récente sur le sujet.

    Ils sont très complémentaires.

    J’utilise une combinaison de VirtualBox, Vagrant et Docker pour tous mes projets depuis plusieurs mois et j’ai fortement ressenti les avantages suivants.

    Dans Vagrant, vous pouvez supprimer complètement tout approvisionnement solo de Chef et tout ce dont vous avez besoin est de préparer une machine qui exécute un petit script shell unique qui installe docker. Cela signifie que mes fichiers Vagrant pour chaque projet sont presque identiques et très simples.

    Voici un fichier Vagrant typique

     # -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "mark2" config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box" [3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p| config.vm.network :forwarded_port, guest: p, host: p end config.vm.network :private_network, ip: "192.168.56.20" config.vm.synced_folder ".", "/vagrant", :type => "nfs" config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] vb.customize ["modifyvm", :id, "--cpus", "2"] end # Bootstrap to Docker config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true # Build docker containers config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true # Start containers # config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true end 

    Le fichier Bootstrap qui installe Docker ressemble à ceci

     #!/usr/bin/env bash echo 'vagrant ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers apt-get update -y apt-get install htop -y apt-get install linux-image-extra-`uname -r` -y apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list apt-get update -y apt-get install lxc-docker -y apt-get install curl -y 

    Maintenant, pour obtenir tous les services dont j’ai besoin, j’ai un script docker_start qui ressemble à ça

     #!/bin/bash cd /vagrant echo Starting required service containers export HOST_NAME=192.168.56.20 # Start MongoDB docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb read -t5 -n1 -r -p "Waiting for mongodb to start..." key # Start rabbitmq docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key # Start cache docker run --name=memcached --detach=true --publish=11211:11211 ehazlett/memcached read -t5 -n1 -r -p "Waiting for cache to start..." key # Start elasticsearch docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key echo "All services started" 

    Dans cet exemple, je cours MongoDB, Elastisearch, RabbitMQ et Memcached

    Une configuration solo de chef non docker serait considérablement plus compliquée.

    Un grand avantage final est obtenu lorsque vous passez à la production, la conversion de l’environnement de développement en une infrastructure d’hôtes identiques en ce sens qu’ils ont juste assez de configuration pour exécuter docker, cela signifie très peu de travail.

    Si vous êtes intéressé, j’ai un article plus détaillé sur l’environnement de développement sur mon propre site Web à l’adresse:

    Implémentation d’un environnement de développement Vagrant / Docker

    Vagrant-lxc est un plug-in pour Vagrant qui vous permet d’utiliser LXC pour provisionner Vagrant. Il ne possède pas toutes les fonctionnalités de la VM errant par défaut (VirtualBox), mais il devrait vous donner plus de flexibilité que les conteneurs Docker. Il y a une vidéo dans le lien montrant ses capacités qui mérite d’être regardée.

    Avec Vagrant, vous pouvez désormais avoir Docker comme fournisseur. http://docs.vagrantup.com/v2/docker/ . Le fournisseur Docker peut être utilisé à la place de VirtualBox ou de VMware.

    Veuillez noter que vous pouvez également utiliser Docker pour l’approvisionnement avec Vagrant. Ceci est très différent de l’utilisation de Docker en tant que fournisseur. http://docs.vagrantup.com/v2/provisioning/docker.html

    Cela signifie que vous pouvez remplacer Chef ou Marionnette avec Docker. Vous pouvez utiliser des combinaisons telles que Docker en tant que fournisseur (VM) avec Chef en tant que provisioner. Ou vous pouvez utiliser VirtualBox en tant que fournisseur et Docker en tant que provisioner.

    L’utilisation des deux est une partie importante des tests de livraison d’applications. Je commence seulement à m’impliquer avec Docker et à réfléchir très sérieusement à une équipe d’applications qui a une complexité énorme dans la création et la livraison de ses logiciels. Pensez à une situation classique de Phoenix Project / Continuous Delivery.

    La pensée va quelque chose comme ceci:

    • Prenez un composant d’application Java / Go et générez-le en tant que conteneur (notez que vous ne savez pas si l’application doit être intégrée dans le conteneur ou créée, puis installée dans le conteneur)
    • Livrer le conteneur à une machine virtuelle vagrante.
    • Répétez cette opération pour tous les composants de l’application.
    • Itérer sur le ou les composants à coder.
    • Tester en continu le mécanisme de livraison vers la ou les VM gérées par Vagrant
    • Dormez bien en sachant qu’il est temps de déployer le conteneur, que les tests d’intégration se sont déroulés sur une base beaucoup plus continue qu’avant Docker.

    Cela semble être le prolongement logique de l’affirmation de Mitchell selon laquelle Vagrant est destiné au développement, et Farley / Humbles pense à la livraison continue. Si, en tant que développeur, je peux réduire la boucle de rétroaction sur les tests d’intégration et la livraison des applications, des environnements de travail de meilleure qualité et de meilleure qualité suivront.

    Le fait que, en tant que développeur, je livre constamment et de manière cohérente des conteneurs à la machine virtuelle et que je teste l’application de manière plus holistique, les versions de production seront encore simplifiées.

    Donc, je vois Vagrant évoluer comme un moyen de tirer parti de certaines des conséquences incroyables que Docker aura sur le déploiement d’applications.

    Il existe un article très instructif dans le magazine Oracle Java sur l’utilisation de Docker en combinaison avec Vagrant (et Puppet):

    Conclusion

    Les conteneurs légers de Docker sont plus rapides que les VM classiques et sont devenus populaires parmi les développeurs et dans le cadre des initiatives CD et DevOps. Si votre objective est l’isolement, Docker est un excellent choix. Vagrant est un gestionnaire de machines virtuelles qui vous permet de créer des scripts de configurations de machines virtuelles individuelles ainsi que de procéder au provisionnement. Cependant, une VM dépend de VirtualBox (ou d’un autre gestionnaire de machines virtuelles) avec une charge relativement importante. Il vous faut un disque dur inactif qui peut être énorme, qui nécessite beaucoup de mémoire vive et dont les performances peuvent être sous-optimales. Docker utilise les groupes de contrôle du kernel et l’isolation des espaces de noms via LXC. Cela signifie que vous utilisez le même kernel que l’hôte et le même système ile. Vagant est un niveau supérieur à Docker en termes d’abstraction, donc ils ne sont pas vraiment comparables. Les outils de gestion de la configuration tels que Puppet sont largement utilisés pour l’approvisionnement des environnements cibles. Réutiliser les solutions existantes basées sur les marionnettes est facile avec Docker. Vous pouvez également répartir votre solution en tranches afin que l’infrastructure soit dotée de Puppet; le middleware, l’application métier elle-même ou les deux sont provisionnés avec Docker; et Docker est enveloppé par Vagrant. Avec cette gamme d’outils, vous pouvez faire ce qu’il y a de mieux pour votre scénario.

    Comment créer, utiliser et orchestrer des conteneurs Docker dans DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0

    Certainement Docker pour la victoire!

    Comme vous le savez, Vagrant est destiné à la gestion de machines virtuelles, tandis que Docker est destiné à la gestion de conteneurs de logiciels. Si vous ne connaissez pas la différence, voici: Un conteneur de logiciels peut partager la même machine et le même kernel que d’autres conteneurs logiciels. En utilisant des conteneurs vous économisez de l’argent parce que vous ne gaspillez pas de ressources sur plusieurs systèmes d’exploitation (kernelx), vous pouvez emballer plus de logiciels par serveur en gardant un bon degré d’isolement.

    Bien sûr, une nouvelle discipline s’intéresse à ses propres pièges et défis.

    Optez pour Docker Swarm si vos besoins dépassent la limite des ressources de la machine unique.