web-dev-qa-db-fra.com

Devrais-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é.

J'envisage soit Vagrant ou Docker à cette fin. Quels sont les avantages et les inconvénients, ou comment ces solutions se comparent-elles?

2029
murtaza52

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 créer un script pour la configuration de la machine virtuelle ainsi que le provisioning. Cependant, il s’agit toujours d’une machine virtuelle dépendant de VirtualBox (ou d’autres) avec une surcharge considérable. Vous devez disposer d'un fichier de disque dur qui peut être énorme, cela demande beaucoup de mémoire vive et les performances peuvent ne pas être très bonnes.

D'autre part, Docker utilise le groupe de contrôle du noyau et l'espacement des 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 commande docker build afin de gérer l’approvisionnement et la configuration de votre conteneur. Vous avez un exemple sur docs.docker.com sur la création de votre fichier Docker; 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 développement non Linux sur votre machine Ubuntu. Sinon, optez pour Docker.

1125
creack

Avertissement: j'ai écrit Vagrant! Mais parce que 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’entreprises qui utilisent Vagrant et beaucoup d’entre elles utilisent Docker, et je vois comment les deux s’interagissent.

Avant de trop parler, une réponse directe: dans votre scénario spécifique (vous travaillez seul, travaillez sous Linux, utilisez Docker en production), vous pouvez coller avec Docker seul 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 sont pas. En fait, la comparaison la plus appropriée serait Vagrant et quelque chose comme Boot2Docker (système d'exploitation minimal pouvant exécuter Docker). Vagrant est un niveau au dessus de Docker en termes d'abstractions, ce n'est donc pas une comparaison juste dans la plupart des cas.

Vagrant lance des éléments 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 s'en moque, et comprend: il peut automatiquement installer, décompresser, construire et exécuter des conteneurs Docker, par exemple. Avec Vagrant 1.6, Vagrant utilise 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 sous Linux, Mac et Windows. Vagrant n'essaie pas de remplacer Docker ici, il adopte les pratiques de 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 aucune comparaison avec Vagrant! Le vagabond ne vit pas dans ces environnements, donc Docker devrait être utilisé.

Si votre organisation n'utilise que des conteneurs Docker pour tous ses projets et que les développeurs ne s'exécutent que 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 pour les entreprises et la 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 ceux-ci afin que vous puissiez les utiliser à cette fin.

  • Vagrant est un workflow unique pour tous vos projets. Autrement dit, les personnes doivent apprendre à gérer un projet, que ce soit dans un conteneur Docker ou non. Si, par exemple, à l'avenir, un compétiteur se lève pour concurrencer directement Docker, Vagrant pourra également le gérer.

  • Vagrant fonctionne sous 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) pouvant exécuter Docker sur ces trois systèmes.

  • Vagrant sait comment configurer certaines choses avancées ou non triviales telles que 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 fichiers sur la machine distante (dossiers partagés VirtualBox, NFS, rsync, Samba [plugin], etc.). Si vous utilisez Docker, même avec Docker avec un VM sans Vagrant, vous devez le faire manuellement ou réinventer Vagrant dans ce cas.

  • Vagrant 1.6 offre un support de premier ordre pour environnements de développement basés sur un menu fixe . Cela ne lancera pas de machine virtuelle sous Linux, mais lancera automatiquement une machine virtuelle sur Mac et Windows. Le résultat final est que l'utilisation de Docker est uniforme sur toutes les plates-formes, tandis que Vagrant gère toujours les détails fastidieux de tâches telles 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:

  • "Ce sont des pièces moins mobiles" - Oui, ça peut l'être si vous utilisez Docker exclusivement pour chaque projet. Même dans ce cas, il sacrifie la flexibilité pour le verrouillage de Docker. Si vous décidez de ne pas utiliser Docker pour un projet, passé, présent ou futur, vous disposerez de davantage de pièces mobiles. Si vous avez utilisé Vagrant, vous avez cette pièce mobile qui supporte le reste.

  • "C'est plus rapide!" - Une fois que vous avez l'hôte capable d'exécuter des conteneurs Linux, Docker exécute définitivement un conteneur plus rapidement que ne le ferait n'importe quelle machine virtuelle. 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 ordinateur virtuel. C'est une optimisation étrange pour les environnements de développement. En production, là où Docker brille vraiment, je comprends la nécessité de tourner rapidement les conteneurs.

J'espère maintenant qu'il est clair qu'il est très difficile, et je ne crois 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 dont vous pouvez 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 remplaçant possible de Vagrant. Dans la plupart des cas d'utilisation, ce n'est pas le cas. Vagrant n'empêche pas votre utilisation de Docker; il fait réellement ce qu'il peut pour rendre cette expérience plus douce. Si vous trouvez que ce n'est pas vrai, je serai heureux de prendre des suggestions pour améliorer les choses, car l'objectif de Vagrant est de fonctionner aussi bien avec n'importe quel système.

Espérons que cela arrange les choses!

2302
Mitchell

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’applications, vous devez utiliser Docker.

Vagrant est un outil de gestion de 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 ainsi que 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 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 inexact vous pouvez également installer Docker sur Mac et Windows. Lorsqu'il est installé sur Mac, Docker regroupe un minuscule Linux VM (25 Mo sur 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 très légers, faciles à tester et à 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 fastueux 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 en tant que couche d'abstraction pour Docker. Je recommande contre cela pour deux raisons:

  • Tout d’abord, vagabond 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 l'exécution d'une 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 des processus, des flux de journaux, des variables d’environnement et des liens réseau entre composants. Les primitives de Vagrant sont des machines, des périphériques de bloc et des clés ssh. Vagrant est simplement assis plus bas dans la pile, et la seule façon dont il peut interagir avec un conteneur est de prétendre que c'est simplement un autre type de machine, que vous pouvez "démarrer" et "vous connecter". Alors, bien sûr, vous pouvez taper "vagabond" avec un plugin Docker et quelque chose de joli se produira. Est-ce que cela remplace tout ce que Docker peut faire? Essayez Docker pour quelques jours et voyez par vous-même :)

  • Deuxièmement, l'argument de blocage. "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 simplement un autre type de machine? Tout comme Amazon EC2 et VMware, nous devons veiller à ne pas lier nos outils de provisioning à un fournisseur en particulier! Cela créerait un verrouillage - mieux vaut tout résumer avec Vagrant. Sauf que ça manque le but de Docker. Docker ne fournit pas de machines. il enveloppe votre application dans une exécution portable légère pouvant être abandonnée n'importe où.

Le temps d'exécution que vous choisissez pour votre application n'a rien à voir avec la configuration de vos machines! Par exemple, il est assez fréquent de déployer des applications sur des machines configurées par quelqu'un d'autre (par exemple une instance EC2 déployée par votre administrateur système, peut-être avec Vagrant), ou sur des machines sans système d'exploitation que Vagrant ne peut pas approvisionner du tout. Inversement, vous pouvez utiliser Vagrant pour provisionner des machines n’ayant rien à voir avec le développement de votre application, par exemple une boîte Windows IIS prête à l’emploi ou quelque chose du genre. Ou vous pouvez utiliser Vagrant pour provisionner des machines pour des projets qui n'utilisent pas Docker. Ils utilisent peut-être une combinaison de rubygems et de rvm pour la gestion de la dépendance et le sandboxing, par exemple.

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

1383
Solomon Hykes

Avant de commencer ma réponse, je dois avouer que je n'ai aucune expérience de Docker, si ce n'est en tant qu'observateur assidu de ce qui semble être une solution vraiment intéressante et qui gagne beaucoup de terrain.

J'ai une bonne expérience de Vagrant et je le recommande vivement. Il s’agit certainement d’une solution plus lourde en termes de système VM plutôt que de système LXC. Cependant, j'ai trouvé un ordinateur portable correct (8 Go de RAM, processeur i5/i7) n'a pas de problème à exécuter un VM à l'aide de Vagrant/VirtualBox avec un outil de développement.

L’une des choses vraiment géniales avec Vagrant est l’intégration avec les scripts Puppet / Chef /Shell pour l’automatisation de 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 presque identique à celui que vous obtiendrez, et c'est exactement ce que vous voulez.

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

Fait intéressant, Vagrant et Docker peuvent en réalité ê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.

82
Chris Bushell

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 provisionnement Chef solo et tout ce que vous avez besoin de faire avec votre fichier vagrant est de préparer une machine qui exécute un seul petit script Shell qui installe docker. Cela signifie que mes Vagrantfiles 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 le menu fixe 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 à 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, je lance MongoDB, Elastisearch, RabbitMQ et Memcached

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

Un dernier grand avantage est obtenu lorsque vous passez à la production, en transformant 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, ce qui 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 vagabond/docker

59
Mark Stratmann

Vagrant-lxc est un plugin pour Vagrant qui vous permet d'utiliser LXC pour approvisionner Vagrant. Il n'a pas toutes les fonctionnalités que possède le vagabond par défaut VM (VirtualBox), mais il devrait vous permettre plus de flexibilité que les conteneurs Docker. Il y a une vidéo dans le lien montrant ses capacités qu'il vaut la peine de regarder.

53
GnarlinBrando

Avec Vagrant, vous pouvez maintenant 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 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 par Docker. Vous pouvez utiliser des combinaisons telles que 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.

45
zainengineer

L'utilisation des deux est une partie importante des tests de livraison d'application. Je commence seulement à m'impliquer dans Docker et à réfléchir très sérieusement à une équipe d'applications extrêmement complexe dans la conception et la fourniture 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 construisez-le en tant que conteneur (remarque: vous ne savez pas si l'application doit être générée dans le conteneur ou créée puis installée dans le conteneur)
  • Remettez le conteneur à une machine virtuelle vagabonde.
  • Répétez cette opération pour tous les composants de l'application.
  • Itérer sur le (s) composant (s) à coder.
  • Tester en permanence le mécanisme de livraison aux ordinateurs virtuels gérés par Vagrant
  • Dormez bien en sachant que le moment est venu de déployer le conteneur, et que les tests d’intégration étaient effectués de manière beaucoup plus continue qu’avant Docker.

Cela semble être le prolongement logique de l'affirmation de Mitchell selon laquelle Vagrant est pour le développement combiné à la pensée de Farley/Humbles en mode de livraison continue. Si, en tant que développeur, je peux réduire la boucle de rétroaction liée aux tests d'intégration et à la livraison des applications, des environnements de travail de meilleure qualité et de meilleure qualité suivront.

Le fait qu'en tant que développeur, je fournis constamment et systématiquement des conteneurs au VM et teste l'application de manière plus globale, ce qui simplifiera davantage les versions de production.

Je vois donc Vagrant évoluer comme un moyen de tirer parti des conséquences impressionnantes que Docker aura sur le déploiement d'applications.

15
Boyd Hemphill

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 de logiciels. Si vous ne connaissez pas la différence, voici ce qui suit: 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 réalisez des économies, car vous ne gaspillez pas de ressources sur plusieurs systèmes d'exploitation (noyaux). Vous pouvez installer davantage de logiciels par serveur en maintenant un bon degré d'isolation.

Bien sûr, il s’agit d’une nouvelle discipline à entretenir avec ses propres pièges et défis.

Optez pour Docker Swarm si vos besoins dépassent la limite des ressources d'un ordinateur.

Le magazine Oracle Java contient un article très informatif sur l’utilisation de Docker en association 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 VM qui vous permet de créer des scripts pour configurer les configurations de machines virtuelles individuelles et d'effectuer le provisioning. Cependant, il reste un VM dépendant de VirtualBox (ou un autre VM gestionnaire) avec un temps système relativement important. Cela nécessite un disque dur inactif qui peut être énorme, beaucoup de RAM et des performances optimales. Docker utilise les groupes de contrôle de noyau et l’isolation d’espaces 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 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 Puppet est simple avec Docker. Vous pouvez également découper votre solution afin que l'infrastructure soit configurée avec Puppet; le middleware, l'application métier elle-même ou les deux sont fournis avec Docker; et Docker est enveloppé par Vagrant. Avec cette gamme d’outils, vous pouvez faire ce qui convient le mieux à votre scénario.

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

7
Adrian Krebs