J'utilise Ubuntu pour le développement et le déploiement et j'ai besoin de créer un environnement isolé.
J'envisage Vagrant ou Docker à cet effet. Quels sont les avantages et les inconvénients, ou comment ces solutions se comparent-elles?
J'utilise Ubuntu pour le développement et le déploiement et j'ai besoin de créer un environnement isolé.
J'envisage Vagrant ou Docker à cet effet. Quels sont les avantages et les inconvénients, ou comment ces solutions se comparent-elles?
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.
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!
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.
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.
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
# -*- 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 à 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 à
Implémentation d'un environnement de développement Vagrant / Docker
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.
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.
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.
Comment créer, utiliser et orchestrer des conteneurs Docker dans DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0