Vraag Moet ik Vagrant of Docker gebruiken voor het creëren van een geïsoleerde omgeving? [Gesloten]


Ik gebruik Ubuntu voor ontwikkeling en implementatie en heb behoefte aan het creëren van een geïsoleerde omgeving.

Ik overweeg hiervoor Vagrant of Docker. Wat zijn de voor- en nadelen, of hoe verhouden deze oplossingen zich?


1886
2018-05-20 10:05


oorsprong


antwoorden:


Als je doel het isolement is, denk ik dat Docker is wat je wilt.

Vagrant is een virtuele machinemanager. Hiermee kunt u zowel de configuratie van de virtuele machine als de provisioning scripten. Het is echter nog steeds een virtuele machine, afhankelijk van VirtualBox (of anderen) met een enorme overhead. Het vereist dat je een bestand van de harde schijf hebt dat enorm groot kan zijn, het kost veel ram en de prestaties zijn misschien niet erg goed.

Docker daarentegen gebruikt kernel cgroup en namespacing via LXC. Het betekent dat je dezelfde kernel gebruikt als de host en hetzelfde bestandssysteem. U kunt Dockerfile gebruiken met de docker build commando om de provisioning en configuratie van uw container af te handelen. U hebt een voorbeeld op docs.docker.com over hoe je je Dockerbestand te maken; het is heel intuïtief.

De enige reden dat je Vagrant zou willen gebruiken, is als je BSD, Windows of andere niet-Linux-ontwikkeling op je Ubuntu-box moet doen. Anders ga je voor Docker.


1042
2018-05-26 16:46



Disclaimer: ik heb Vagrant geschreven! Maar omdat ik Vagrant heb geschreven, woon ik het grootste deel van mijn leven in de DevOps-wereld die software als Docker bevat. Ik werk met veel bedrijven die Vagrant gebruiken en velen gebruiken Docker en ik zie hoe de twee samenspelen.

Voordat ik te veel praat, een direct antwoord: in jouw specifieke scenario (jezelf alleen bezig, aan het werken aan Linux, met behulp van Docker in productie), kun je alleen met Docker vasthouden en dingen vereenvoudigen. In veel andere scenario's (ik bespreek verder), is het niet zo eenvoudig.

Het is niet correct om Vagrant direct met Docker te vergelijken. In sommige scenario's overlappen ze elkaar, en in de overgrote meerderheid doen ze dat niet. De meest geschikte vergelijking zou eigenlijk Vagrant zijn versus iets als Boot2Docker (minimaal besturingssysteem dat Docker kan uitvoeren). Vagrant is een niveau boven Docker in termen van abstracties, dus het is geen eerlijke vergelijking in de meeste gevallen.

Vagrant lanceert dingen om apps / services uit te voeren met het oog op ontwikkeling. Dit kan op VirtualBox, VMware zijn. Het kan op afstand zijn zoals AWS, OpenStack. Daarbinnen, als je containers gebruikt, maakt Vagrant het niet uit, en omhelst dat: het kan bijvoorbeeld Docker-containers automatisch installeren, naar beneden halen, bouwen en uitvoeren. Met Vagrant 1.6 heeft Vagrant op dockers gebaseerde ontwikkelomgevingenen ondersteunt het gebruik van Docker met dezelfde workflow als Vagrant voor Linux, Mac en Windows. Vagrant probeert Docker hier niet te vervangen, het omarmt de praktijken van Docker.

Docker voert specifiek Docker-containers uit. Als je rechtstreeks met Vagrant vergelijkt: het is specifieker een specifieker (kan alleen Docker-containers draaien), minder flexibele (vereist Linux of Linux host ergens) oplossing. Natuurlijk, als je het hebt over productie of CI, is er geen vergelijking met Vagrant! Vagrant leeft niet in deze omgevingen en daarom moet Docker worden gebruikt.

Als uw organisatie alleen Docker-containers voor al hun projecten uitvoert en alleen ontwikkelaars op Linux draaien, dan kan Docker zeker voor u werken!

Anders zie ik geen voordeel in een poging om Docker alleen te gebruiken, omdat je veel verliest wat Vagrant te bieden heeft, wat echte zakelijke / productiviteitsvoordelen biedt:

  • Vagrant kan machines van VirtualBox, VMware, AWS, OpenStack, enz. Lanceren. Het maakt niet uit wat je nodig hebt, Vagrant kan het lanceren. Als u Docker gebruikt, kan Vagrant Docker op elk hiervan installeren, zodat u ze voor dat doel kunt gebruiken.

  • Vagrant is een enkele workflow voor al uw projecten. Of anders gezegd: het is maar één ding dat mensen moeten leren een project te draaien, of het nu in een Docker-container zit of niet. Als er bijvoorbeeld in de toekomst een concurrent opstaat om rechtstreeks met Docker te concurreren, kan Vagrant dat ook uitvoeren.

  • Vagrant werkt op Windows (terug naar XP), Mac (terug naar 10.5) en Linux (terug naar kernel 2.6). In alle drie gevallen is de werkstroom hetzelfde. Als u Docker gebruikt, kan Vagrant een machine (VM of externe) starten die Docker op alle drie deze systemen kan uitvoeren.

  • Vagrant weet hoe je een aantal geavanceerde of niet-triviale dingen moet configureren, zoals netwerken en mappen synchroniseren. Bijvoorbeeld: Vagrant weet hoe u een statisch IP-adres aan een machine koppelt of poorten doorstuurt, en de configuratie is hetzelfde, ongeacht welk systeem u gebruikt (VirtualBox, VMware, enz.) Voor gesynchroniseerde mappen biedt Vagrant meerdere mechanismen om uw lokale bestanden naar de externe machine (VirtualBox gedeelde mappen, NFS, rsync, Samba [plugin], etc.). Als je Docker gebruikt, zelfs Docker met een VM zonder Vagrant, zou je dit handmatig moeten doen, anders zouden ze in dit geval Vagrant opnieuw moeten uitvinden.

  • Vagrant 1.6 biedt eersteklas ondersteuning voor op dockers gebaseerde ontwikkelomgevingen. Dit zal geen virtuele machine opstarten onder Linux en zal automatisch een virtuele machine starten op Mac en Windows. Het eindresultaat is dat het werken met Docker uniform is voor alle platforms, terwijl Vagrant nog steeds de vervelende details verwerkt van zaken als netwerken, gesynchroniseerde mappen, enz.

Om specifieke tegenargumenten aan te pakken die ik heb gehoord ten gunste van het gebruik van Docker in plaats van Vagrant:

  • "Het zijn minder bewegende delen" - Ja, het kan zijn, als je Docker exclusief voor elk project gebruikt. Zelfs dan is het een opoffering van flexibiliteit voor Docker-lock-in. Als je ooit besluit Docker niet te gebruiken voor een project, verleden, heden of toekomst, dan heb je meer bewegende delen. Als je Vagrant had gebruikt, heb je dat ene bewegende deel dat de rest ondersteunt.

  • "Het is sneller!" - Zodra u de host hebt die Linux-containers kan uitvoeren, is Docker zeker sneller bij het uitvoeren van een container dan welke virtuele machine dan ook zou moeten starten. Maar het starten van een virtuele machine (of externe machine) is een eenmalige kost. In de loop van de dag zullen de meeste Vagrant-gebruikers hun VM nooit echt vernietigen. Het is een vreemde optimalisatie voor ontwikkelomgevingen. In productie, waar Docker echt schittert, begrijp ik de noodzaak om snel containers omhoog / omlaag te laten draaien.

Ik hoop dat het nu duidelijk is om te zien dat het zeer moeilijk is, en ik geloof niet correct, om Docker met Vagrant te vergelijken. Voor dev-omgevingen is Vagrant abstracter, algemener. Docker (en de verschillende manieren waarop u het kunt laten gedragen als Vagrant) is een specifiek gebruik van Vagrant en negeert al het andere dat Vagrant te bieden heeft.

Tot slot: in zeer specifieke use-gevallen is Docker zeker een mogelijke vervanging voor Vagrant. In de meeste gevallen is dat niet het geval. Vagrant belemmert uw gebruik van Docker niet; het doet eigenlijk alles wat het kan om die ervaring soepeler te maken. Als u vindt dat dit niet waar is, neem ik graag suggesties om dingen te verbeteren, aangezien Vagrant het doel heeft om even goed te werken met elk systeem.

Ik hoop dat dit alles opheldert!


2172
2018-01-23 16:55



Ik ben de auteur van Docker.

Het korte antwoord is dat als u machines wilt beheren, u Vagrant moet gebruiken. En als u toepassingsomgevingen wilt bouwen en uitvoeren, moet u Docker gebruiken.

Vagrant is een hulpmiddel voor het beheer van virtuele machines. Docker is een tool voor het bouwen en inzetten van applicaties door deze in lichtgewicht containers te verpakken. Een container kan vrijwel elke softwarecomponent bevatten, samen met de afhankelijkheden (uitvoerbare bestanden, bibliotheken, configuratiebestanden, enz.), En deze uitvoeren in een gegarandeerde en herhaalbare runtime-omgeving. Dit maakt het zeer eenvoudig om uw app één keer te bouwen en overal te implementeren - op uw laptop om te testen, vervolgens op verschillende servers voor live implementatie, enz.

Het is een veel voorkomende misvatting dat je Docker alleen op Linux kunt gebruiken. Dat is onjuist; je kunt Docker ook op Mac installeren en Windows-ondersteuning is onderweg. Wanneer het op een Mac is geïnstalleerd, bundelt Docker een kleine Linux VM (25 MB op schijf!) Die als een verpakking voor uw container fungeert. Na installatie is dit volledig transparant; u kunt de opdrachtregel van Docker op precies dezelfde manier gebruiken. Dit geeft u het beste van twee werelden: u kunt uw toepassing testen en ontwikkelen met behulp van containers, die zeer licht van gewicht zijn, eenvoudig kunnen worden getest en gemakkelijk kunnen worden verplaatst (zie bijvoorbeeld https://hub.docker.com voor het delen van herbruikbare containers met de Docker-community), en u hoeft zich geen zorgen te maken over de details van het beheer van virtuele machines, die toch maar een middel zijn om een ​​doel te bereiken.

In theorie is het mogelijk om Vagrant te gebruiken als een abstractielaag voor Docker. Ik raad dit om twee redenen af:

  • Ten eerste is Vagrant geen goede abstractie voor Docker. Vagrant is ontworpen om virtuele machines te beheren. Docker is ontworpen om een ​​applicatie-runtime te beheren. Dit betekent dat Docker, door ontwerp, op een rijkere manier met een applicatie kan communiceren en meer informatie heeft over de looptijd van de applicatie. De primitieven in Docker zijn processen, logstreams, omgevingsvariabelen en netwerkkoppelingen tussen componenten. De primitieven in Vagrant zijn machines, block-apparaten en ssh-sleutels. Vagrant zit gewoon lager in de stapel en de enige manier waarop het met een container kan communiceren, is door te doen alsof het gewoon een ander soort machine is, dat je kunt "booten" en "kunt inloggen". Je kunt dus "vagrant-up" typen met een docker-plugin en er zal iets moois gebeuren. Is het een substituut voor de volledige breedte van wat Docker kan doen? Probeer native Docker voor een paar dagen en zie het zelf :)

  • Ten tweede, het lock-inargument. "Als u Vagrant als een abstractie gebruikt, wordt u niet opgesloten in Docker!". Vanuit het oogpunt van Vagrant, dat is ontworpen om machines te beheren, is dit volkomen logisch: zijn containers niet gewoon een ander soort machine? Net zoals Amazon EC2 en VMware, moeten we ervoor zorgen dat onze provisioning-tools niet aan een bepaalde leverancier worden gekoppeld! Dit zou lock-in creëren - beter om het allemaal weg te vagen met Vagrant. Behalve dat dit het doel van Docker volledig mist. Docker levert geen machines; het verpakt je applicatie in een lichtgewicht draagbare runtime die je overal kunt laten vallen.

Welke runtime u voor uw toepassing kiest, heeft niets te maken met hoe u uw machines levert! Het komt bijvoorbeeld vaak voor dat applicaties worden geïmplementeerd op computers die door iemand anders zijn ingericht (bijvoorbeeld een EC2-instantie die door uw systeembeheerder is geïmplementeerd, misschien met Vagrant) of op bare-metalmachines die Vagrant helemaal niet kan aanbieden. Omgekeerd, kunt u Vagrant gebruiken om machines te leveren die niets te maken hebben met het ontwikkelen van uw applicatie - bijvoorbeeld een kant-en-klare Windows IIS-box of zoiets. Of u kunt Vagrant gebruiken om machines te leveren voor projecten die geen Docker gebruiken - misschien gebruiken ze een combinatie van rubygems en rvm voor afhankelijkheidsbeheer en sandboxing bijvoorbeeld.

Samenvattend: Vagrant is voor het beheren van machines en Docker is voor het bouwen en uitvoeren van applicatie-omgevingen.


1281
2018-03-13 06:16



Ik geef mijn antwoord vooraf door toe te geven dat ik geen ervaring heb met Docker, behalve als een fervent observator van wat een heel nette oplossing lijkt te zijn die veel tractie opdoet.

Ik heb een behoorlijke hoeveelheid ervaring met Vagrant en kan het ten zeerste aanbevelen. Het is zeker een zwaardere oplossing omdat het gebaseerd is op VM's in plaats van op LXC. Ik heb echter gevonden dat een degelijke laptop (8 GB RAM, i5 / i7 CPU) geen problemen heeft met het draaien van een VM met Vagrant / VirtualBox naast ontwikkelingstooling.

Een van de echt geweldige dingen met Vagrant is de integratie met Marionet/Chef/ shell-scripts voor het automatiseren van de configuratie. Als u een van deze opties gebruikt om uw productieomgeving te configureren, kunt u een ontwikkelomgeving maken die zo dicht bij identiek is als u wilt en dit is precies wat u wilt.

Het andere voordeel van Vagrant is dat je je Vagrant-bestand samen met je applicatiecode kunt verslaan. Dit betekent dat iedereen in uw team dit bestand kan delen en u gegarandeerd bent dat iedereen met dezelfde omgevingsconfiguratie werkt.

Interessant is dat Vagrant en Docker feitelijk complementair kunnen zijn. Vagrant kan worden uitgebreid om verschillende virtualisatieproviders te ondersteunen, en het is mogelijk dat Docker een dergelijke provider is die in de nabije toekomst ondersteuning krijgt. Zien https://github.com/dotcloud/docker/issues/404 voor recente discussie over het onderwerp.


72
2018-06-25 21:33



Ze zijn erg complementair.

Ik gebruik al een aantal maanden een combinatie van VirtualBox, Vagrant en Docker voor al mijn projecten en heb de volgende voordelen sterk gevoeld.

In Vagrant kun je alle Chef Solo-voorzieningen volledig afschaffen en het enige dat je nodig hebt om je dwaalbestand te maken, is een machine voorbereiden die één klein shell-script uitvoert dat docker installeert. Dit betekent dat mijn Vagrantfiles voor elk project vrijwel identiek en heel eenvoudig zijn.

Hier is een typisch Vagrantbestand

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

Het Bootstrap-bestand dat Docker installeert ziet er als volgt uit

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

Om alle services te krijgen die ik nodig heb, heb ik nu een script docker_start dat er ongeveer zo uitziet

#!/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 dit voorbeeld voer ik MongoDB, Elastisearch, RabbitMQ en Memcached uit

Een solo-configuratie van een niet-docker-chef zou aanzienlijk gecompliceerder zijn.

Een laatste groot pluspunt is dat je, wanneer je in productie gaat, de ontwikkelomgeving vertaalt naar een infrastructuur van hosts die allemaal hetzelfde zijn, omdat ze gewoon voldoende config hebben om docker te draaien, betekent inderdaad heel weinig werk.

Als je geïnteresseerd bent, heb ik een meer gedetailleerd artikel over de ontwikkelomgeving op mijn eigen website op

Implementatie van een Vagrant / Docker-ontwikkelomgeving


51
2017-08-20 20:42



Vagrant-LXC is een plugin voor Vagrant waarmee je LXC kunt gebruiken om Vagrant te leveren. Het heeft niet alle functies die de standaard zwervende VM (VirtualBox) heeft, maar het moet u meer flexibiliteit bieden dan houders van dockers. Er is een video in de link die de mogelijkheden toont die het bekijken waard zijn.


47
2017-08-01 18:44



Met Vagrant kun je nu Docker als provider hebben. http://docs.vagrantup.com/v2/docker/. Docker-provider kan worden gebruikt in plaats van VirtualBox of VMware.

Houd er rekening mee dat u Docker ook kunt gebruiken voor provisioning met Vagrant. Dit is heel anders dan het gebruik van Docker als een provider. http://docs.vagrantup.com/v2/provisioning/docker.html

Dit betekent dat je kunt vervangen Chef of Marionet met Docker. U kunt combinaties gebruiken als Docker als provider (VM) met Chef als provisioner. Of u kunt VirtualBox als provider gebruiken en Docker als provisioner.


41
2018-05-30 16:10