Domanda Dovrei usare Vagrant o Docker per creare un ambiente isolato? [chiuso]


Uso Ubuntu per lo sviluppo e la distribuzione e ho bisogno di creare un ambiente isolato.

Sto considerando Vagrant o Docker per questo scopo. Quali sono i pro e i contro, o come si confrontano queste soluzioni?


1886
2018-05-20 10:05


origine


risposte:


Se il tuo scopo è l'isolamento, penso che Docker sia quello che vuoi.

Vagrant è un gestore di macchine virtuali. Permette di scriptare la configurazione della macchina virtuale e il provisioning. Tuttavia, è ancora una macchina virtuale a seconda di VirtualBox (o altri) con un sovraccarico enorme. Richiede di avere un file del disco rigido che può essere enorme, ci vuole un sacco di RAM, e le prestazioni potrebbero non essere molto buone.

Docker d'altra parte usa il kernel cgroup e namespacing via LXC. Significa che stai utilizzando lo stesso kernel dell'host e dello stesso file system. Puoi usare Dockerfile con il docker build comando per gestire il provisioning e la configurazione del tuo contenitore. Hai un esempio a docs.docker.com su come creare il tuo Dockerfile; è molto intuitivo.

L'unico motivo per cui potresti voler utilizzare Vagrant è se devi eseguire BSD, Windows o altri sviluppi non Linux sulla tua casella Ubuntu. Altrimenti, vai su Docker.


1042
2018-05-26 16:46



Disclaimer: Ho scritto Vagrant! Ma poiché ho scritto Vagrant, trascorro la maggior parte del mio tempo vivendo nel mondo DevOps che include software come Docker. Lavoro con molte aziende che usano Vagrant e molti usano Docker, e vedo come interagiscono le due.

Prima di parlare troppo, una risposta diretta: nel tuo scenario specifico (lavorando da solo, lavorando su Linux, usando Docker in produzione), puoi stare con Docker da solo e semplificare le cose. In molti altri scenari (discuterò ulteriormente), non è così facile.

Non è corretto confrontare direttamente Vagrant con Docker. In alcuni scenari, si sovrappongono e nella stragrande maggioranza non lo fanno. In realtà, il confronto più appropriato sarebbe Vagrant rispetto a qualcosa come Boot2Docker (sistema operativo minimo che può eseguire Docker). Vagrant è un livello sopra Docker in termini di astrazioni, quindi non è un confronto equo nella maggior parte dei casi.

Vagrant lancia le cose per eseguire app / servizi ai fini dello sviluppo. Questo può essere su VirtualBox, VMware. Può essere remoto come AWS, OpenStack. All'interno di quelli, se si utilizzano i contenitori, Vagrant non si cura e lo accetta: può installare, tirare, compilare ed eseguire automaticamente i contenitori Docker, ad esempio. Con Vagrant 1.6, Vagrant ha ambienti di sviluppo basati su dockere supporta l'uso di Docker con lo stesso flusso di lavoro di Vagrant su Linux, Mac e Windows. Vagrant non tenta di sostituire Docker qui, abbraccia le pratiche Docker.

Docker esegue in modo specifico i contenitori Docker. Se stai confrontando direttamente con Vagrant: è specificamente una soluzione più specifica (puoi eseguire solo contenitori Docker), meno flessibile (richiede un host Linux o Linux da qualche parte). Ovviamente se parli di produzione o CI, non c'è paragone con Vagrant! Vagrant non vive in questi ambienti e quindi Docker dovrebbe essere usato.

Se la tua organizzazione esegue solo container Docker per tutti i loro progetti e ha solo sviluppatori in esecuzione su Linux, allora OK, Docker potrebbe sicuramente funzionare per te!

In caso contrario, non vedo alcun vantaggio nel tentare di utilizzare Docker da solo, dal momento che si perde molto di ciò che Vagrant ha da offrire, con reali vantaggi in termini di business / produttività:

  • Vagrant può avviare macchine VirtualBox, VMware, AWS, OpenStack, ecc. Non importa ciò che ti serve, Vagrant può lanciarlo. Se stai usando Docker, Vagrant può installare Docker su uno qualsiasi di questi in modo che tu possa usarli a tale scopo.

  • Vagrant è un unico flusso di lavoro per tutti i tuoi progetti. O per dirla in un altro modo, è solo una cosa che le persone devono imparare a eseguire un progetto, sia che si trovi in ​​un contenitore Docker o meno. Se, ad esempio, in futuro, un concorrente dovesse competere direttamente con Docker, Vagrant sarà in grado di eseguire anche quello.

  • Vagrant funziona su Windows (torna a XP), Mac (torna a 10.5) e Linux (torna al kernel 2.6). In tutti e tre i casi, il flusso di lavoro è lo stesso. Se si utilizza Docker, Vagrant può avviare una macchina (VM o remota) in grado di eseguire Docker su tutti e tre questi sistemi.

  • Vagrant sa come configurare alcune cose avanzate o non banali come il networking e la sincronizzazione delle cartelle. Ad esempio: Vagrant sa come collegare un IP statico a una macchina o inoltrare le porte e la configurazione è la stessa indipendentemente dal sistema utilizzato (VirtualBox, VMware, ecc.) Per le cartelle sincronizzate, Vagrant fornisce più meccanismi per ottenere il tuo locale file sulla macchina remota (cartelle condivise di VirtualBox, NFS, rsync, Samba [plugin], ecc.). Se stai usando Docker, anche Docker con una VM senza Vagrant, dovresti farlo manualmente o reinventare Vagrant in questo caso.

  • Vagrant 1.6 ha il supporto di prima classe per ambienti di sviluppo basati su docker. Questo non avvierà una macchina virtuale su Linux e avvierà automaticamente una macchina virtuale su Mac e Windows. Il risultato finale è che lavorare con Docker è uniforme su tutte le piattaforme, mentre Vagrant gestisce ancora i noiosi dettagli di cose come networking, cartelle sincronizzate, ecc.

Per affrontare specifici argomenti contrari che ho sentito a favore dell'utilizzo di Docker al posto di Vagrant:

  • "Sono meno le parti mobili" - Sì, può essere, se usi Docker esclusivamente per ogni progetto. Anche in questo caso, sta sacrificando la flessibilità per il lock-in di Docker. Se decidi di non utilizzare Docker per progetti, passati, presenti o futuri, avrai più parti mobili. Se hai usato Vagrant, hai quella parte mobile che supporta il resto.

  • "È più veloce!" - Una volta che l'host è in grado di eseguire i contenitori Linux, Docker è sicuramente più veloce nell'esecuzione di un contenitore rispetto a qualsiasi macchina virtuale. Ma lanciare una macchina virtuale (o una macchina remota) è un costo una tantum. Nel corso della giornata, la maggior parte degli utenti di Vagrant non distrugge mai la loro VM. È una strana ottimizzazione per gli ambienti di sviluppo. In produzione, dove Docker brilla davvero, capisco la necessità di ruotare rapidamente su / giù i contenitori.

Spero che ora sia chiaro che è molto difficile, e non credo corretto, confrontare la finestra mobile con Vagrant. Per gli ambienti di sviluppo, Vagrant è più astratto, più generale. Docker (e i vari modi in cui puoi comportarti come Vagrant) è un caso d'uso specifico di Vagrant, ignorando tutto ciò che Vagrant ha da offrire.

In conclusione: in casi d'uso altamente specifici, Docker è sicuramente un possibile sostituto di Vagrant. Nella maggior parte dei casi d'uso, non lo è. Vagrant non ostacola il tuo utilizzo di Docker; fa effettivamente quello che può per rendere l'esperienza più fluida. Se trovi che questo non è vero, sono felice di prendere suggerimenti per migliorare le cose, dal momento che un obiettivo di Vagrant è quello di funzionare ugualmente bene con qualsiasi sistema.

Mi auguro questo chiarisca tutto!


2172
2018-01-23 16:55



Sono l'autore di Docker.

La risposta breve è che se vuoi gestire le macchine, dovresti usare Vagrant. E se vuoi creare ed eseguire ambienti applicativi, dovresti usare Docker.

Vagrant è uno strumento per la gestione di macchine virtuali. Docker è uno strumento per la creazione e la distribuzione di applicazioni confezionandole in contenitori leggeri. Un contenitore può contenere praticamente qualsiasi componente software insieme alle sue dipendenze (eseguibili, librerie, file di configurazione, ecc.) Ed eseguirlo in un ambiente di runtime garantito e ripetibile. Ciò semplifica la creazione della tua app una sola volta e la distribuisce ovunque: sul tuo laptop per i test, poi su diversi server per l'implementazione live, ecc.

È un comune malinteso che tu possa usare Docker solo su Linux. Questo è sbagliato; puoi anche installare Docker su Mac e il supporto di Windows è in corso. Quando è installato su Mac, Docker raggruppa una minuscola VM Linux (25 MB su disco!) Che funge da wrapper per il tuo contenitore. Una volta installato, questo è completamente trasparente; puoi usare la riga di comando di Docker esattamente nello stesso modo. Questo ti dà il meglio di entrambi i mondi: puoi testare e sviluppare la tua applicazione usando container, che sono molto leggeri, facili da testare e facili da spostare (vedi ad esempio https://hub.docker.com per condividere contenitori riutilizzabili con la comunità Docker) e non è necessario preoccuparsi dei dettagli nitidi della gestione delle macchine virtuali, che sono comunque solo un mezzo per raggiungere un fine.

In teoria è possibile utilizzare Vagrant come strato di astrazione per Docker. Vi consiglio contro questo per due motivi:

  • Innanzitutto, Vagrant non è una buona astrazione per Docker. Vagrant è stato progettato per gestire macchine virtuali. Docker è stato progettato per gestire un runtime dell'applicazione. Ciò significa che Docker, in base alla progettazione, può interagire con un'applicazione in modo più ricco e dispone di maggiori informazioni sul runtime dell'applicazione. I primitivi in ​​Docker sono processi, registri di flusso, variabili di ambiente e collegamenti di rete tra componenti. I primitivi in ​​Vagrant sono macchine, dispositivi a blocchi e chiavi SSH. Vagrant si trova semplicemente più in basso nello stack e l'unico modo in cui può interagire con un contenitore è fingere che sia solo un altro tipo di macchina, che puoi "avviare" e "accedere". Quindi, certo, puoi digitare "vagrant up" con un plugin Docker e qualcosa di carino accadrà. È un sostituto per l'ampiezza di ciò che Docker può fare? Prova Docker nativo per un paio di giorni e guarda tu stesso :)

  • Secondo, l'argomento del lock-in. "Se usi Vagrant come astrazione, non sarai bloccato in Docker!". Dal punto di vista di Vagrant, che è progettato per gestire macchine, questo ha perfettamente senso: non sono contenitori solo un altro tipo di macchina? Proprio come Amazon EC2 e VMware, dobbiamo stare attenti a non legare i nostri strumenti di provisioning a nessun particolare fornitore! Ciò creerebbe un lock-in - meglio astrarre tutto via con Vagrant. A parte questo, manca completamente il punto di Docker. Docker non esegue il provisioning delle macchine; avvolge la tua applicazione in un runtime portatile leggero che può essere lasciato cadere ovunque.

Quale autonomia hai scelto per la tua applicazione non ha nulla a che fare con il modo in cui esegui il provisioning delle tue macchine! Ad esempio, è piuttosto frequente distribuire applicazioni su macchine che sono provate da qualcun altro (ad esempio un'istanza EC2 distribuita dall'amministratore di sistema, forse utilizzando Vagrant) o per mettere a nudo macchine in metallo che Vagrant non è in grado di fornire. Viceversa, è possibile utilizzare Vagrant per eseguire il provisioning di macchine che non hanno nulla a che fare con lo sviluppo dell'applicazione, ad esempio una scatola di Windows IIS pronta per l'uso o qualcosa del genere. Oppure puoi usare Vagrant per eseguire il provisioning di macchine per progetti che non usano Docker - forse usano una combinazione di rubygems e rvm per la gestione delle dipendenze e sandboxing per esempio.

In breve: Vagrant serve per la gestione delle macchine e Docker è per la creazione e l'esecuzione di ambienti applicativi.


1280
2018-03-13 06:16



Premetto la mia risposta ammettendo che non ho esperienza con Docker, se non come un accanito osservatore di quella che sembra essere una soluzione davvero pulita che sta guadagnando molta trazione.

Ho una discreta esperienza con Vagrant e lo consiglio vivamente. È certamente una soluzione più pesante in termini di base basata su VM anziché su LXC. Tuttavia, ho trovato un computer portatile decente (8 GB di RAM, CPU i5 / i7) non ha problemi nell'esecuzione di una VM utilizzando Vagrant / VirtualBox insieme agli strumenti di sviluppo.

Una delle cose davvero grandiose di Vagrant è l'integrazione con Fantoccio/capocuoco/ script di shell per l'automazione della configurazione. Se stai utilizzando una di queste opzioni per configurare il tuo ambiente di produzione, puoi creare un ambiente di sviluppo che è il più simile a quello che stai per ottenere, ed è esattamente ciò che desideri.

L'altra cosa grandiosa di Vagrant è che puoi eseguire la versione di Vagrantfile insieme al codice dell'applicazione. Ciò significa che tutti gli altri membri del tuo team possono condividere questo file e sei certo che tutti stanno lavorando con la stessa configurazione di ambiente.

È interessante notare che Vagrant e Docker potrebbero essere effettivamente gratuiti. Vagrant può essere esteso per supportare diversi provider di virtualizzazione e potrebbe essere possibile che Docker sia uno di questi provider che ottiene supporto nel prossimo futuro. Vedere https://github.com/dotcloud/docker/issues/404 per una discussione recente sull'argomento.


72
2018-06-25 21:33



Sono molto complementari.

Ho usato una combinazione di VirtualBox, Vagrant e Docker per tutti i miei progetti per diversi mesi e ho fortemente sentito i seguenti benefici.

In Vagrant puoi eliminare completamente qualsiasi provisioning da Chef e tutto ciò di cui hai bisogno è un file vagabondo da preparare è una macchina che esegue un singolo script di shell che installa la finestra mobile. Ciò significa che i miei Vagrantfiles per ogni progetto sono quasi identici e molto semplici.

Ecco un tipico 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

Il file Bootstrap che installa la finestra mobile è simile a questo

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

Ora per ottenere tutti i servizi di cui ho bisogno, ho uno script docker_start che somiglia a qualcosa del genere

#!/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 questo esempio sto eseguendo MongoDB, Elastisearch, RabbitMQ e Memcached

Una configurazione di Chef solo non docker sarebbe molto più complicata.

Un grande vantaggio finale si ottiene quando si passa alla produzione, traducendo l'ambiente di sviluppo in un'infrastruttura di host che sono tutti uguali in quanto hanno solo una configurazione sufficiente per eseguire la finestra mobile, il che significa davvero poco lavoro.

Se sei interessato, ho un articolo più dettagliato sull'ambiente di sviluppo sul mio sito web all'indirizzo

Implementazione di un ambiente di sviluppo Vagrant / Docker


51
2017-08-20 20:42



Vagrant-LXC è un plugin per Vagrant che consente di utilizzare LXC per eseguire il provisioning di Vagrant. Non ha tutte le funzionalità che ha il VM vagabondo predefinito (VirtualBox) ma dovrebbe consentire una maggiore flessibilità rispetto ai contenitori di finestra mobile. C'è un video nel link che mostra le sue capacità che vale la pena guardare.


47
2017-08-01 18:44



Con Vagrant ora puoi avere Docker come fornitore. http://docs.vagrantup.com/v2/docker/. È possibile utilizzare il provider Docker invece di VirtualBox o VMware.

Si noti che è anche possibile utilizzare Docker per il provisioning con Vagrant. Questo è molto diverso dall'usare Docker come fornitore. http://docs.vagrantup.com/v2/provisioning/docker.html

Questo significa che puoi sostituire capocuoco o Fantoccio con Docker. Puoi utilizzare combinazioni come Docker come provider (VM) con Chef come provisioner. Oppure puoi usare VirtualBox come provider e Docker come provisioner.


41
2018-05-30 16:10