Votre question a la chance d'obtenir les réponses des deux rédacteurs des deux services: Mitchell et Solomon Hykes
itsazzad
4
Je voudrais donner un nouveau résumé - la question est généralement fausse. La bonne question est: dois-je utiliser Vagrant ou docker-compose pour créer un environnement isolé? La réponse est que Vagrant et docker-compose effectuent la même tâche de description des environnements, et vous devriez plutôt comparer Docker à Virtualbox à la place. La différence est que Vagrant peut utiliser n'importe quelle virtualisation telle que Docker, VMWare, Virtualbox sur Windows, Linux ou OSX, mais docker-compose peut simplement utiliser des images Docker basées sur Linux.
PHZ.fi-Pharazon
Pour moi, la réponse est "Quelle est l'importance de la vitesse pour vous dans les activités professionnelles régulières". Je trouve que Vagrant est plus lent que Docker. Sur Docker, en particulier après un pull initial, l'approche du cache et des couches de Docker en fait le plus simple et le plus rapide pour moi en tant que développeur de l'utiliser
Michael Durrant
Réponses:
1155
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 l'approvisionnement. Cependant, il s'agit toujours d'une machine virtuelle dépendant de VirtualBox (ou d'autres) avec une énorme surcharge. Cela nécessite que vous ayez un fichier de disque dur qui peut être énorme, cela prend beaucoup de RAM et les performances peuvent ne pas être très bonnes.
Docker, quant à lui, utilise le noyau cgroup et 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 de fichiers. Vous pouvez utiliser Dockerfile avec la docker buildcommande afin de gérer l'approvisionnement et la configuration de votre conteneur. Vous avez un exemple sur docs.docker.com sur la façon de créer votre Dockerfile; c'est très intuitif.
La seule raison pour laquelle vous pourriez vouloir utiliser Vagrant est si vous devez faire du développement BSD, Windows ou autre non-Linux sur votre box Ubuntu. Sinon, optez pour Docker.
Pas encore, malheureusement. Si vous êtes dans un système 32 bits, vous aurez besoin d'une machine virtuelle avec un système invité 64 bits pour exécuter Docker. Cependant, avec go1.1, la prise en charge 32 bits s'améliore et il est possible que le docker
prenne
8
Cela est vrai pour Mac et Windows, mais depuis Docker 0.7, toute distribution Linux fonctionne correctement. Si vous en connaissez un qui ne fonctionne pas, faites-le moi savoir. De plus, à moins que vous n'ayez une pile Mac ou Windows (ce qui est peu probable mais peut se produire), vous ne voulez pas exécuter Docker ailleurs que sur Linux. Le client docker fonctionne très bien sur Mac, devrait bientôt fonctionner sur BSD et le démon supportera éventuellement BSD, Solaris et Mac.
vagrant a des provisionneurs LXC et docker. Cependant - Vagrant et docker sont des choses fondamentalement différentes. Vagrant est purement pour les environnements de développement, docker est plutôt pour la production et Linux uniquement.
Dannyboy
2
Docker fonctionne maintenant sur Windows 10 Pro et versions ultérieures et Windows Server 2016. Je viens de passer de Windows 10 Home à Windows 10 Pro et d'installer l'application Docker. Je peux maintenant exécuter des images de docker Linux sur Windows 10. C'est génial!
PrestonDocks
2339
Avertissement: j'ai écrit Vagrant! Mais parce que j'ai écrit Vagrant, je passe la plupart de mon temps à vivre dans le monde 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 travaillant seul, travaillant sur Linux, utilisant Docker en production), vous pouvez vous en tenir à Docker seul et simplifier les choses. Dans de nombreux autres scénarios (je discute 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é, ils ne le font pas. En fait, la comparaison la plus appropriée serait Vagrant contre quelque chose comme Boot2Docker (OS minimal pouvant exécuter Docker). Vagrant est un niveau supérieur à Docker en termes d'abstractions, ce n'est donc 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. Dans ceux-ci, si vous utilisez des conteneurs, Vagrant ne s'en soucie pas et l'adopte: il peut installer, tirer vers le bas, construire et exécuter automatiquement des conteneurs Docker, par exemple. Avec Vagrant 1.6, Vagrant dispose d' environnements de développement basés sur Docker et 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 Docker.
Docker exécute 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 Linux ou un hôte 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 doit donc être utilisé.
Si votre organisation exécute uniquement des conteneurs Docker pour tous ses projets et ne dispose que de développeurs fonctionnant sous Linux, alors d'accord, Docker pourrait certainement fonctionner pour vous!
Sinon, je ne vois aucun avantage à essayer d'utiliser Docker seul, car vous perdez beaucoup de ce que Vagrant a à offrir, ce qui présente de réels avantages commerciaux / 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 d'entre eux afin que vous puissiez les utiliser à cette fin.
Vagrant est un workflow unique pour tous vos projets. Ou, pour le dire autrement, c'est juste 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 se présente pour concurrencer directement Docker, Vagrant pourra également le gérer.
Vagrant fonctionne sur Windows (retour à XP), Mac (retour à 10.5) et Linux (retour au noyau 2.6). Dans les trois cas, le workflow est le même. Si vous utilisez Docker, Vagrant peut lancer une machine (VM ou distante) qui peut exécuter Docker sur ces trois systèmes.
Vagrant sait comment configurer certaines choses avancées ou non triviales comme la mise en réseau et la synchronisation de dossiers. Par exemple: Vagrant sait comment attacher une IP statique à une machine ou transférer des ports, et la configuration est la même quel que soit le système que vous utilisez (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 machine virtuelle sans Vagrant, vous devrez le faire manuellement ou ils devront réinventer Vagrant dans ce cas.
Vagrant 1.6 a un support de première classe pour 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 travailler 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 contre-arguments spécifiques que j'ai entendus en faveur de l'utilisation de Docker au lieu de Vagrant:
"Ce sont des pièces moins mobiles" - Oui, cela peut être le cas si vous utilisez Docker exclusivement pour chaque projet. Même dans ce cas, il sacrifie la flexibilité du verrouillage Docker. Si jamais 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 avez utilisé Vagrant, vous avez cette seule pièce mobile qui prend en charge le reste.
"C'est plus rapide!" - Une fois que vous avez l'hôte qui peut exécuter des conteneurs Linux, Docker est définitivement plus rapide à exécuter un conteneur que n'importe quelle machine virtuelle ne serait à lancer. Mais le lancement d'une machine virtuelle (ou d'une machine distante) est un coût unique. Au cours de la journée, la plupart des utilisateurs de Vagrant ne détruisent jamais réellement leur machine virtuelle. C'est une étrange optimisation pour les environnements de développement. En production, où Docker brille vraiment, je comprends la nécessité de faire tourner / monter rapidement les conteneurs.
J'espère maintenant qu'il est clair de voir qu'il est très difficile, et je ne crois pas, 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 le reste que Vagrant a à offrir.
En conclusion: dans des cas d'utilisation très spécifiques, Docker est certainement un remplaçant possible de Vagrant. Dans la plupart des cas d'utilisation, ce n'est pas le cas. Vagrant n'entrave pas votre utilisation de Docker; il fait en 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 objectif de Vagrant est de fonctionner aussi bien avec n'importe quel système.
@JaredMarkell Je pense qu'il cherche peut-être un service Web qui lui permet de gérer ses machines Vagrant, telles que Protobox .
Ryan Kennedy
73
@Mitchell Je voulais juste vous remercier d'avoir expliqué cela en détail. Évidemment, il est impossible pour vous d'être complètement objectif, donc j'apprécie que vous ayez pris le temps d'expliquer les nuances et les diverses situations où elles pourraient être utilisées. Je pense qu'une grande partie de la confusion autour d'une variété d'outils aujourd'hui est qu'ils se chevauchent beaucoup, et beaucoup de gens veulent une solution universelle où quelqu'un leur dit simplement quoi faire et peut la mettre en œuvre. La beauté de votre réponse est qu'elle répond à la question sous-jacente: comment créer un environnement isolé? (indépendamment des outils).
@ OğuzÇelikdemir Vagrant peut faire bien plus que cela. Bien sûr, si vous préparez une machine virtuelle spécifique pour chaque projet, cela durera. Mais pendant le développement, je finis souvent par ajouter plus de services / démons / paramètres (par exemple, lorsque je décide d'utiliser RabbitMQ pour un projet pendant le développement). L'approche purement VM vous obligera à préparer une nouvelle image, avec RabbitMQ installé et configuré, et à forcer les développeurs à changer leur VM pour cette nouvelle. Pour Vagrant - j'ajoute des lignes appropriées dans la configuration vagabonde et tous les développeurs peuvent facilement mettre à niveau leurs machines virtuelles (en utilisant vagrant provision).
Tomasz Struczyński
5
(Vous voulez dire "divulgation", révélant quelque chose d'important, pas "non-responsabilité", niant la responsabilité: english.stackexchange.com/q/115850 )
Jerry101
1418
Je suis l'auteur de Docker.
La réponse courte est que si vous souhaitez gérer des machines, vous devez 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 des machines virtuelles. Docker est un outil de création et de déploiement d'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 ainsi très facile de créer votre application une fois et de la déployer n'importe où - sur votre ordinateur portable pour les tests, puis sur différents serveurs pour un déploiement en direct, etc.
C'est une idée fausse commune que vous ne pouvez utiliser Docker que sur Linux. C'est incorrect; vous pouvez également installer Docker sur Mac et Windows. 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é, il 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, 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 moindres détails de la gestion des machines virtuelles, qui ne sont de toute façon qu'un moyen de parvenir à une fin.
En théorie, il est possible d'utiliser Vagrant comme couche d'abstraction pour Docker. Je déconseille cela pour deux raisons:
Tout d'abord, 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 un runtime 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 le runtime de l'application. Les primitives de Docker sont les processus, les flux de journaux, les variables d'environnement et les liaisons réseau entre les composants. Les primitives dans Vagrant sont les machines, les périphériques de bloc et les clés ssh. Vagrant se trouve simplement plus bas dans la pile, et la seule façon d'interagir avec un conteneur est de prétendre qu'il s'agit simplement d'un autre type de machine, que vous pouvez "démarrer" et "vous connecter". Donc, bien sûr, vous pouvez taper "vagrant up" avec un plugin Docker et quelque chose de joli se produira. Est-ce un substitut à toute l'étendue de ce que Docker peut faire? Essayez Docker natif pendant quelques jours et voyez par vous-même :)
Deuxièmement, l'argument de verrouillage. "Si vous utilisez Vagrant comme abstraction, vous ne serez pas enfermé dans Docker!". Du point de vue de Vagrant, qui est conçu pour gérer des machines, cela est parfaitement logique: les conteneurs ne sont-ils pas simplement un autre type de machine? Tout comme Amazon EC2 et VMware, nous devons faire attention à ne pas lier nos outils de provisioning à un fournisseur particulier! Cela créerait un verrouillage - mieux vaut tout résumer avec Vagrant. Sauf que cela manque complètement le point de Docker. Docker ne provisionne pas de machines; il enveloppe votre application dans un runtime 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 provisionnez vos machines! Par exemple, il est assez fréquent de déployer des applications sur des machines qui sont 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 bare metal que Vagrant ne peut pas provisionner du tout. 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 IIS Windows prête à l'emploi ou quelque chose. 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 rvm pour la gestion des dépendances et le sandboxing par exemple.
En résumé: Vagrant sert à gérer les machines et Docker à créer et exécuter des environnements d'application.
Je voulais juste noter que les aspects Vagrants de cette réponse sont incorrects. Vagrant n'est pas pour gérer des machines, Vagrant est pour gérer des environnements de développement. Le fait que Vagrant fasse tourner les machines est surtout historique. La prochaine version de Vagrant a un support de première classe pour faire tourner l'environnement de développement en utilisant Docker en tant que fournisseur directement sur l'hôte ou n'importe quelle machine virtuelle (Mac, Win). Il peut également faire tourner LXC brut si c'est ce que quelqu'un veut (encore une fois, sur l'hôte ou la machine virtuelle). Vagrant souhaite faire ce qu'il y a de mieux pour créer un environnement de développement portable, que cela signifie créer une machine virtuelle ou non.
"C'est une idée fausse commune que vous ne pouvez utiliser Docker que sur Linux" Bien que cela soit vrai, il est exact de dire que vous ne pouvez utiliser que Linux sur Docker. Si je veux configurer un lanceur de test qui exerce mon application dans une grande variété de configurations d'environnement (différentes bases de données, versions php, backends de mise en cache, etc.), je peux facilement le faire avec des conteneurs docker. Mais je ne peux pas voir si mon application fonctionnera correctement dans un environnement Windows IIS, ou sur BSD ou OSX.
Le message est obsolète. Vagrant prend désormais en charge Docker en tant que fournisseur. Et il y a quelques vidéos montrant comment vous pouvez utiliser Vagrant et Docker à l'unisson sur leur blog .
sargas
86
Je préfère ma réponse en admettant que je n'ai aucune expérience avec Docker, sauf en tant qu'observateur passionné de ce qui semble être une solution vraiment soignée qui gagne beaucoup de traction.
J'ai une bonne expérience avec Vagrant et je le recommande vivement. C'est certainement une solution plus lourde car elle est basée sur VM au lieu de LXC. Cependant, j'ai trouvé qu'un ordinateur portable décent (8 Go de RAM, processeur i5 / i7) n'a aucun problème à exécuter une machine virtuelle à l'aide de Vagrant / VirtualBox avec les outils de développement.
L'une des choses vraiment géniales avec 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 aussi proche que possible de celui que vous obtiendrez, et c'est exactement ce que vous voulez.
L'autre grande chose avec Vagrant est que vous pouvez versionner votre Vagrantfile avec votre code d'application. Cela signifie que tous les autres membres de votre équipe peuvent partager ce fichier et vous êtes assuré que tout le monde travaille avec la même configuration d'environnement.
Fait intéressant, Vagrant et Docker peuvent en fait ê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 obtienne une assistance dans un avenir proche. Voir https://github.com/dotcloud/docker/issues/404 pour une discussion récente sur le sujet.
Docker n'est pas de la virtualisation, mais une exécution du système d'exploitation dans son propre conteneur, en utilisant le même noyau hôte, ce n'est pas un fournisseur non plus comme les autres machines virtuelles, donc docker est déjà pris en charge par Vagrant.
Aftab Naveed
1
Docker est la virtualisation du système d'exploitation lui-même, réutilisant implicitement le matériel sous-jacent. Il s'agit de virtualisation car elle résume et isole le système de fichiers, la mise en réseau et les processus s'exécutant dans un conteneur.
jose.angel.jimenez
63
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 pour votre fichier vagrant est de préparer une machine qui exécute un seul petit script shell qui installe Docker. Cela signifie que mes fichiers Vagrant pour chaque projet sont presque identiques et très simples.
Maintenant, pour obtenir tous les services dont j'ai besoin, j'ai un script docker_start qui ressemble à quelque chose comme ç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, j'exécute MongoDB, Elastisearch, RabbitMQ et Memcached
Une configuration solo non docker Chef serait considérablement plus compliquée.
Un dernier gros avantage est obtenu lorsque vous passez à la production, la conversion 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 configuration pour exécuter Docker 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 à
Vous avez fait toute cette orchestration docker_start mais n'avez pas pris la peine de lier les conteneurs entre eux. Allez-vous simplement avec des numéros de port codés en dur parce que vous les exécutez sous Vagrant?
WineSoaked
6
Salut WineSoaked, l'exemple ci-dessus ne montre pas le conteneur qui utilise réellement tous ces services. Si vous regardez le billet de blog mentionné, il existe un autre script script / vagrant / docker_web qui déclenche le conteneur de développement pour le projet. Cela utilise en effet --link sur la commande docker run et le projet Rails utilise les variables d'environnement injectées par docker pour se connecter aux services.
Mark Stratmann
1
Je peux voir le potentiel de fusion des deux produits. Vagrant en tant que test d'environnement et docker pour l'encapsuleur d'application. En fusionnant les deux, vous pouvez tester une seule application ou un test unitaire sur de nombreux escenarios. Je pense que beaucoup de "services de plates-formes de test" utilisent Vagrant + Docker à la fois.
m3nda
8
"Ils sont très complémentaires." - Les deux sont libres d'utiliser, en effet.
Underyx
2
Salut @koppor J'ai utilisé Docker pour la dernière fois il y a environ trois mois et je n'y suis pas encore retourné. Le problème que j'ai eu, c'est qu'il y a un bogue dans le partage des dossiers de mon hôte hôte MAC vers la machine virtuelle en cours d'exécution lors de l'utilisation du pilote VMWare. Cela signifiait que je ne pouvais pas modifier le code localement sur le Mac et que les modifications soient reflétées dans le conteneur Docker. Je ne sais pas s'ils l'ont encore corrigé, quand ils le feront, j'y passerai en effet. J'ai toutefois changé toute mon orchestration de conteneur en composition docker depuis la rédaction de cette réponse
Mark Stratmann
53
Vagrant-lxc est un plugin pour Vagrant qui vous permet d'utiliser LXC pour provisionner Vagrant. Il n'a 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 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 VMware.
Veuillez noter que vous pouvez également utiliser Docker pour l'approvisionnement 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 Puppet par Docker. Vous pouvez utiliser des combinaisons comme Docker en tant que fournisseur (VM) avec Chef en tant que provisionneur. Ou vous pouvez utiliser VirtualBox comme fournisseur et Docker comme approvisionneur.
le monde est devenu fou;) nous pouvons exécuter vagrant en utilisant le fournisseur docker pour exécuter les conteneurs docker à l'intérieur de vagrant
Andrzej Rehmann
@zainengineer, le fournisseur Docker pour Vagrant sous Windows utilise-t-il toujours boot2docker ou utilise-t-il une variante de Docker Toolbox?
Derek Mahar du
@zainengineer Avez-vous des liens vers des exemples illustratifs (pas des documents vagabonds)?
Wlad
16
L'utilisation des deux est une partie importante des tests de livraison d'applications. Je commence seulement à m'impliquer avec Docker et je pense 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:
Prenez un composant d'application Java / Go et créez-le en tant que conteneur (notez, vous ne savez pas si l'application doit être intégrée dans le conteneur ou construite puis installée dans le conteneur)
Livrez le conteneur à une machine virtuelle Vagrant.
Répétez cette opération pour tous les composants d'application.
Itérer sur les composants contre lesquels coder.
Tester en continu le mécanisme de livraison aux machines virtuelles gérées 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 manière beaucoup plus continue qu'auparavant.
Cela semble être l'extension logique de la déclaration de Mitchell selon laquelle Vagrant est pour le développement combiné avec la pensée de Farley / Humbles dans la livraison continue. Si moi, en tant que développeur, je peux réduire la boucle de rétroaction sur les tests d'intégration et la livraison d'applications, une meilleure qualité et de meilleurs environnements de travail suivront.
Le fait qu'en tant que développeur, je livre constamment et systématiquement des conteneurs à la machine virtuelle et teste l'application de manière plus globale signifie que les versions de production seront encore simplifiées.
Je vois donc Vagrant évoluer comme un moyen de tirer parti de certaines des conséquences impressionnantes que Docker aura pour le déploiement d'applications.
avez-vous par hasard un blog à ce sujet? ça fait presque deux ans maintenant, comment ça va? utilise encore vagabond avec docker ou simplement docker et docker-fleat / machine?
Andrzej Rehmann
L'entreprise pour laquelle je travaillais a été acquise et ils ont supprimé tout mon contenu @Hoto. La réponse courte est que j'utilise docker-machine à la maison pour mes projets pour animaux de compagnie. Au travail, je suis <gulp> manager </gulp> et je ne fais pas beaucoup de technologie. Nous n'avons pas l'intention d'utiliser Docker, donc notre outil est généralement Vagrant.
Boyd Hemphill
10
Certainement Docker pour la victoire!
Comme vous le savez peut-être, Vagrant est destiné à la gestion des machines virtuelles tandis que Docker est destiné à la gestion des conteneurs logiciels. Si vous n'êtes pas au courant de la différence, voici: Un conteneur de logiciels 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 car vous ne gaspillez pas de ressources sur plusieurs systèmes d'exploitation (noyaux), vous pouvez emballer plus de logiciels par serveur en gardant un bon degré d'isolement.
Bien sûr, c'est une nouvelle discipline pour s'occuper de ses propres pièges et défis.
Optez pour Docker Swarm si vos besoins dépassent la limite de ressources d'une seule machine.
Il y a un article vraiment 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 machines virtuelles classiques et sont devenus populaires parmi les développeurs et dans le cadre des initiatives CD et DevOps. Si votre objectif est l'isolement, Docker est un excellent choix. Vagrant est un gestionnaire de VM qui vous permet de scripter des configurations de VM individuelles ainsi que de faire le provisioning. Cependant, il s'agit d'un VM dépendant de VirtualBox (ou d'un autre gestionnaire de VM) avec une surcharge relativement importante. Cela vous oblige à avoir un disque dur inactif qui peut être énorme, cela prend beaucoup de RAM et les performances peuvent être sous-optimales. Docker utilise les groupes de noyau et l'isolement des espaces de noms via LXC. Cela signifie que vous utilisez le même noyau que l'hôte et le même système de fichiers. Vagrant est un niveau supérieur à Docker en termes d'abstraction, ils ne sont donc pas vraiment comparables. Les outils de gestion de la configuration tels que Puppet sont largement utilisés pour provisionner des environnements cibles. Réutiliser les solutions existantes basées sur Puppet est facile avec Docker. Vous pouvez également découper votre solution afin que l'infrastructure soit provisionnée avec 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 qui est le mieux pour votre scénario.
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 l'approvisionnement. Cependant, il s'agit toujours d'une machine virtuelle dépendant de VirtualBox (ou d'autres) avec une énorme surcharge. Cela nécessite que vous ayez un fichier de disque dur qui peut être énorme, cela prend beaucoup de RAM et les performances peuvent ne pas être très bonnes.
Docker, quant à lui, utilise le noyau cgroup et 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 de fichiers. Vous pouvez utiliser Dockerfile avec la
docker build
commande afin de gérer l'approvisionnement et la configuration de votre conteneur. Vous avez un exemple sur docs.docker.com sur la façon de créer votre Dockerfile; c'est très intuitif.La seule raison pour laquelle vous pourriez vouloir utiliser Vagrant est si vous devez faire du développement BSD, Windows ou autre non-Linux sur votre box Ubuntu. Sinon, optez pour Docker.
la source
Avertissement: j'ai écrit Vagrant! Mais parce que j'ai écrit Vagrant, je passe la plupart de mon temps à vivre dans le monde 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 travaillant seul, travaillant sur Linux, utilisant Docker en production), vous pouvez vous en tenir à Docker seul et simplifier les choses. Dans de nombreux autres scénarios (je discute 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é, ils ne le font pas. En fait, la comparaison la plus appropriée serait Vagrant contre quelque chose comme Boot2Docker (OS minimal pouvant exécuter Docker). Vagrant est un niveau supérieur à Docker en termes d'abstractions, ce n'est donc 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. Dans ceux-ci, si vous utilisez des conteneurs, Vagrant ne s'en soucie pas et l'adopte: il peut installer, tirer vers le bas, construire et exécuter automatiquement des conteneurs Docker, par exemple. Avec Vagrant 1.6, Vagrant dispose d' environnements de développement basés sur Docker et 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 Docker.
Docker exécute 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 Linux ou un hôte 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 doit donc être utilisé.
Si votre organisation exécute uniquement des conteneurs Docker pour tous ses projets et ne dispose que de développeurs fonctionnant sous Linux, alors d'accord, Docker pourrait certainement fonctionner pour vous!
Sinon, je ne vois aucun avantage à essayer d'utiliser Docker seul, car vous perdez beaucoup de ce que Vagrant a à offrir, ce qui présente de réels avantages commerciaux / 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 d'entre eux afin que vous puissiez les utiliser à cette fin.
Vagrant est un workflow unique pour tous vos projets. Ou, pour le dire autrement, c'est juste 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 se présente pour concurrencer directement Docker, Vagrant pourra également le gérer.
Vagrant fonctionne sur Windows (retour à XP), Mac (retour à 10.5) et Linux (retour au noyau 2.6). Dans les trois cas, le workflow est le même. Si vous utilisez Docker, Vagrant peut lancer une machine (VM ou distante) qui peut exécuter Docker sur ces trois systèmes.
Vagrant sait comment configurer certaines choses avancées ou non triviales comme la mise en réseau et la synchronisation de dossiers. Par exemple: Vagrant sait comment attacher une IP statique à une machine ou transférer des ports, et la configuration est la même quel que soit le système que vous utilisez (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 machine virtuelle sans Vagrant, vous devrez le faire manuellement ou ils devront réinventer Vagrant dans ce cas.
Vagrant 1.6 a un support de première classe pour 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 travailler 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 contre-arguments spécifiques que j'ai entendus en faveur de l'utilisation de Docker au lieu de Vagrant:
"Ce sont des pièces moins mobiles" - Oui, cela peut être le cas si vous utilisez Docker exclusivement pour chaque projet. Même dans ce cas, il sacrifie la flexibilité du verrouillage Docker. Si jamais 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 avez utilisé Vagrant, vous avez cette seule pièce mobile qui prend en charge le reste.
"C'est plus rapide!" - Une fois que vous avez l'hôte qui peut exécuter des conteneurs Linux, Docker est définitivement plus rapide à exécuter un conteneur que n'importe quelle machine virtuelle ne serait à lancer. Mais le lancement d'une machine virtuelle (ou d'une machine distante) est un coût unique. Au cours de la journée, la plupart des utilisateurs de Vagrant ne détruisent jamais réellement leur machine virtuelle. C'est une étrange optimisation pour les environnements de développement. En production, où Docker brille vraiment, je comprends la nécessité de faire tourner / monter rapidement les conteneurs.
J'espère maintenant qu'il est clair de voir qu'il est très difficile, et je ne crois pas, 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 le reste que Vagrant a à offrir.
En conclusion: dans des cas d'utilisation très spécifiques, Docker est certainement un remplaçant possible de Vagrant. Dans la plupart des cas d'utilisation, ce n'est pas le cas. Vagrant n'entrave pas votre utilisation de Docker; il fait en 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 objectif de Vagrant est de fonctionner aussi bien avec n'importe quel système.
Espérons que cela arrange les choses!
la source
vagrant provision
).Je suis l'auteur de Docker.
La réponse courte est que si vous souhaitez gérer des machines, vous devez 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 des machines virtuelles. Docker est un outil de création et de déploiement d'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 ainsi très facile de créer votre application une fois et de la déployer n'importe où - sur votre ordinateur portable pour les tests, puis sur différents serveurs pour un déploiement en direct, etc.
C'est une idée fausse commune que vous ne pouvez utiliser Docker que sur Linux. C'est incorrect; vous pouvez également installer Docker sur Mac et Windows. 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é, il 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, 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 moindres détails de la gestion des machines virtuelles, qui ne sont de toute façon qu'un moyen de parvenir à une fin.
En théorie, il est possible d'utiliser Vagrant comme couche d'abstraction pour Docker. Je déconseille cela pour deux raisons:
Tout d'abord, 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 un runtime 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 le runtime de l'application. Les primitives de Docker sont les processus, les flux de journaux, les variables d'environnement et les liaisons réseau entre les composants. Les primitives dans Vagrant sont les machines, les périphériques de bloc et les clés ssh. Vagrant se trouve simplement plus bas dans la pile, et la seule façon d'interagir avec un conteneur est de prétendre qu'il s'agit simplement d'un autre type de machine, que vous pouvez "démarrer" et "vous connecter". Donc, bien sûr, vous pouvez taper "vagrant up" avec un plugin Docker et quelque chose de joli se produira. Est-ce un substitut à toute l'étendue de ce que Docker peut faire? Essayez Docker natif pendant quelques jours et voyez par vous-même :)
Deuxièmement, l'argument de verrouillage. "Si vous utilisez Vagrant comme abstraction, vous ne serez pas enfermé dans Docker!". Du point de vue de Vagrant, qui est conçu pour gérer des machines, cela est parfaitement logique: les conteneurs ne sont-ils pas simplement un autre type de machine? Tout comme Amazon EC2 et VMware, nous devons faire attention à ne pas lier nos outils de provisioning à un fournisseur particulier! Cela créerait un verrouillage - mieux vaut tout résumer avec Vagrant. Sauf que cela manque complètement le point de Docker. Docker ne provisionne pas de machines; il enveloppe votre application dans un runtime 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 provisionnez vos machines! Par exemple, il est assez fréquent de déployer des applications sur des machines qui sont 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 bare metal que Vagrant ne peut pas provisionner du tout. 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 IIS Windows prête à l'emploi ou quelque chose. 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 rvm pour la gestion des dépendances et le sandboxing par exemple.
En résumé: Vagrant sert à gérer les machines et Docker à créer et exécuter des environnements d'application.
la source
Je préfère ma réponse en admettant que je n'ai aucune expérience avec Docker, sauf en tant qu'observateur passionné de ce qui semble être une solution vraiment soignée qui gagne beaucoup de traction.
J'ai une bonne expérience avec Vagrant et je le recommande vivement. C'est certainement une solution plus lourde car elle est basée sur VM au lieu de LXC. Cependant, j'ai trouvé qu'un ordinateur portable décent (8 Go de RAM, processeur i5 / i7) n'a aucun problème à exécuter une machine virtuelle à l'aide de Vagrant / VirtualBox avec les outils de développement.
L'une des choses vraiment géniales avec 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 aussi proche que possible de celui que vous obtiendrez, et c'est exactement ce que vous voulez.
L'autre grande chose avec Vagrant est que vous pouvez versionner votre Vagrantfile avec votre code d'application. Cela signifie que tous les autres membres de votre équipe peuvent partager ce fichier et vous êtes assuré que tout le monde travaille avec la même configuration d'environnement.
Fait intéressant, Vagrant et Docker peuvent en fait ê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 obtienne une assistance dans un avenir proche. Voir https://github.com/dotcloud/docker/issues/404 pour une discussion récente sur le sujet.
la source
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 pour votre fichier vagrant est de préparer une machine qui exécute un seul petit script shell qui installe Docker. Cela signifie que mes fichiers Vagrant pour chaque projet sont presque identiques et très simples.
Voici un Vagrantfile typique
Le fichier Bootstrap qui installe le docker ressemble à ceci
Maintenant, pour obtenir tous les services dont j'ai besoin, j'ai un script docker_start qui ressemble à quelque chose comme ça
Dans cet exemple, j'exécute MongoDB, Elastisearch, RabbitMQ et Memcached
Une configuration solo non docker Chef serait considérablement plus compliquée.
Un dernier gros avantage est obtenu lorsque vous passez à la production, la conversion 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 configuration pour exécuter Docker 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 à
Implémentation d'un environnement de développement Vagrant / Docker
la source
Vagrant-lxc est un plugin pour Vagrant qui vous permet d'utiliser LXC pour provisionner Vagrant. Il n'a 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 mérite d'être regardée.
la source
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 VMware.
Veuillez noter que vous pouvez également utiliser Docker pour l'approvisionnement 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 Puppet par Docker. Vous pouvez utiliser des combinaisons comme Docker en tant que fournisseur (VM) avec Chef en tant que provisionneur. Ou vous pouvez utiliser VirtualBox comme fournisseur et Docker comme approvisionneur.
la source
L'utilisation des deux est une partie importante des tests de livraison d'applications. Je commence seulement à m'impliquer avec Docker et je pense 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:
Cela semble être l'extension logique de la déclaration de Mitchell selon laquelle Vagrant est pour le développement combiné avec la pensée de Farley / Humbles dans la livraison continue. Si moi, en tant que développeur, je peux réduire la boucle de rétroaction sur les tests d'intégration et la livraison d'applications, une meilleure qualité et de meilleurs environnements de travail suivront.
Le fait qu'en tant que développeur, je livre constamment et systématiquement des conteneurs à la machine virtuelle et teste l'application de manière plus globale signifie que les versions de production seront encore simplifiées.
Je vois donc Vagrant évoluer comme un moyen de tirer parti de certaines des conséquences impressionnantes que Docker aura pour le déploiement d'applications.
la source
Certainement Docker pour la victoire!
Comme vous le savez peut-être, Vagrant est destiné à la gestion des machines virtuelles tandis que Docker est destiné à la gestion des conteneurs logiciels. Si vous n'êtes pas au courant de la différence, voici: Un conteneur de logiciels 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 car vous ne gaspillez pas de ressources sur plusieurs systèmes d'exploitation (noyaux), vous pouvez emballer plus de logiciels par serveur en gardant un bon degré d'isolement.
Bien sûr, c'est une nouvelle discipline pour s'occuper de ses propres pièges et défis.
Optez pour Docker Swarm si vos besoins dépassent la limite de ressources d'une seule machine.
la source
Il y a un article vraiment informatif dans le magazine Oracle Java sur l'utilisation de Docker en combinaison avec Vagrant (et Puppet):
Conclusion
Comment créer, utiliser et orchestrer des conteneurs Docker dans DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0
la source