Question Devrais-je utiliser Vagrant ou Docker pour créer un environnement isolé? [fermé]


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 à cet effet. Quels sont les avantages et les inconvénients, ou comment ces solutions se comparent-elles?


1886
2018-05-20 10:05


origine


Réponses:


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 scripter la configuration de la machine virtuelle ainsi que le provisioning. Cependant, il s'agit toujours d'une machine virtuelle en fonction de VirtualBox (ou autres) avec un énorme frais généraux. Cela nécessite d'avoir un fichier de disque dur qui peut être énorme, il faut beaucoup de RAM, et les performances peuvent ne pas être très bonnes.

D'autre part, Docker utilise le noyau cgroup et namespacing via LXC. Cela signifie que vous utilisez le même noyau que l'hôte et le même système de fichiers. Vous pouvez utiliser Dockerfile avec docker build commande afin de gérer l'approvisionnement et la configuration de votre conteneur. Vous avez un exemple à docs.docker.com sur comment faire votre Dockerfile; c'est très intuitif.

La seule raison pour laquelle vous pourriez vouloir utiliser Vagrant est si vous avez besoin de faire BSD, Windows ou un autre développement non Linux sur votre boîte Ubuntu. Sinon, optez pour Docker.


1042
2018-05-26 16:46



Disclaimer: J'ai écrit Vagrant! Mais parce que j'ai écrit Vagrant, je passe la plus grande partie de mon temps à vivre dans le monde de DevOps qui comprend des logiciels comme Docker. Je travaille avec de nombreuses entreprises utilisant Vagrant et beaucoup utilisent Docker, et je vois comment les deux interagissent.

Avant de parler trop, une réponse directe: dans votre scénario spécifique (vous travaillez seul, travaillez sur Linux, utilisez Docker en production), vous pouvez vous en tenir à Docker seul et simplifier les choses. Dans beaucoup d'autres scénarios (j'en discute plus loin), ce n'est pas si facile.

Il n'est pas correct de comparer directement Vagrant à Docker. Dans certains cas, ils se chevauchent, et dans la grande majorité, ils ne le font pas. En fait, la comparaison la plus pertinente serait Vagrant par rapport à quelque chose comme Boot2Docker (système d'exploitation minimal qui peut exécuter Docker). Vagrant est un niveau au-dessus de Docker en termes d'abstractions, donc ce n'est pas une comparaison équitable 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. Au sein de ceux-ci, si vous utilisez des conteneurs, Vagrant ne s'en soucie pas et accepte cela: il peut automatiquement installer, extraire, construire et exécuter des conteneurs Docker, par exemple. Avec Vagrant 1.6, Vagrant a environnements de développement basés sur les dockerset prend en charge l'utilisation de Docker avec le même flux de travail que Vagrant sur Linux, Mac et Windows. Vagrant n'essaie pas de remplacer Docker ici, il embrasse les pratiques de Docker.

Docker gère spécifiquement les conteneurs Docker. Si vous comparez directement à Vagrant: il s'agit spécifiquement d'une solution plus spécifique (ne peut exécuter que 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 aucune comparaison avec Vagrant! Vagrant ne vit pas dans ces environnements, et donc Docker devrait être utilisé.

Si votre organisation n'utilise que des conteneurs Docker pour tous ses projets et que seuls des développeurs fonctionnent sous Linux, alors Docker pourrait certainement travailler pour vous!

Sinon, je ne vois pas d'intérêt à essayer d'utiliser Docker seul, puisque vous perdez beaucoup de ce que Vagrant a à offrir, ce qui présente de réels avantages commerciaux / de 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 n'importe lequel d'entre eux afin que vous puissiez les utiliser à cette fin.

  • Vagrant est un flux de travail unique pour tous vos projets. Ou, pour le dire autrement, ce n'est qu'une chose que les gens doivent apprendre à exécuter un projet, que ce soit dans un conteneur Docker ou non. Si, par exemple, à l'avenir, un concurrent surgit pour concurrencer directement Docker, Vagrant sera capable de le faire aussi.

  • Vagrant fonctionne sur Windows (retour à XP), Mac (retour à 10.5) et Linux (retour au noyau 2.6). Dans les trois cas, le flux de travail 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 choses avancées ou non comme la mise en réseau et la synchronisation de 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 fournit plusieurs mécanismes pour obtenir votre local fichiers vers 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 il faudrait réinventer Vagrant dans ce cas.

  • Vagrant 1.6 a un support de première classe pour environnements de développement basés sur les dockers. Cela ne lancera pas une machine virtuelle sous Linux et lancera automatiquement une machine virtuelle sur Mac et Windows. Le résultat final est que travailler avec Docker est uniforme sur toutes les plateformes, tandis que Vagrant gère toujours les détails fastidieux de choses telles que la mise en réseau, les dossiers synchronisés, etc.

Pour traiter des contre-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, ça peut l'être, si vous utilisez exclusivement Docker pour chaque projet. Même alors, il sacrifie la flexibilité pour le verrouillage Docker. Si jamais vous décidez de ne pas utiliser Docker pour un projet passé, présent ou futur, alors vous aurez plus de pièces mobiles. Si vous aviez utilisé Vagrant, vous avez cette partie mobile qui supporte le reste.

  • "C'est plus rapide!" - Une fois que vous avez l'hôte qui peut exécuter des conteneurs Linux, Docker est certainement plus rapide à l'exécution d'un conteneur que n'importe quelle machine virtuelle à lancer. Mais le lancement d'une machine virtuelle (ou d'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 machine virtuelle. C'est une optimisation étrange pour les environnements de développement. Dans la production, où Docker brille vraiment, je comprends la nécessité de faire tourner rapidement les conteneurs.

J'espère maintenant qu'il est clair de voir qu'il est très difficile, et je ne crois pas correct, de comparer Docker à Vagrant. Pour les environnements de dev, Vagrant est plus abstrait, plus général. Docker (et les différentes façons de le faire se comporter comme Vagrant) est un cas d'utilisation spécifique de Vagrant, ignorant tout ce que Vagrant a à 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 d'utilisation, ce n'est pas le cas. Vagrant ne gêne pas votre utilisation de Docker; il fait ce qu'il peut 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 un but de Vagrant est de travailler aussi bien avec n'importe quel système.

Espérons que cela arrange les choses!


2172
2018-01-23 16:55



Je suis l'auteur de Docker.

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

Vagrant est un outil de gestion de machines virtuelles. Docker est un outil pour construire et déployer des applications en les emballant 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 répétable. Cela rend très facile la création de votre application une seule fois et son déploiement partout - sur votre ordinateur portable pour les tests, puis sur différents serveurs pour le déploiement en direct, etc.

C'est une idée fausse commune que vous pouvez seulement utiliser Docker sur Linux. C'est incorrect vous pouvez également installer Docker sur Mac, et la prise en charge de Windows est en cours. Lorsqu'il est installé sur Mac, Docker regroupe une minuscule machine virtuelle Linux (25 Mo sur le disque!) Qui agit comme un wrapper pour votre conteneur. Une fois installé, ceci 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 en utilisant des conteneurs, qui sont 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 à vous soucier des détails de la gestion des machines virtuelles, qui ne sont qu'un moyen de toute façon.

En théorie, il est possible d'utiliser Vagrant comme couche d'abstraction pour Docker. Je recommande contre cela pour deux raisons:

  • Premièrement, Vagrant n'est pas une bonne abstraction pour Docker. Vagrant a été conçu pour gérer les machines virtuelles. Docker a été conçu pour gérer une exécution d'application. Cela signifie que Docker, 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 flux de journalisation, des variables d'environnement et des liens réseau entre composants. Les primitives de Vagrant sont des machines, des périphériques de blocs et des clés ssh. Vagrant se trouve simplement plus bas dans la pile, et le seul moyen d'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 "vagabonder" avec un plugin Docker et quelque chose de joli va se passer. Est-ce un substitut à toute l'étendue de ce que Docker peut faire? Essayez Docker natif pour quelques jours et voyez par vous-même :)

  • Deuxièmement, l'argument de verrouillage. "Si vous utilisez Vagrant comme une abstraction, vous ne serez pas enfermé dans Docker!". Du point de vue de Vagrant, qui est conçu pour gérer les 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 verrouillage - mieux vaut tout extraire avec Vagrant. Sauf que cela manque complètement le point de Docker. Docker ne fournit pas de machines; il enveloppe votre application dans un environnement d'exécution portable léger qui peut être supprimé n'importe où.

Quelle durée d'exécution vous choisissez pour votre application n'a rien à voir avec la façon dont vous provisionnez vos machines! Par exemple, il est assez fréquent de déployer des applications sur des machines provisionnées par quelqu'un d'autre (par exemple une instance EC2 déployée par votre administrateur système, peut-être en utilisant Vagrant) ou sur des machines nues que Vagrant ne peut pas provisionner. Inversement, vous pouvez utiliser Vagrant pour provisionner des machines qui n'ont rien à voir avec le développement de votre application - par exemple une boîte Windows IIS prête à l'emploi ou quelque chose comme ça. Ou vous pouvez utiliser Vagrant pour provisionner des machines pour des projets qui n'utilisent pas Docker - peut-être qu'ils utilisent une combinaison de rubygems et de rvm pour la gestion des dépendances et le sandboxing par exemple.

En résumé: Vagrant est pour la gestion des machines, et Docker est pour la construction et l'exécution des environnements applicatifs.


1281
2018-03-13 06:16



Je donne la préface à ma réponse en admettant que je n'ai aucune expérience avec Docker, sauf en tant qu'observateur avide de ce qui semble être une solution vraiment intéressante qui gagne beaucoup de traction.

J'ai une quantité décente d'expérience avec Vagrant et je peux le recommander fortement. 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, CPU i5 / i7) n'a aucun problème à exécuter une VM en utilisant Vagrant / VirtualBox aux côtés de l'outillage de développement.

L'une des choses vraiment géniales avec Vagrant est l'intégration avec Fantoche/Chef/ shell scripts 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 aussi proche de l'identique que vous le souhaitez, et c'est exactement ce que vous voulez.

L'autre grande chose avec Vagrant est que vous pouvez version votre Vagrantfile avec votre code d'application. Cela signifie que tous les membres de votre équipe peuvent partager ce fichier et que vous avez la garantie que tout le monde travaille avec la même configuration d'environnement.

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


72
2018-06-25 21:33



Ils sont très complémentaires.

J'ai utilisé une combinaison de VirtualBox, Vagrant et Docker pour tous mes projets pendant plusieurs mois et j'ai fortement ressenti les avantages suivants.

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

Voici un fichier vagabond 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 le 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 à ceci

#!/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 en solo de Chef non docker serait considérablement plus compliquée.

Un gros avantage final est obtenu lorsque vous passez en production, la traduction de l'environnement de développement vers une infrastructure d'hôtes qui sont tous les mêmes en ce sens qu'ils ont juste assez de config pour exécuter docker signifie vraiment 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 à

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


51
2017-08-20 20:42



Vagabond-lxc est un plugin pour Vagrant qui vous permet d'utiliser LXC pour provisionner Vagrant. Il ne possède pas toutes les fonctionnalités de la VM vagabonde par défaut (VirtualBox) mais il devrait vous offrir plus de flexibilité que les conteneurs docker. Il y a une vidéo dans le lien montrant ses capacités qui vaut la peine d'être regardée.


47
2017-08-01 18:44



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

Veuillez noter que vous pouvez également utiliser Docker pour le provisionnement avec Vagrant. C'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 Fantoche avec Docker. Vous pouvez utiliser des combinaisons comme Docker en tant que fournisseur (VM) avec Chef en tant que fournisseur. Ou vous pouvez utiliser VirtualBox en tant que fournisseur et Docker en tant que fournisseur.


41
2018-05-30 16:10



L'utilisation des deux est une partie importante des tests de livraison d'application. Je commence seulement à m'impliquer avec Docker et à penser très sérieusement à une équipe d'application qui a une complexité terrible dans la construction et la livraison de ses logiciels. Pensez à une situation classique de projet Phoenix / livraison continue.

La pensée va quelque chose comme ceci:

  • Prendre un composant d'application Java / Go et le créer en tant que conteneur (notez, pas sûr si l'application devrait être construite dans le récipient ou construite alors installé sur le conteneur)
  • Livrer le conteneur à une machine virtuelle Vagrant.
  • Répétez ceci pour tous les composants de l'application.
  • Itérer sur le (s) composant (s) à coder.
  • Testez en continu le mécanisme de livraison sur la (les) machine (s) virtuelle (s) gérée (s) par Vagrant
  • Dormez bien en sachant quand il est temps de déployer le conteneur, que les tests d'intégration se déroulaient de façon beaucoup plus continue qu'avant Docker.

Cela semble être le prolongement logique de la déclaration de Mitchell selon laquelle Vagrant est pour le développement combiné à la pensée de Farley / Humbles dans Continuous Delivery. 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 impressionnantes que Docker aura pour le déploiement de l'application.


11
2018-06-20 00:56



Il y a un article très informatif 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 de CD et DevOps   initiatives. Si votre but est l'isolement, Docker est un excellent choix.   Vagrant est un gestionnaire de VM qui vous permet d'écrire des configurations de   VM individuels ainsi que faire le provisionnement. Cependant, il est encore un   VM dépendant de VirtualBox (ou d'un autre gestionnaire VM) avec relativement   gros frais généraux. Il vous oblige à avoir un disque dur inactif qui peut être   énorme, il faut beaucoup de RAM, et la performance peut être sous-optimale. Docker   utilise les noyaux cgroups et l'isolation de l'espace de noms via LXC. Cela signifie que   vous utilisez le même noyau que l'hôte et le même système.   Vagrant est un niveau au-dessus de Docker en termes d'abstraction, donc ils sont   pas vraiment comparable. Les outils de gestion de configuration tels que Puppet sont   largement utilisé pour l'approvisionnement des environnements cibles. Réutiliser existant   Les solutions basées sur les marionnettes sont faciles avec Docker. Vous pouvez également découper votre   solution, de sorte que l'infrastructure est provisionnée avec Puppet; la   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 de   outils, vous pouvez faire ce qu'il y a de mieux pour votre scénario.

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


5
2017-08-20 13:04



Certainement Docker pour la victoire!

Comme vous le savez peut-être, Vagrant est destiné à la gestion de machines virtuelles tandis que Docker est destiné à la gestion de conteneurs de logiciels. Si vous n'êtes pas conscient de la différence, voici: Un conteneur de logiciel peut partager la même machine et le même noyau avec d'autres conteneurs de logiciels. En utilisant des conteneurs vous économisez de l'argent parce que vous ne gaspillez pas de ressources sur plusieurs systèmes d'exploitation (noyaux), vous pouvez empaqueter plus de logiciel par serveur en gardant un bon degré d'isolation.

Bien sûr, est une nouvelle discipline à prendre soin de ses propres pièges et défis.

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


5
2018-03-24 14:40