Czy powinienem używać Vagrant lub Docker do tworzenia izolowanego środowiska? [Zamknięte]


2083

Używam Ubuntu do programowania i wdrażania i potrzebuję stworzyć izolowane środowisko.

W tym celu rozważam Vagrant lub Docker. Jakie są zalety i wady lub jak się różnią te rozwiązania?


27
Oba można teraz łączyć
Alp

78
Twoje pytanie jest na tyle szczęśliwe, że otrzymałem odpowiedzi obu autorów na dwie usługi: Mitchell i Solomon
Hykes

4
Chciałbym podać nowe streszczenie - pytanie jest w większości błędne. Prawidłowe pytanie brzmi: czy powinienem używać Vagrant lub kompilatora dokerów do stworzenia izolowanego środowiska? Odpowiedź jest taka, że ​​Vagrant i docker-compose wykonują to samo zadanie opisywania środowisk, a zamiast tego powinieneś raczej porównać Docker do Virtualbox. Różnica polega na tym, że Vagrant może korzystać z dowolnej wirtualizacji, takiej jak Docker, VMWare, Virtualbox w systemie Windows, Linux lub OSX, ale komponowanie Docker może po prostu używać obrazów Docker opartych na systemie Linux.
PHZ.fi-Pharazon

Dla mnie odpowiedź brzmi: „Jak ważna jest dla Ciebie szybkość w regularnych czynnościach roboczych”. Uważam, że Vagrant jest wolniejszy niż Docker. W przypadku dokera, szczególnie po początkowym pobraniu, podejście do pamięci podręcznej i warstw dokera sprawia, że ​​korzystanie z niego jest dla mnie najłatwiejsze i najszybsze
Michael Durrant

Odpowiedzi:


1155

Jeśli twoim celem jest izolacja, myślę, że Docker jest tym, czego chcesz.

Vagrant to menedżer maszyn wirtualnych. Pozwala na skryptowanie konfiguracji maszyny wirtualnej, a także obsługi administracyjnej. Jednak nadal jest to maszyna wirtualna, w zależności od VirtualBox (lub innych), z ogromnym narzutem. Wymaga pliku dysku twardego, który może być ogromny, zajmuje dużo pamięci RAM, a wydajność może nie być bardzo dobra.

Z drugiej strony Docker używa cgroup jądra i przestrzeni nazw przez LXC . Oznacza to, że używasz tego samego jądra co host i ten sam system plików. Możesz użyć Dockerfile z docker buildpoleceniem, aby obsłużyć obsługę administracyjną i konfigurację swojego kontenera. Na stronie docs.docker.com masz przykład, jak utworzyć plik Docker; to jest bardzo intuicyjne.

Jedynym powodem, dla którego możesz chcieć użyć Vagrant, jest to, że musisz wykonać BSD, Windows lub inne niż Linuksowe prace rozwojowe na swoim Ubuntu. W przeciwnym razie wybierz Docker.


13
Niestety jeszcze nie. Jeśli korzystasz z systemu 32-bitowego, będziesz potrzebować maszyny wirtualnej z 64-bitowym systemem-gościem, aby uruchomić dokera. Jednak w wersji go1.1 obsługa 32-bitowych poprawia się i możliwe jest, że doker niedługo wesprze 32-bitowy arch
skrzypienie

8
Dotyczy to komputerów Mac i Windows, ale od dokera 0.7 każda dystrybucja linuksa działa dobrze. Jeśli znasz niedziałający, daj mi znać. Ponadto, chyba że masz stos Maca lub Windowsa (co jest mało prawdopodobne, ale może się zdarzyć), nie chcesz uruchamiać Dockera nigdzie poza Linuksem. Klient dokera działa dobrze na Macu, wkrótce powinien działać na BSD, a demon ostatecznie będzie obsługiwał BSD, Solaris i Mac.
creack

9
Jeśli ktoś przeczyta te komentarze, powinieneś wiedzieć, że Docker osiągnął wersję 1.0 zaledwie 12 dni temu ( blog.docker.com/2014/06/its-here-docker-1-0 ) i wiele różnych platform jest stabilnych i obsługiwane teraz ( docs.docker.com/installation )
JorgeArtware

17
Vagrant ma LXC i dostawców dokerów. Jednak - włóczęga i doker to zasadniczo różne rzeczy. Vagrant jest przeznaczony wyłącznie do środowisk programistycznych, doker jest raczej do produkcji i tylko do Linuksa.
Dannyboy

2
Docker działa teraz w systemie Windows 10 Pro i nowszych oraz Windows Server 2016. Właśnie zaktualizowałem system Windows 10 Home do systemu Windows 10 Pro i zainstalowałem aplikację dokującą. Mogę teraz uruchamiać obrazy dokerów systemu Linux w systemie Windows 10. Jest genialny!
PrestonDocks,

2339

Uwaga: Napisałem Vagrant! Ale ponieważ napisałem Vagrant, większość czasu spędzam żyjąc w świecie DevOps, który zawiera oprogramowanie takie jak Docker. Pracuję z wieloma firmami używającymi Vagrant, a wiele używa Dockera i widzę, jak te dwie rzeczy się ze sobą łączą.

Zanim zacznę za dużo mówić, bezpośrednia odpowiedź: w twoim konkretnym scenariuszu (sam pracujesz, pracujesz na Linuksie, używasz Dockera w produkcji), możesz trzymać się samego Dockera i uprościć sprawy. W wielu innych scenariuszach (omawiam dalej) nie jest to takie łatwe.

Niepoprawne jest bezpośrednie porównywanie Vagrant do Dockera. W niektórych scenariuszach pokrywają się, aw zdecydowanej większości nie. W rzeczywistości bardziej trafnym porównaniem byłoby Vagrant kontra coś takiego jak Boot2Docker (minimalny system operacyjny, który może obsługiwać Docker). Vagrant to poziom powyżej Dockera pod względem abstrakcji, więc w większości przypadków nie jest to uczciwe porównanie.

Vagrant wprowadza rzeczy do uruchamiania aplikacji / usług w celu rozwoju. Może to być na VirtualBox, VMware. Może być zdalny jak AWS, OpenStack. Jeśli używasz kontenerów, Vagrant nie dba o to i obejmuje to: może na przykład automatycznie instalować, rozkładać, budować i uruchamiać kontenery Docker. W Vagrant 1.6 Vagrant ma środowiska programistyczne oparte na dokerze i obsługuje Docker z takim samym obiegiem pracy jak Vagrant w systemach Linux, Mac i Windows. Vagrant nie próbuje tutaj zastąpić Dockera, obejmuje praktyki Dockera.

Docker w szczególności obsługuje kontenery Docker. Jeśli porównujesz bezpośrednio do Vagrant: jest to w szczególności bardziej szczegółowe (można uruchomić tylko kontenery Docker), mniej elastyczne (wymaga Linuxa lub hosta Linuxa). Oczywiście, jeśli mówisz o produkcji lub CI, nie ma porównania do Vagrant! Vagrant nie mieszka w tych środowiskach, dlatego należy użyć Dockera.

Jeśli Twoja organizacja obsługuje tylko kontenery Docker dla wszystkich swoich projektów i ma tylko programistów działających w systemie Linux, to dobrze, Docker może na pewno działać dla Ciebie!

W przeciwnym razie nie widzę korzyści z próby korzystania z Dockera w pojedynkę, ponieważ tracisz wiele z tego, co Vagrant ma do zaoferowania, które mają realne korzyści biznesowe / produkcyjne:

  • Vagrant może uruchamiać maszyny VirtualBox, VMware, AWS, OpenStack itp. Nie ma znaczenia, czego potrzebujesz, Vagrant może go uruchomić. Jeśli używasz Dockera, Vagrant może zainstalować Docker na dowolnym z nich, abyś mógł z nich korzystać w tym celu.

  • Vagrant to pojedynczy przepływ pracy dla wszystkich twoich projektów. Innymi słowy, ludzie muszą się uczyć prowadzenia projektu, niezależnie od tego, czy znajduje się on w kontenerze Docker, czy nie. Jeśli, na przykład, w przyszłości powstanie konkurent, aby konkurować bezpośrednio z Dockerem, Vagrant będzie mógł go uruchomić.

  • Vagrant działa w systemach Windows (powrót do XP), Mac (powrót do 10.5) i Linux (powrót do jądra 2.6). We wszystkich trzech przypadkach przepływ pracy jest taki sam. Jeśli korzystasz z Dockera, Vagrant może uruchomić maszynę (VM lub zdalną), która może uruchomić Docker na wszystkich trzech tych systemach.

  • Vagrant wie, jak skonfigurować niektóre zaawansowane lub nietrywialne rzeczy, takie jak tworzenie sieci i synchronizowanie folderów. Na przykład: Vagrant wie, jak dołączyć statyczny adres IP do komputera lub portów przesyłania dalej, a konfiguracja jest taka sama bez względu na używany system (VirtualBox, VMware itp.). W przypadku zsynchronizowanych folderów Vagrant zapewnia wiele mechanizmów uzyskiwania lokalnych pliki do zdalnego komputera (foldery współdzielone VirtualBox, NFS, rsync, Samba [wtyczka] itp.). Jeśli używasz Dockera, nawet Dockera z maszyną wirtualną bez Vagranta, musisz to zrobić ręcznie lub w takim przypadku musielibyście wynaleźć Vagrant.

  • Vagrant 1.6 ma doskonałą obsługę środowisk programistycznych opartych na dokerach . To nie uruchomi maszyny wirtualnej w systemie Linux i automatycznie uruchomi maszynę wirtualną na komputerach Mac i Windows. Efektem końcowym jest to, że praca z Dockerem jest jednolita na wszystkich platformach, podczas gdy Vagrant nadal obsługuje żmudne szczegóły takich rzeczy, jak sieć, synchronizowane foldery itp.

Aby odnieść się do konkretnych kontrargumentów, które słyszałem na korzyść używania Dockera zamiast Vagrant:

  • „Jest mniej ruchomych części” - Tak, może być, jeśli używasz Dockera wyłącznie do każdego projektu. Nawet wtedy poświęcenie elastyczności dla blokady Docker. Jeśli kiedykolwiek zdecydujesz się nie używać Dockera w żadnym projekcie, przeszłości, teraźniejszości lub przyszłości, będziesz mieć więcej ruchomych części. Jeśli używałeś Vagrant, masz tę jedną ruchomą część, która wspiera resztę.

  • "To jest szybsze!" - Gdy masz hosta, który może obsługiwać kontenery Linux, Docker jest zdecydowanie szybszy w uruchamianiu kontenera niż uruchomienie jakiejkolwiek maszyny wirtualnej. Ale uruchomienie maszyny wirtualnej (lub maszyny zdalnej) to jednorazowy koszt. W ciągu dnia większość użytkowników Vagrant nigdy nie niszczy swoich maszyn wirtualnych. Jest to dziwna optymalizacja dla środowisk programistycznych. W produkcji, w której Docker naprawdę błyszczy, rozumiem potrzebę szybkiego obracania kontenerów w górę / w dół.

Mam nadzieję, że teraz wyraźnie widać, że porównanie Dockera z Vagrantem jest bardzo trudne i uważam, że to nieprawda. W środowiskach programistycznych Vagrant jest bardziej abstrakcyjny, bardziej ogólny. Docker (i różne sposoby, dzięki którym zachowuje się jak Vagrant) jest szczególnym przypadkiem użycia Vagrant, ignorując wszystko, co Vagrant ma do zaoferowania.

Podsumowując: w bardzo specyficznych przypadkach użycia Docker jest z pewnością możliwym zamiennikiem Vagrant. W większości przypadków tak nie jest. Vagrant nie utrudnia korzystania z Dockera; robi to, co w jego mocy, aby to doświadczenie było płynniejsze. Jeśli okaże się, że to nieprawda, chętnie przyjmę sugestie dotyczące ulepszeń, ponieważ celem Vagrant jest równa praca z dowolnym systemem.

Mam nadzieję, że to wszystko wyjaśni!


4
@JaredMarkell Myślę, że może szuka usługi internetowej, która pozwala mu zarządzać swoimi maszynami Vagrant, takimi jak Protobox .
Ryan Kennedy

73
@ Mitchell Chciałem tylko podziękować za wyjaśnienie tego tak szczegółowo. Oczywiście nie możesz być całkowicie obiektywny, więc doceniam to, że poświęciłeś czas na wyjaśnienie niuansów i różnych sytuacji, w których można je wykorzystać. Myślę, że wiele zamieszania wokół różnych narzędzi dzisiaj polega na tym, że nakładają się one na siebie i wiele osób chce uniwersalnego rozwiązania, w którym ktoś po prostu mówi im, co mają robić i mogą je wdrożyć. Piękno twojej odpowiedzi polega na tym, że odpowiada ona na podstawowe pytanie: jak mogę stworzyć izolowane środowisko? (niezależnie od narzędzi).
Jordan

4
@JaredMarkell Docker ma interfejs API REST docs.docker.com/reference/api/docker_remote_api
Tarnay Kálmán

3
@ OğuzÇelikdemir Vagrant może zrobić znacznie więcej. Oczywiście, jeśli przygotujesz określoną maszynę wirtualną dla każdego projektu, będzie to trwało. Ale podczas programowania często kończę na dodawaniu większej liczby usług / demonów / ustawień (np. Kiedy decyduję się użyć RabbitMQ do projektu podczas programowania). Podejście oparte wyłącznie na VM wymaga przygotowania nowego obrazu, z zainstalowanym i skonfigurowanym RabbitMQ, i zmusza programistów do zmiany maszyny wirtualnej na nową. Dla Vagrant - dodaję odpowiednie wiersze w Vagrant confguration i wszyscy programiści mogą łatwo aktualizować swoje maszyny wirtualne (używając vagrant provision).
Tomasz Struczyński

5
(Masz na myśli „ujawnienie”, ujawnienie czegoś ważnego, a nie „wyłączenie odpowiedzialności”, zaprzeczenie odpowiedzialności: english.stackexchange.com/q/115850 )
Jerry101

1418

Jestem autorem Dockera.

Krótka odpowiedź brzmi: jeśli chcesz zarządzać maszynami, powinieneś użyć Vagrant. A jeśli chcesz budować i uruchamiać środowiska aplikacji, powinieneś użyć Dockera.

Vagrant to narzędzie do zarządzania maszynami wirtualnymi. Docker to narzędzie do budowania i wdrażania aplikacji poprzez pakowanie ich w lekkie pojemniki. Kontener może pomieścić prawie każdy komponent oprogramowania wraz z jego zależnościami (pliki wykonywalne, biblioteki, pliki konfiguracyjne itp.) I wykonywać go w gwarantowanym i powtarzalnym środowisku wykonawczym. Dzięki temu bardzo łatwo można zbudować aplikację raz i wdrożyć ją w dowolnym miejscu - na laptopie w celu przetestowania, a następnie na różnych serwerach w celu wdrożenia na żywo itp.

To powszechne błędne przekonanie, że Docker można używać tylko w systemie Linux. To jest niepoprawne; możesz także zainstalować Docker na Macu i Windowsie. Po zainstalowaniu na komputerze Mac Docker dołącza małą maszynę wirtualną z systemem Linux (25 MB na dysku!), Która działa jak opakowanie dla twojego kontenera. Po zainstalowaniu jest całkowicie przezroczysty; możesz użyć wiersza polecenia Docker w dokładnie taki sam sposób. To daje najlepsze z obu światów: możesz testować i rozwijać swoją aplikację za pomocą kontenerów, które są bardzo lekkie, łatwe do przetestowania i łatwe do przenoszenia (patrz na przykład https://hub.docker.com na temat udostępniania pojemników wielokrotnego użytku z społeczność Dockerów) i nie musisz martwić się drobiazgowymi szczegółami zarządzania maszynami wirtualnymi, które i tak są tylko środkiem do celu.

Teoretycznie można użyć Vagrant jako warstwy abstrakcji dla Dockera. Odradzam to z dwóch powodów:

  • Po pierwsze, Vagrant nie jest dobrą abstrakcją dla Dockera. Vagrant został zaprojektowany do zarządzania maszynami wirtualnymi. Docker został zaprojektowany do zarządzania środowiskiem wykonawczym aplikacji. Oznacza to, że Docker z założenia może współdziałać z aplikacją w bogatszy sposób i ma więcej informacji na temat środowiska wykonawczego aplikacji. Prymitywami w Dockerze są procesy, strumienie dziennika, zmienne środowiskowe i połączenia sieciowe między komponentami. Prymitywami w Vagrant są maszyny, urządzenia blokowe i klucze ssh. Vagrant po prostu siedzi niżej na stosie, a jedynym sposobem, w jaki może wchodzić w interakcję z kontenerem, jest udawanie, że jest to inny rodzaj maszyny, którą można „uruchomić” i „zalogować się”. Oczywiście możesz wpisać „włóczęgostwo” za pomocą wtyczki Docker, a wydarzy się coś ładnego. Czy jest to substytut pełnego zakresu możliwości Dockera? Spróbuj natywnego Dockera przez kilka dni i przekonaj się sam :)

  • Po drugie, argument blokujący. „Jeśli użyjesz Vagrant jako abstrakcji, nie zostaniesz zamknięty w Dockerze!”. Z punktu widzenia Vagrant, który jest przeznaczony do zarządzania maszynami, ma to doskonały sens: czy kontenery nie są po prostu innym rodzajem maszyny? Podobnie jak Amazon EC2 i VMware, musimy uważać, aby nie wiązać naszych narzędzi do udostępniania z żadnym konkretnym dostawcą! To stworzy blokadę - lepiej wyodrębnić to wszystko za pomocą Vagrant. Tyle że całkowicie pomija sens Dockera. Docker nie udostępnia maszyn; otacza twoją aplikację lekkim przenośnym środowiskiem uruchomieniowym, które można upuścić w dowolnym miejscu.

Jakie środowisko wykonawcze wybierzesz dla swojej aplikacji, nie ma nic wspólnego z tym, jak udostępniasz swoje maszyny! Na przykład dość często wdraża się aplikacje na komputerach, które są udostępniane przez kogoś innego (na przykład instancja EC2 wdrożona przez administratora systemu, być może za pomocą Vagrant), lub na komputerach bez systemu operacyjnego, których Vagrant nie może w ogóle udostępnić. I odwrotnie, możesz używać Vagrant do udostępniania maszyn, które nie mają nic wspólnego z tworzeniem aplikacji - na przykład gotowym do użycia pudełkiem Windows IIS lub czymś podobnym. Lub możesz użyć Vagrant do udostępniania maszyn dla projektów, które nie używają Dockera - być może używają kombinacji rubygemów i rvm na przykład do zarządzania zależnościami i piaskownicy.

Podsumowując: Vagrant służy do zarządzania komputerami, a Docker służy do budowania i uruchamiania środowisk aplikacji.


396
Chciałem tylko zauważyć, że błędne aspekty tej odpowiedzi są nieprawidłowe. Vagrant nie służy do zarządzania maszynami, Vagrant służy do zarządzania środowiskami programistycznymi. Fakt, że Vagrant obraca maszyny, jest przeważnie historyczny. Następna wersja Vagrant ma wsparcie pierwszej klasy w celu zwiększenia środowiska programistycznego przy użyciu Docker jako dostawcy bezpośrednio na hoście lub dowolnej maszynie wirtualnej (Mac, Win). Może także rozpędzić surowy LXC, jeśli tego właśnie chce ktoś (ponownie, na hoście lub maszynie wirtualnej). Firma Vagrant jest zainteresowana robieniem tego, co najlepsze, aby stworzyć przenośne środowisko programistyczne, niezależnie od tego, czy oznacza to utworzenie maszyny wirtualnej, czy nie.
Mitchell,

7
@Davide Omówiono to bardziej szczegółowo: vagrantup.com/blog/…
Mitchell

48
„To powszechne błędne przekonanie, że Dockera można używać tylko w systemie Linux”. To prawda, ale można powiedzieć, że można używać Linuksa tylko w Dockerze. Jeśli chcę skonfigurować testera, który ćwiczy moją aplikację w wielu różnych konfiguracjach środowiska (różne bazy danych, wersje php, buforowanie backendów itp.), Mogę to łatwo zrobić z kontenerami dokerów. Ale nie mogę sprawdzić, czy moja aplikacja będzie działać poprawnie w środowisku Windows IIS env lub na BSD lub OSX.
Mixologic

10
Twój pierwszy punkt jest nieaktualny, ponieważ Vagrant ma wbudowaną obsługę dostawcy dokera
Alp

19
Post jest nieaktualny. Vagrant obsługuje teraz Docker jako dostawcę. Jest też kilka filmów pokazujących, jak można używać Vagrant i Docker zgodnie na ich blogu .
sargas

86

Przedkładam moją odpowiedź, przyznając, że nie mam doświadczenia z Dockerem, poza tym, że jestem zapalonym obserwatorem tego, co wydaje się być naprawdę schludnym rozwiązaniem, które zyskuje dużą przyczepność.

Mam spore doświadczenie z Vagrant i mogę go bardzo polecić. Z pewnością jest to rozwiązanie o większej wadze, ponieważ oparte jest na VM zamiast na LXC. Jednak znalazłem przyzwoity laptop (8 GB pamięci RAM, procesor i5 / i7) nie ma problemów z uruchomieniem maszyny wirtualnej za pomocą Vagrant / VirtualBox wraz z narzędziami programistycznymi.

Jedną z naprawdę świetnych rzeczy w Vagrant jest integracja ze skryptami Puppet / Chef / shell do automatyzacji konfiguracji. Jeśli używasz jednej z tych opcji, aby skonfigurować środowisko produkcyjne, możesz utworzyć środowisko programistyczne, które będzie tak samo identyczne, jak to tylko możliwe, i właśnie tego chcesz.

Inną wspaniałą rzeczą w Vagrant jest to, że możesz wersjonować swój plik Vagrant wraz z kodem aplikacji. Oznacza to, że wszyscy inni w zespole mogą udostępniać ten plik i masz gwarancję, że wszyscy pracują z tą samą konfiguracją środowiska.

Co ciekawe, Vagrant i Docker mogą faktycznie być komplementarne. Vagrant może zostać rozszerzony o obsługę różnych dostawców wirtualizacji i możliwe, że Docker jest jednym z takich dostawców, który otrzyma wsparcie w najbliższej przyszłości. Najnowsze dyskusje na ten temat można znaleźć na stronie https://github.com/dotcloud/docker/issues/404 .


7
Chłopaki, wypuściłem eksperymentalnego, włóczęgowskiego dostawcę dokera : github.com/fgrehm/docker-provider .
fgrehm

2
Docker nie jest wirtualizacją, ale uruchamia system operacyjny we własnym kontenerze, używając tego samego jądra hosta, nie jest ani dostawcą, jak inne maszyny wirtualne, więc docker jest już obsługiwany przez Vagrant.
Aftab Naveed

1
Docker to wirtualizacja samego systemu operacyjnego, domyślnie wykorzystująca sprzęt. Jest wirtualizacją, ponieważ wyodrębnia i izoluje system plików, sieć i procesy uruchomione w kontenerze.
jose.angel.jimenez 21.04.16

63

Są bardzo komplementarne.

Używam kombinacji VirtualBox, Vagrant i Docker do wszystkich moich projektów od kilku miesięcy i mocno odczuwam następujące korzyści.

W Vagrant możesz całkowicie zrezygnować z samodzielnej obsługi administracyjnej Chef, a wszystko, czego potrzebujesz, aby zrobić swój błędny plik, to przygotować maszynę, która uruchomi pojedynczy mały skrypt powłoki, który zainstaluje dokera. Oznacza to, że moje pliki Vagrant dla każdego projektu są prawie identyczne i bardzo proste.

Oto typowy plik 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

Plik Bootstrap, który instaluje okno dokowane, wygląda następująco

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

Teraz, aby uzyskać wszystkie usługi, których potrzebuję, mam skrypt docker_start, który wygląda mniej więcej tak

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

W tym przykładzie używam MongoDB, Elastisearch, RabbitMQ i Memcached

Konfiguracja pojedynczego szefa kuchni bez dokera byłaby znacznie bardziej skomplikowana.

Ostatni duży plus jest uzyskiwany, gdy przenosisz się do produkcji, przekładając środowisko programistyczne na infrastrukturę hostów, które są takie same, ponieważ mają wystarczającą konfigurację, aby uruchomić dokera, co naprawdę oznacza bardzo niewiele pracy.

Jeśli jesteś zainteresowany, mam bardziej szczegółowy artykuł na temat środowiska programistycznego na mojej własnej stronie internetowej

Wdrażanie środowiska programistycznego Vagrant / Docker


2
Zrobiłeś całą tę aranżację docker_start, ale nie zawracałeś sobie głowy łączeniem kontenerów. Czy używasz tylko zakodowanych numerów portów, ponieważ korzystasz z Vagrant?
WineSoaked

6
Cześć WineSoaked, powyższy przykład nie pokazuje kontenera, który faktycznie korzysta ze wszystkich tych usług. Jeśli spojrzysz na wspomniany post na blogu, istnieje inny skrypt skryptowy / vagrant / docker_web, który uruchamia kontener programistyczny dla projektu. To rzeczywiście używa polecenia --link w poleceniu uruchomienia dokera, a projekt Rails wykorzystuje zmienne środowiskowe wstrzyknięte przez dokera do połączenia się z usługami.
Mark Stratmann

1
Widzę potencjał łączenia obu produktów. Vagrant jako testowanie środowiska i okno dokowane dla opakowania aplikacji. Łącząc oba, możesz przetestować pojedynczą aplikację lub test jednostkowy na wielu escenariach. Myślę, że wiele „usług platform testowych” korzysta jednocześnie z Vagrant + Docker.
m3nda

8
„Są bardzo komplementarne”. - Rzeczywiście, oba są bezpłatne.
Underyx

2
Cześć @koppor Ostatnio użyłem maszyny dokującej około trzy miesiące temu i jeszcze do niej nie wróciłem. Problem, który miałem, polegał na tym, że ma błąd we współdzieleniu folderów z mojego hosta MAC na uruchomionej dokerze VM podczas korzystania ze sterownika VMWare. Oznaczało to, że nie mogłem edytować kodu lokalnie na komputerze Mac i zmiany zostały odzwierciedlone w kontenerze dokera. Nie wiem, czy już to naprawili, kiedy to zrobię, rzeczywiście się na to przerzucę. Jednak od napisania tej odpowiedzi
zmieniłem

53

Vagrant-lxc to wtyczka do Vagrant, która pozwala używać LXC do udostępniania Vagrant. Nie ma wszystkich funkcji, które ma domyślna wirtualna maszyna wirtualna (VirtualBox), ale powinna zapewnić większą elastyczność niż kontenery dokerów. W linku znajduje się film pokazujący jego możliwości, które warto obejrzeć.


5
I tutaj jest bezpośredni link do projektu github.com/fgrehm/vagrant-lxc
gertas

46

Dzięki Vagrant możesz teraz mieć Dockera jako dostawcę. http://docs.vagrantup.com/v2/docker/ . Zamiast VirtualBox lub VMware można użyć dostawcy Docker.

Pamiętaj, że możesz także użyć Dockera do obsługi Vagrant. To bardzo różni się od używania Dockera jako dostawcy. http://docs.vagrantup.com/v2/provisioning/docker.html

Oznacza to, że możesz zastąpić szefa kuchni lub marionetkę dokerem. Możesz używać kombinacji takich jak Docker jako dostawca (VM) z Chef jako dostawca. Lub możesz użyć VirtualBox jako dostawcy i Docker jako dostawcy.


23
świat po prostu oszalał;) możemy uruchomić włóczęgę za pomocą dostawcy dokerów, aby uruchomić pojemniki dokujące wewnątrz włóczęgi
Andrzej Rehmann

@zainengineer, czy dostawca Docker dla Vagrant w systemie Windows nadal używa boot2docker, czy używa jakiegoś wariantu Docker Toolbox?
Derek Mahar

@zainengineer Czy masz jakieś linki do ilustrujących przykładów (nie włóczęgów)?
Wlad

16

Korzystanie z obu jest ważną częścią testowania dostarczania aplikacji. Zaczynam dopiero angażować się w Docker i bardzo intensywnie zastanawiam się nad zespołem aplikacji, który ma straszną złożoność w tworzeniu i dostarczaniu oprogramowania. Pomyśl o klasycznej sytuacji Phoenix Project / Continuous Delivery.

Myślenie wygląda mniej więcej tak:

  • Weź komponent aplikacji Java / Go i zbuduj go jako kontener (pamiętaj, nie jestem pewien, czy aplikacja powinna zostać wbudowana w kontener, czy zbudowana, a następnie zainstalowana w kontenerze)
  • Dostarcz pojemnik do Wirtualnej maszyny wirtualnej.
  • Powtórz to dla wszystkich składników aplikacji.
  • Iteruj na komponentach, które mają być kodowane.
  • Ciągle testuj mechanizm dostarczania do maszyn wirtualnych zarządzanych przez Vagrant
  • Śpij dobrze wiedząc, kiedy nadszedł czas na wdrożenie kontenera, że ​​testy integracyjne odbywały się o wiele bardziej nieprzerwanie niż przed Dockerem.

Wydaje się to logicznym rozszerzeniem stwierdzenia Mitchella, że ​​Vagrant jest przeznaczony do rozwoju w połączeniu z myśleniem Farleya / Humblesa w Continuous Delivery. Jeśli jako deweloper mogę zmniejszyć pętlę sprzężenia zwrotnego na temat testów integracji i dostarczania aplikacji, nastąpi poprawa jakości i lepszych środowisk pracy.

Fakt, że jako programista stale i konsekwentnie dostarczam kontenery do maszyny wirtualnej i bardziej całościowo testuję aplikację, oznacza, że ​​wydania produkcyjne zostaną jeszcze bardziej uproszczone.

Widzę więc, że Vagrant ewoluuje jako sposób na wykorzystanie niektórych niesamowitych konsekwencji, jakie Docker będzie miał dla wdrożenia aplikacji.


czy masz przypadek na blogu na ten temat? minęły już prawie dwa lata, jak leci? nadal używasz włóczęgi z dokerem, czy po prostu dokerem i dokerem-pchaczem / maszyną?
Andrzej Rehmann

Firma, dla której pracowałem, została przejęta i usunęli całą moją zawartość @Hoto. Krótka odpowiedź brzmi: używam maszyny dokującej w domu do moich domowych projektów. W pracy jestem <gulp> menedżerem </gulp> i nie zajmuję się zbytnio technologią. Nie mamy planów korzystania z Dockera, więc nasze narzędzie jest ogólnie Vagrant.
Boyd Hemphill,

10

Zdecydowanie Docker na zwycięstwo!

Jak zapewne wiesz, Vagrant służy do zarządzania maszynami wirtualnymi, natomiast Docker do zarządzania kontenerami oprogramowania. Jeśli nie zdajesz sobie sprawy z różnicy, oto: Kontener oprogramowania może współdzielić tę samą maszynę i jądro z innymi kontenerami oprogramowania. Używając kontenerów oszczędzasz pieniądze, ponieważ nie marnujesz zasobów na wiele systemów operacyjnych (jądra), możesz spakować więcej oprogramowania na serwer, zachowując dobry stopień izolacji.

Oczywiście jest to nowa dyscyplina, w której trzeba dbać o własne pułapki i wyzwania.

Wybierz Docker Swarm, jeśli twoje wymagania przekroczą limit zasobów pojedynczej maszyny.


8

W magazynie Oracle Java znajduje się bardzo pouczający artykuł na temat używania Dockera w połączeniu z Vagrant (i Puppet):

Wniosek

Lekkie kontenery Dockera są szybsze w porównaniu z klasycznymi maszynami wirtualnymi i stały się popularne wśród programistów oraz w ramach inicjatyw CD i DevOps. Jeśli Twoim celem jest izolacja, Docker jest doskonałym wyborem. Vagrant to menedżer maszyn wirtualnych, który umożliwia tworzenie skryptów konfiguracji poszczególnych maszyn wirtualnych, a także przeprowadzanie obsługi administracyjnej. Jest to jednak maszyna wirtualna zależna od VirtualBox (lub innego menedżera VM) ze stosunkowo dużym obciążeniem. Wymaga to bezczynności dysku twardego, która może być ogromna, zajmuje dużo pamięci RAM, a wydajność może być nieoptymalna. Docker używa grup grup jądra i izolacji przestrzeni nazw przez LXC. Oznacza to, że używasz tego samego jądra co host i tego samego systemu Ile. Vagrant jest poziomem powyżej Dockera pod względem abstrakcji, więc nie są tak naprawdę porównywalne. Narzędzia do zarządzania konfiguracją, takie jak Puppet, są szeroko stosowane do udostępniania środowisk docelowych. Ponowne wykorzystanie istniejących rozwiązań opartych na marionetkach jest łatwe dzięki Docker. Możesz także podzielić swoje rozwiązanie, aby infrastruktura została zaopatrzona w Puppet; oprogramowanie pośrednie, sama aplikacja biznesowa lub oba są dostarczane z Docker; a Docker jest owinięty przez Vagrant. Dzięki tej gamie narzędzi możesz robić to, co najlepsze w twoim scenariuszu.

Jak budować, używać i koordynować kontenery Docker w DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0


1
Tyle brakowało t
Paul Verest
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.