Sollte ich Vagrant oder Docker verwenden, um eine isolierte Umgebung zu erstellen? [geschlossen]


2083

Ich verwende Ubuntu für die Entwicklung und Bereitstellung und muss eine isolierte Umgebung erstellen.

Zu diesem Zweck erwäge ich entweder Vagrant oder Docker. Was sind die Vor- und Nachteile oder wie vergleichen sich diese Lösungen?


27
Beide sind jetzt kombinierbar: docs.vagrantup.com/v2/provisioning/docker.html
Alp

78
Ihre Frage hat das Glück, die Antworten beider Autoren auf die beiden Dienste zu erhalten: Mitchell und Solomon Hykes
itsazzad

4
Ich möchte eine neue Zusammenfassung geben - die Frage ist meistens falsch. Die richtige Frage lautet: Soll ich Vagrant oder Docker-Compose verwenden, um eine isolierte Umgebung zu erstellen? Die Antwort lautet, dass Vagrant und Docker-Compose dieselbe Aufgabe zur Beschreibung von Umgebungen ausführen. Sie sollten Docker stattdessen lieber mit Virtualbox vergleichen. Der Unterschied besteht darin, dass Vagrant jede Virtualisierung wie Docker, VMWare, Virtualbox unter Windows, Linux oder OSX verwenden kann, Docker-Compose jedoch nur Linux-basierte Docker-Images verwenden kann.
PHZ.fi-Pharazon

Für mich lautet die Antwort "Wie wichtig ist Geschwindigkeit für Sie bei regulären Arbeitsaktivitäten". Ich finde Vagrant langsamer als Docker. Auf Docker, insbesondere nach einem ersten Pull, macht es der Cache- und Layer-Ansatz von Docker für mich als Entwickler am einfachsten und schnellsten, es zu verwenden
Michael Durrant

Antworten:


1155

Wenn Ihr Zweck die Isolation ist, denke ich, dass Docker das ist, was Sie wollen.

Vagrant ist ein Manager für virtuelle Maschinen. Sie können die Konfiguration der virtuellen Maschine sowie die Bereitstellung per Skript ausführen. Es ist jedoch immer noch eine virtuelle Maschine, die von VirtualBox (oder anderen) abhängig ist und einen enormen Overhead aufweist. Es erfordert eine Festplattendatei, die sehr groß sein kann, viel RAM benötigt und die Leistung möglicherweise nicht sehr gut ist.

Docker hingegen verwendet die Kernel-Gruppe und den Namespace über LXC . Dies bedeutet, dass Sie denselben Kernel wie den Host und dasselbe Dateisystem verwenden. Sie können Dockerfile mit dem docker buildBefehl verwenden, um die Bereitstellung und Konfiguration Ihres Containers zu übernehmen. Unter docs.docker.com finden Sie ein Beispiel zum Erstellen Ihrer Docker-Datei. es ist sehr intuitiv.

Der einzige Grund, warum Sie Vagrant verwenden möchten, ist, wenn Sie BSD-, Windows- oder andere Nicht-Linux-Entwicklungen auf Ihrer Ubuntu-Box durchführen müssen. Andernfalls wählen Sie Docker.


13
Leider noch nicht. Wenn Sie sich in einem 32-Bit-System befinden, benötigen Sie eine VM mit einem 64-Bit-Gastsystem, um Docker ausführen zu können. Mit go1.1 wird die 32-Bit-Unterstützung jedoch besser und es ist möglich, dass Docker bald 32-Bit-Arch unterstützt
Creack

8
Dies gilt für Mac und Windows, aber seit Docker 0.7 funktioniert jede Linux-Distribution einwandfrei. Wenn Sie einen nicht funktionierenden kennen, lassen Sie es mich bitte wissen. Sofern Sie keinen Mac- oder Windows-Stack haben (was unwahrscheinlich ist, aber passieren kann), möchten Sie Docker nur unter Linux ausführen. Der Docker-Client funktioniert einwandfrei auf Mac, sollte bald auf BSD funktionieren und der Daemon wird schließlich BSD, Solaris und Mac unterstützen.
Knarren

9
Falls jemand diese Kommentare liest, sollten Sie wissen, dass Docker erst vor 12 Tagen ver1.0 ( blog.docker.com/2014/06/its-here-docker-1-0 ) erreicht hat und viele verschiedene Plattformen stabil sind & jetzt unterstützt ( docs.docker.com/installation )
JorgeArtware

17
Vagrant hat LXC- und Docker-Provisioner. Vagrant und Docker sind jedoch grundlegend verschiedene Dinge. Vagrant ist nur für Entwicklungsumgebungen gedacht, Docker eher für die Produktion und nur für Linux.
Dannyboy

2
Docker funktioniert jetzt unter Windows 10 Pro und höher sowie unter Windows Server 2016. Ich habe gerade ein Upgrade von Windows 10 Home auf Windows 10 Pro durchgeführt und die Docker-App installiert. Ich kann jetzt Linux Docker-Images unter Windows 10 ausführen. Es ist brillant!
PrestonDocks

2339

Haftungsausschluss: Ich habe Vagrant geschrieben! Aber weil ich Vagrant geschrieben habe, verbringe ich die meiste Zeit in der DevOps-Welt, die Software wie Docker enthält. Ich arbeite mit vielen Unternehmen zusammen, die Vagrant verwenden, und viele verwenden Docker, und ich sehe, wie die beiden zusammenspielen.

Bevor ich zu viel rede, eine direkte Antwort: In Ihrem speziellen Szenario (Sie arbeiten alleine, arbeiten unter Linux, verwenden Docker in der Produktion) können Sie sich nur an Docker halten und die Dinge vereinfachen. In vielen anderen Szenarien (die ich weiter diskutiere) ist es nicht so einfach.

Es ist nicht richtig, Vagrant direkt mit Docker zu vergleichen. In einigen Szenarien überschneiden sie sich und in der überwiegenden Mehrheit nicht. Tatsächlich wäre der passendere Vergleich Vagrant mit etwas wie Boot2Docker (minimales Betriebssystem, auf dem Docker ausgeführt werden kann). Vagrant ist in Bezug auf Abstraktionen eine Stufe über Docker, daher ist es in den meisten Fällen kein fairer Vergleich.

Vagrant startet Dinge, um Apps / Dienste zum Zweck der Entwicklung auszuführen. Dies kann auf VirtualBox, VMware sein. Es kann Remote wie AWS, OpenStack sein. In diesen Fällen ist es Vagrant egal, ob Sie Container verwenden, und dies wird berücksichtigt: Es kann beispielsweise Docker-Container automatisch installieren, herunterziehen, erstellen und ausführen. Mit Vagrant 1.6 verfügt Vagrant über Docker-basierte Entwicklungsumgebungen und unterstützt die Verwendung von Docker mit demselben Workflow wie Vagrant unter Linux, Mac und Windows. Vagrant versucht hier nicht, Docker zu ersetzen, sondern umfasst Docker-Praktiken.

Docker führt speziell Docker-Container aus. Wenn Sie direkt mit Vagrant vergleichen: Es handelt sich um eine spezifischere (kann nur Docker-Container ausführen), weniger flexible Lösung (erfordert irgendwo Linux oder einen Linux-Host). Wenn es um Produktion oder CI geht, gibt es natürlich keinen Vergleich zu Vagrant! Vagrant lebt nicht in diesen Umgebungen, daher sollte Docker verwendet werden.

Wenn Ihre Organisation nur Docker-Container für alle ihre Projekte ausführt und nur Entwickler unter Linux ausgeführt werden, könnte Docker definitiv für Sie arbeiten!

Ansonsten sehe ich keinen Vorteil darin, Docker alleine zu verwenden, da Sie viel von dem verlieren, was Vagrant zu bieten hat, was echte Geschäfts- / Produktivitätsvorteile hat:

  • Vagrant kann VirtualBox-, VMware-, AWS-, OpenStack- usw. Computer starten. Es ist egal, was Sie brauchen, Vagrant kann es starten. Wenn Sie Docker verwenden, kann Vagrant Docker auf jedem dieser Geräte installieren, damit Sie sie für diesen Zweck verwenden können.

  • Vagrant ist ein einziger Workflow für alle Ihre Projekte. Oder anders ausgedrückt: Es ist nur eine Sache, die Menschen lernen müssen, um ein Projekt auszuführen, unabhängig davon, ob es sich in einem Docker-Container befindet oder nicht. Wenn zum Beispiel in Zukunft ein Konkurrent auftaucht, um direkt mit Docker zu konkurrieren, kann Vagrant dies auch ausführen.

  • Vagrant funktioniert unter Windows (zurück zu XP), Mac (zurück zu 10.5) und Linux (zurück zu Kernel 2.6). In allen drei Fällen ist der Workflow der gleiche. Wenn Sie Docker verwenden, kann Vagrant einen Computer (VM oder Remote) starten, auf dem Docker auf allen drei dieser Systeme ausgeführt werden kann.

  • Vagrant weiß, wie man einige fortgeschrittene oder nicht triviale Dinge wie das Vernetzen und Synchronisieren von Ordnern konfiguriert. Beispiel: Vagrant weiß, wie eine statische IP an einen Computer oder an Weiterleitungsports angehängt wird, und die Konfiguration ist unabhängig vom verwendeten System (VirtualBox, VMware usw.) dieselbe. Für synchronisierte Ordner bietet Vagrant mehrere Mechanismen, um Ihre lokalen Ordner abzurufen Dateien auf den Remote-Computer übertragen (freigegebene VirtualBox-Ordner, NFS, rsync, Samba [Plugin] usw.). Wenn Sie Docker verwenden, selbst Docker mit einer VM ohne Vagrant, müssen Sie dies manuell tun, oder Vagrant muss in diesem Fall neu erfunden werden.

  • Vagrant 1.6 bietet erstklassige Unterstützung für Docker-basierte Entwicklungsumgebungen . Dies startet keine virtuelle Maschine unter Linux und startet automatisch eine virtuelle Maschine unter Mac und Windows. Das Endergebnis ist, dass die Arbeit mit Docker auf allen Plattformen einheitlich ist, während Vagrant immer noch die mühsamen Details von Dingen wie Netzwerken, synchronisierten Ordnern usw. behandelt.

Um bestimmte Gegenargumente anzusprechen, die ich zugunsten der Verwendung von Docker anstelle von Vagrant gehört habe:

  • "Es sind weniger bewegliche Teile" - Ja, es kann sein, wenn Sie Docker ausschließlich für jedes Projekt verwenden. Selbst dann wird die Flexibilität für das Docker-Lock-In geopfert. Wenn Sie sich jemals dafür entscheiden, Docker nicht für ein Projekt, eine Vergangenheit, Gegenwart oder Zukunft zu verwenden, haben Sie mehr bewegliche Teile. Wenn Sie Vagrant verwendet haben, haben Sie das eine bewegliche Teil, das den Rest unterstützt.

  • "Es ist schneller!" - Sobald Sie den Host haben, auf dem Linux-Container ausgeführt werden können, kann Docker einen Container definitiv schneller ausführen als jede virtuelle Maschine. Das Starten einer virtuellen Maschine (oder Remote-Maschine) ist jedoch einmalig. Im Laufe des Tages zerstören die meisten Vagrant-Benutzer ihre VM nie wirklich. Es ist eine seltsame Optimierung für Entwicklungsumgebungen. In der Produktion, in der Docker wirklich glänzt, verstehe ich die Notwendigkeit, Container schnell hoch- und runterzudrehen.

Ich hoffe jetzt ist klar, dass es sehr schwierig und meiner Meinung nach nicht richtig ist, Docker mit Vagrant zu vergleichen. Für Entwicklerumgebungen ist Vagrant abstrakter und allgemeiner. Docker (und die verschiedenen Möglichkeiten, wie Sie es wie Vagrant verhalten können) ist ein spezieller Anwendungsfall von Vagrant, bei dem alles ignoriert wird, was Vagrant zu bieten hat.

Fazit: In hochspezifischen Anwendungsfällen ist Docker sicherlich ein möglicher Ersatz für Vagrant. In den meisten Anwendungsfällen ist dies nicht der Fall. Vagrant behindert Ihre Nutzung von Docker nicht. Es tut tatsächlich alles, um diese Erfahrung reibungsloser zu gestalten. Wenn Sie feststellen, dass dies nicht der Fall ist, nehme ich gerne Vorschläge zur Verbesserung der Dinge an, da ein Ziel von Vagrant darin besteht, mit jedem System gleich gut zu arbeiten.

Hoffe das klärt die Dinge auf!


4
@JaredMarkell Ich denke, er sucht nach einem webbasierten Dienst, mit dem er seine Vagrant-Maschinen wie Protobox verwalten kann .
Ryan Kennedy

73
@Mitchell Ich wollte mich nur dafür bedanken, dass du das so ausführlich erklärt hast. Offensichtlich ist es für Sie unmöglich, völlig objektiv zu sein, und ich schätze, dass Sie sich Zeit genommen haben, um die Nuancen und verschiedenen Situationen zu erklären, in denen sie verwendet werden könnten. Ich denke, die große Verwirrung bei einer Vielzahl von Tools besteht heute darin, dass sie sich stark überschneiden, und viele Leute wollen eine Einheitslösung, bei der ihnen nur jemand sagt, was zu tun ist, und sie können sie implementieren. Das Schöne an Ihrer Antwort ist, dass sie die zugrunde liegende Frage beantwortet: Wie kann ich eine isolierte Umgebung schaffen? (unabhängig von Werkzeugen).
Jordanien

4
@JaredMarkell Docker hat eine REST-API docs.docker.com/reference/api/docker_remote_api
Tarnay Kálmán

3
@ OğuzÇelikdemir Vagrant kann noch viel mehr. Wenn Sie für jedes Projekt eine bestimmte virtuelle Maschine vorbereiten, ist dies natürlich von Dauer. Aber während der Entwicklung füge ich oft mehr Dienste / Dämonen / Einstellungen hinzu (z. B. wenn ich mich entscheide, RabbitMQ für ein Projekt während der Entwicklung zu verwenden). Für den reinen VM-Ansatz müssen Sie ein neues Image vorbereiten, in dem RabbitMQ installiert und konfiguriert ist, und die Entwickler dazu zwingen, ihre VM auf diese neue zu ändern. Für Vagrant - Ich füge entsprechende Zeilen in der Vagrant-Konfiguration hinzu und alle Entwickler können ihre VMs einfach (mit vagrant provision) aktualisieren .
Tomasz Struczyński

5
(Sie meinen "Offenlegung", enthüllen etwas Wichtiges, nicht "Haftungsausschluss",
lehnen

1418

Ich bin der Autor von Docker.

Die kurze Antwort lautet: Wenn Sie Maschinen verwalten möchten, sollten Sie Vagrant verwenden. Wenn Sie Anwendungsumgebungen erstellen und ausführen möchten, sollten Sie Docker verwenden.

Vagrant ist ein Tool zum Verwalten von virtuellen Maschinen. Docker ist ein Tool zum Erstellen und Bereitstellen von Anwendungen, indem diese in leichte Container gepackt werden. Ein Container kann so ziemlich jede Softwarekomponente zusammen mit ihren Abhängigkeiten (ausführbare Dateien, Bibliotheken, Konfigurationsdateien usw.) enthalten und in einer garantierten und wiederholbaren Laufzeitumgebung ausführen. Dies macht es sehr einfach, Ihre App einmal zu erstellen und überall bereitzustellen - auf Ihrem Laptop zum Testen, dann auf verschiedenen Servern für die Live-Bereitstellung usw.

Es ist ein weit verbreitetes Missverständnis, dass Sie Docker nur unter Linux verwenden können. Das ist falsch; Sie können Docker auch auf Mac und Windows installieren. Bei der Installation auf einem Mac bündelt Docker eine winzige Linux-VM (25 MB auf der Festplatte!), Die als Wrapper für Ihren Container fungiert. Einmal installiert, ist dies vollständig transparent; Sie können die Docker-Befehlszeile genauso verwenden. Dies bietet Ihnen das Beste aus beiden Welten: Sie können Ihre Anwendung mit Containern testen und entwickeln, die sehr leicht, leicht zu testen und leicht zu bewegen sind (siehe zum Beispiel https://hub.docker.com für die Freigabe wiederverwendbarer Container mit die Docker-Community), und Sie müssen sich keine Gedanken über die Details der Verwaltung virtueller Maschinen machen, die ohnehin nur ein Mittel zum Zweck sind.

Theoretisch ist es möglich, Vagrant als Abstraktionsschicht für Docker zu verwenden. Ich empfehle aus zwei Gründen dagegen:

  • Erstens ist Vagrant keine gute Abstraktion für Docker. Vagrant wurde entwickelt, um virtuelle Maschinen zu verwalten. Docker wurde entwickelt, um eine Anwendungslaufzeit zu verwalten. Dies bedeutet, dass Docker von Natur aus auf umfassendere Weise mit einer Anwendung interagieren kann und über mehr Informationen zur Laufzeit der Anwendung verfügt. Die Grundelemente in Docker sind Prozesse, Protokolldatenströme, Umgebungsvariablen und Netzwerkverbindungen zwischen Komponenten. Die Grundelemente in Vagrant sind Maschinen, Blockgeräte und SSH-Schlüssel. Vagrant sitzt einfach tiefer im Stapel, und die einzige Möglichkeit, mit einem Container zu interagieren, besteht darin, so zu tun, als sei es nur eine andere Art von Maschine, die Sie "booten" und "anmelden" können. Sie können also mit einem Docker-Plugin "vagrant up" eingeben, und es wird etwas Hübsches passieren. Ist es ein Ersatz für die volle Bandbreite dessen, was Docker tun kann? Probieren Sie native Docker für ein paar Tage aus und überzeugen Sie sich selbst :)

  • Zweitens das Lock-In-Argument. "Wenn Sie Vagrant als Abstraktion verwenden, werden Sie nicht an Docker gebunden!" Aus Sicht von Vagrant, das für die Verwaltung von Maschinen ausgelegt ist, ist dies durchaus sinnvoll: Sind Container nicht nur eine andere Art von Maschine? Genau wie bei Amazon EC2 und VMware müssen wir darauf achten, unsere Bereitstellungstools nicht an einen bestimmten Anbieter zu binden! Dies würde Lock-In schaffen - besser, um alles mit Vagrant zu abstrahieren. Nur dass dies den Punkt von Docker völlig verfehlt. Docker stellt keine Maschinen bereit. Es verpackt Ihre Anwendung in eine leichte tragbare Laufzeit, die überall abgelegt werden kann.

Welche Laufzeit Sie für Ihre Anwendung wählen, hat nichts damit zu tun, wie Sie Ihre Maschinen bereitstellen! Beispielsweise ist es ziemlich häufig, Anwendungen auf Computern bereitzustellen, die von einer anderen Person bereitgestellt werden (z. B. eine von Ihrem Systemadministrator bereitgestellte EC2-Instanz, möglicherweise unter Verwendung von Vagrant), oder Bare-Metal-Maschinen, die Vagrant überhaupt nicht bereitstellen kann. Umgekehrt können Sie Vagrant verwenden, um Computer bereitzustellen, die nichts mit der Entwicklung Ihrer Anwendung zu tun haben - beispielsweise eine gebrauchsfertige Windows IIS-Box oder ähnliches. Oder Sie können Vagrant verwenden, um Maschinen für Projekte bereitzustellen, die Docker nicht verwenden. Möglicherweise verwenden sie eine Kombination aus Rubygems und RVM für das Abhängigkeitsmanagement und Sandboxing.

Zusammenfassend: Vagrant dient zum Verwalten von Maschinen und Docker zum Erstellen und Ausführen von Anwendungsumgebungen.


396
Ich wollte nur beachten, dass die Vagrant-Aspekte dieser Antwort falsch sind. Vagrant ist nicht für die Verwaltung von Maschinen vorgesehen, Vagrant für die Verwaltung von Entwicklungsumgebungen. Die Tatsache, dass Vagrant Maschinen dreht, ist größtenteils historisch. Die nächste Version von Vagrant bietet erstklassige Unterstützung für das Hochfahren der Entwicklungsumgebung mit Docker als Anbieter direkt auf dem Host oder einer beliebigen VM (Mac, Win). Es kann auch rohen LXC hochfahren, wenn jemand dies wünscht (wiederum auf dem Host oder der VM). Vagrant ist daran interessiert, das Beste zu tun, um eine tragbare Entwicklungsumgebung zu erstellen, unabhängig davon, ob dies das Erstellen einer VM bedeutet oder nicht.
Mitchell

7
@ David Dies behandelt es detaillierter: vagrantup.com/blog/…
Mitchell

48
"Es ist ein weit verbreitetes Missverständnis, dass Sie Docker nur unter Linux verwenden können." Das stimmt zwar, aber es ist richtig zu sagen, dass Sie Linux nur unter Docker verwenden können. Wenn ich einen Testläufer einrichten möchte, der meine Anwendung in einer Vielzahl von Umgebungskonfigurationen (verschiedene Datenbanken, PHP-Versionen, Caching-Backends usw.) ausführt, kann ich dies problemlos mit Docker-Containern tun. Ich kann jedoch nicht feststellen, ob meine Anwendung in einer Windows IIS-Umgebung oder unter BSD oder OSX ordnungsgemäß ausgeführt wird.
Mixologic

10
Ihr erster Punkt ist veraltet, da Vagrant eine integrierte Anbieterunterstützung für Docker hat: docs.vagrantup.com/v2/provisioning/docker.html
Alp

19
Der Beitrag ist veraltet. Vagrant unterstützt Docker jetzt als Anbieter. Und es gibt einige Videos, die zeigen, wie Sie Vagrant und Docker gemeinsam in ihrem Blog verwenden können .
Sargas

86

Ich gehe meiner Antwort voran, indem ich zugebe, dass ich keine Erfahrung mit Docker habe, außer als begeisterter Beobachter einer scheinbar wirklich netten Lösung, die viel Anklang findet.

Ich habe eine anständige Erfahrung mit Vagrant und kann es nur empfehlen. Es ist sicherlich eine schwerere Lösung, da es VM-basiert statt LXC-basiert ist. Ich habe jedoch festgestellt, dass ein anständiger Laptop (8 GB RAM, i5 / i7-CPU) keine Probleme hat, eine VM mit Vagrant / VirtualBox neben Entwicklungstools auszuführen.

Eines der wirklich großartigen Dinge bei Vagrant ist die Integration in Puppet / Chef / Shell-Skripte zur Automatisierung der Konfiguration. Wenn Sie eine dieser Optionen zum Konfigurieren Ihrer Produktionsumgebung verwenden, können Sie eine Entwicklungsumgebung erstellen, die nahezu identisch ist, und genau das, was Sie möchten.

Die andere großartige Sache mit Vagrant ist, dass Sie Ihre Vagrant-Datei zusammen mit Ihrem Anwendungscode versionieren können. Dies bedeutet, dass alle anderen Mitglieder Ihres Teams diese Datei freigeben können und Sie sicher sind, dass alle mit derselben Umgebungskonfiguration arbeiten.

Interessanterweise können Vagrant und Docker tatsächlich kostenlos sein. Vagrant kann erweitert werden, um verschiedene Virtualisierungsanbieter zu unterstützen, und es ist möglich, dass Docker ein solcher Anbieter ist, der in naher Zukunft Unterstützung erhält. Aktuelle Informationen zu diesem Thema finden Sie unter https://github.com/dotcloud/docker/issues/404 .


7
Leute, ich habe einen experimentellen Vagabund-Anbieter für Docker veröffentlicht: github.com/fgrehm/docker-provider .
fgrehm

2
Docker ist keine Virtualisierung, sondern führt das Betriebssystem in einem eigenen Container mit demselben Host-Kernel aus. Es ist auch kein Anbieter wie andere VMs, sodass Docker bereits von Vagrant unterstützt wird.
Aftab Naveed

1
Docker ist die Virtualisierung des Betriebssystems selbst, bei der die zugrunde liegende Hardware implizit wiederverwendet wird. Es ist Virtualisierung, da es das Dateisystem, das Netzwerk und die Prozesse, die in einem Container ausgeführt werden, abstrahiert und isoliert.
Jose.angel.jimenez

63

Sie ergänzen sich sehr gut.

Ich verwende seit mehreren Monaten eine Kombination aus VirtualBox, Vagrant und Docker für alle meine Projekte und habe die folgenden Vorteile stark gespürt.

In Vagrant können Sie jede Chef-Solo-Bereitstellung vollständig abschaffen. Alles, was Sie für Ihre Vagrant-Datei benötigen, ist die Vorbereitung eines Computers, auf dem ein einzelnes kleines Shell-Skript ausgeführt wird, mit dem Docker installiert wird. Dies bedeutet, dass meine Vagrantfiles für jedes Projekt fast identisch und sehr einfach sind.

Hier ist ein typisches Vagrantfile

# -*- 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

Die Bootstrap-Datei, die Docker installiert, sieht folgendermaßen aus

#!/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

Um nun alle Dienste auszuführen, die ich zum Ausführen benötige, habe ich ein docker_start-Skript, das ungefähr so ​​aussieht

#!/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"

In diesem Beispiel verwende ich MongoDB, Elastisearch, RabbitMQ und Memcached

Eine Nicht-Docker-Chef-Solokonfiguration wäre erheblich komplizierter.

Ein letztes großes Plus ergibt sich, wenn Sie in die Produktion einsteigen und die Entwicklungsumgebung auf eine Infrastruktur von Hosts übertragen, die alle gleich sind, da sie nur über genügend Konfiguration verfügen, um Docker auszuführen, was in der Tat sehr wenig Arbeit bedeutet.

Wenn Sie interessiert sind, habe ich einen ausführlicheren Artikel über die Entwicklungsumgebung auf meiner eigenen Website unter

Implementierung einer Vagrant / Docker-Entwicklungsumgebung


2
Sie haben die gesamte docker_start-Orchestrierung durchgeführt, sich aber nicht die Mühe gemacht, die Container miteinander zu verknüpfen. Verwenden Sie nur fest codierte Portnummern, weil Sie diese unter Vagrant ausführen?
WineSoaked

6
Hallo WineSoaked, das obige Beispiel zeigt nicht den Container, der tatsächlich alle diese Dienste verwendet. Wenn Sie sich den erwähnten Blog-Beitrag ansehen, gibt es ein anderes Skript-Skript / vagrant / docker_web, das den Entwicklungscontainer für das Projekt startet. Dies verwendet in der Tat --link für den Docker-Ausführungsbefehl, und das Rails-Projekt verwendet die vom Docker injizierten Umgebungsvariablen, um eine Verbindung zu den Diensten herzustellen.
Mark Stratmann

1
Ich kann das Potenzial erkennen, beide Produkte zusammenzuführen. Vagrant als Umgebungstest und Docker für App Wrapper. Wenn Sie beide zusammenführen, können Sie eine einzelne App oder einen Komponententest in vielen Szenarien testen. Ich denke, viele "Testplattformdienste" verwenden derzeit Vagrant + Docker.
m3nda

8
"Sie sind sehr kostenlos." - Beide können tatsächlich kostenlos verwendet werden.
Underyx

2
Hallo @koppor, ich habe die Docker-Maschine vor ungefähr drei Monaten zum letzten Mal benutzt und bin noch nicht darauf zurückgekommen. Das Problem, das ich hatte, war, dass es einen Fehler bei der Freigabe von Ordnern von meinem MAC-Host-Host an die VM gibt, auf der Docker ausgeführt wird, wenn der VMWare-Treiber verwendet wird. Dies bedeutete, dass ich den Code auf dem Mac nicht lokal bearbeiten konnte und die Änderungen im Docker-Container angezeigt wurden. Ich weiß nicht, ob sie es noch behoben haben, wenn sie es tun, werde ich tatsächlich darauf umsteigen. Ich habe jedoch meine gesamte Container-Orchestrierung auf Docker Compose umgestellt, seit ich diese Antwort geschrieben habe
Mark Stratmann,

53

Vagrant-lxc ist ein Plugin für Vagrant, mit dem Sie LXC verwenden können, um Vagrant bereitzustellen . Es verfügt nicht über alle Funktionen der Standard-Vagrant-VM (VirtualBox), sollte Ihnen jedoch mehr Flexibilität bieten als Docker-Container. Der Link enthält ein Video, das seine sehenswerten Funktionen zeigt.


5
Und hier ist ein direkter Link zum Projekt github.com/fgrehm/vagrant-lxc
gertas

46

Mit Vagrant können Sie jetzt Docker als Anbieter haben. http://docs.vagrantup.com/v2/docker/ . Der Docker-Anbieter kann anstelle von VirtualBox oder VMware verwendet werden.

Bitte beachten Sie, dass Sie Docker auch für die Bereitstellung mit Vagrant verwenden können. Dies unterscheidet sich stark von der Verwendung von Docker als Anbieter. http://docs.vagrantup.com/v2/provisioning/docker.html

Dies bedeutet, dass Sie Chef oder Puppet durch Docker ersetzen können . Sie können Kombinationen wie Docker als Provider (VM) mit Chef als Provisioner verwenden. Oder Sie können VirtualBox als Provider und Docker als Provisioner verwenden.


23
Die Welt ist einfach verrückt geworden;) Wir können Vagrant mit Docker Provider ausführen, um Docker-Container in Vagrant auszuführen
Andrzej Rehmann

@zainengineer, verwendet der Docker-Anbieter für Vagrant unter Windows immer noch boot2docker oder verwendet er eine Variante der Docker Toolbox?
Derek Mahar

@zainengineer Haben Sie Links zu illustrativen Beispielen (keine vagabundierenden Dokumente)?
Wlad

16

Die Verwendung von beiden ist ein wichtiger Bestandteil der Prüfung der Anwendungsbereitstellung. Ich fange gerade erst an, mich mit Docker zu beschäftigen und denke sehr intensiv über ein Anwendungsteam nach, das eine schreckliche Komplexität beim Erstellen und Bereitstellen seiner Software aufweist. Stellen Sie sich eine klassische Phoenix Project / Continuous Delivery-Situation vor.

Das Denken geht ungefähr so:

  • Nehmen Sie eine Java / Go-Anwendungskomponente und erstellen Sie sie als Container (beachten Sie, dass Sie nicht sicher sind, ob die App im Container erstellt oder dann im Container installiert werden soll).
  • Liefern Sie den Container an eine Vagrant-VM.
  • Wiederholen Sie dies für alle Anwendungskomponenten.
  • Iterieren Sie die Komponenten, gegen die codiert werden soll.
  • Testen Sie kontinuierlich den Übermittlungsmechanismus für die von Vagrant verwalteten VMs
  • Schlafen Sie gut und wissen Sie, wann es Zeit ist, den Container bereitzustellen, dass Integrationstests viel kontinuierlicher durchgeführt wurden als vor Docker.

Dies scheint die logische Erweiterung von Mitchells Aussage zu sein, dass Vagrant für die Entwicklung in Kombination mit Farley / Humbles-Denken in Continuous Delivery bestimmt ist. Wenn ich als Entwickler die Rückkopplungsschleife für Integrationstests und Anwendungsbereitstellung verkleinern kann, werden eine höhere Qualität und bessere Arbeitsumgebungen folgen.

Die Tatsache, dass ich als Entwickler ständig und konsequent Container an die VM liefere und die Anwendung ganzheitlicher teste, bedeutet, dass Produktionsversionen weiter vereinfacht werden.

Ich sehe Vagrant als eine Möglichkeit, einige der großartigen Konsequenzen zu nutzen, die Docker für die App-Bereitstellung haben wird.


Haben Sie zufällig einen Blog-Beitrag dazu? Es ist jetzt fast zwei Jahre her, wie läuft es? Verwenden Sie immer noch Vagrant mit Docker oder nur Docker und Docker-Fleat / Maschine?
Andrzej Rehmann

Die Firma, für die ich arbeitete, wurde übernommen und alle meine Inhalte @Hoto entfernt. Die kurze Antwort lautet: Ich benutze die Docker-Maschine zu Hause für meine Haustierprojekte. Bei der Arbeit bin ich <gulp> Manager </ gulp> und mache nicht viel Technik. Wir haben keine Pläne, Docker zu verwenden, daher ist unser Tool im Allgemeinen Vagrant.
Boyd Hemphill

10

Auf jeden Fall Docker für den Sieg!

Wie Sie vielleicht wissen, ist Vagrant für die Verwaltung virtueller Maschinen vorgesehen, während Docker für die Verwaltung von Software-Containern vorgesehen ist. Wenn Sie den Unterschied nicht kennen, gilt Folgendes: Ein Software-Container kann denselben Computer und Kernel mit anderen Software-Containern gemeinsam nutzen. Mit Containern sparen Sie Geld, da Sie keine Ressourcen auf mehreren Betriebssystemen (Kerneln) verschwenden. Sie können mehr Software pro Server packen und dabei ein gutes Maß an Isolation bewahren.

Natürlich ist es eine neue Disziplin, sich um ihre eigenen Probleme und Herausforderungen zu kümmern.

Entscheiden Sie sich für Docker Swarm, wenn Ihre Anforderungen das Ressourcenlimit für einzelne Computer überschreiten.


8

Im aktuellen Oracle Java-Magazin gibt es einen wirklich informativen Artikel über die Verwendung von Docker in Kombination mit Vagrant (und Puppet):

Fazit

Die leichten Container von Docker sind im Vergleich zu klassischen VMs schneller und bei Entwicklern sowie im Rahmen von CD- und DevOps-Initiativen beliebt. Wenn Ihr Zweck die Isolation ist, ist Docker eine ausgezeichnete Wahl. Vagrant ist ein VM-Manager, mit dem Sie Konfigurationen einzelner VMs skripten und die Bereitstellung durchführen können. Es ist jedoch immer noch eine VM, die von VirtualBox (oder einem anderen VM-Manager) abhängig ist und einen relativ hohen Overhead aufweist. Es erfordert eine Festplatte im Leerlauf, die sehr groß sein kann, viel RAM benötigt und die Leistung möglicherweise nicht optimal ist. Docker verwendet Kernel-Gruppen und Namespace-Isolation über LXC. Dies bedeutet, dass Sie denselben Kernel wie den Host und dasselbe Ile-System verwenden. Vagrant ist in Bezug auf die Abstraktion eine Stufe über Docker, daher sind sie nicht wirklich vergleichbar. Konfigurationsmanagement-Tools wie Puppet werden häufig zur Bereitstellung von Zielumgebungen verwendet. Die Wiederverwendung vorhandener Puppet-basierter Lösungen ist mit Docker einfach. Sie können Ihre Lösung auch in Scheiben schneiden, sodass die Infrastruktur mit Puppet bereitgestellt wird. Die Middleware, die Geschäftsanwendung selbst oder beide werden mit Docker bereitgestellt. und Docker wird von Vagrant eingewickelt. Mit dieser Reihe von Tools können Sie das tun, was für Ihr Szenario am besten ist.

Erstellen, Verwenden und Orchestrieren von Docker-Containern in DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0


1
Es fehlten so viele T's
Paul Verest
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.