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


2083

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

Sto prendendo in considerazione Vagrant o Docker per questo scopo. Quali sono i vantaggi e gli svantaggi o come si confrontano queste soluzioni?


27
Entrambi sono combinabili ora: docs.vagrantup.com/v2/provisioning/docker.html
Alp

78
La tua domanda è abbastanza fortunata da ottenere entrambe le risposte degli scrittori dei due servizi: Mitchell e Solomon Hykes
itsazzad

4
Vorrei fare un nuovo riassunto: la domanda è per lo più sbagliata. La domanda giusta è: dovrei usare Vagrant o docker-compose per creare un ambiente isolato? La risposta è che Vagrant e docker-compose svolgono la stessa attività di descrizione degli ambienti, e invece dovresti piuttosto confrontare Docker con Virtualbox. La differenza è che Vagrant può utilizzare qualsiasi virtualizzazione come Docker, VMWare, Virtualbox su Windows, Linux o OSX, ma la composizione docker può semplicemente utilizzare immagini Docker basate su Linux.
PHZ.fi-Pharazon

Per me la risposta è "Quanto è importante per te la velocità nelle normali attività lavorative". Trovo Vagrant più lento di Docker. Sulla finestra mobile, soprattutto dopo un pull iniziale, l'approccio di cache e layer della finestra mobile rende l'utilizzo dello sviluppatore più facile e veloce per me
Michael Durrant,

Risposte:


1155

Se il tuo scopo è l'isolamento, penso che Docker sia ciò che desideri.

Vagrant è un gestore di macchine virtuali. Consente di eseguire lo script della configurazione della macchina virtuale e del provisioning. Tuttavia, è ancora una macchina virtuale a seconda di VirtualBox (o di altri) con un enorme sovraccarico. È necessario disporre di un file del disco rigido che può essere enorme, richiede un sacco di RAM e le prestazioni potrebbero non essere molto buone.

Docker invece usa il cgroup del kernel e lo spazio dei nomi tramite LXC . Significa che stai usando lo stesso kernel dell'host e lo stesso file system. È possibile utilizzare Dockerfile con il docker buildcomando per gestire il provisioning e la configurazione del proprio contenitore. Hai un esempio su docs.docker.com su come creare il tuo Dockerfile; è molto intuitivo.

L'unico motivo per cui potresti voler usare Vagrant è se devi fare lo sviluppo di BSD, Windows o altri sistemi non Linux sulla tua casella Ubuntu. Altrimenti, scegli Docker.


13
Sfortunatamente, non ancora. Se si utilizza un sistema a 32 bit, per eseguire la finestra mobile sarà necessaria una VM con un sistema guest a 64 bit. Tuttavia, con go1.1 il supporto a 32 bit migliora ed è possibile che la finestra mobile supporti presto l'arco a 32 bit
scricchiolio

8
Questo è vero per Mac e Windows, ma dal docker 0.7, qualsiasi distribuzione Linux funziona bene. Se conosci un non funzionante, per favore fatemelo sapere. Inoltre, a meno che tu non abbia uno stack Mac o Windows (che è improbabile ma può accadere), non vuoi eseguire Docker da nessuna parte ma su Linux. Il client docker funziona bene su Mac, dovrebbe funzionare presto su BSD e il demone supporterà infine BSD, Solaris e Mac.
scricchiolio

9
Nel caso in cui qualcuno legga questi commenti, dovresti sapere che Docker ha colpito la versione 1.0 solo 12 giorni fa ( blog.docker.com/2014/06/its-here-docker-1-0 ) e molte piattaforme diverse sono stabili e supportato ora ( docs.docker.com/installation )
JorgeArtware il

17
vagrant ha LXC e provisioner docker. Tuttavia - Vagrant e docker sono cose fondamentalmente diverse. Vagrant è esclusivamente per ambienti di sviluppo, docker è piuttosto per la produzione e solo Linux.
Dannyboy,

2
Docker ora funziona su Windows 10 Pro e versioni successive e Windows Server 2016. Ho appena eseguito l'aggiornamento da Windows 10 Home a Windows 10 Pro e ho installato l'app docker. Ora posso eseguire immagini docker Linux su Windows 10. È geniale!
PrestonDocks,

2339

Disclaimer: ho scritto Vagrant! Ma poiché ho scritto Vagrant, passo 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 i due interagiscono.

Prima di parlare troppo, una risposta diretta: nel tuo scenario specifico (lavorando da solo, lavorando su Linux, usando Docker in produzione), puoi rimanere 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 no. In realtà, il confronto più appropriato sarebbe Vagrant rispetto a qualcosa come Boot2Docker (sistema operativo minimo che può eseguire Docker). Vagrant è un livello superiore a Docker in termini di astrazioni, quindi nella maggior parte dei casi non è un confronto equo.

Vagrant lancia cose per eseguire app / servizi a scopo di sviluppo. Questo può essere su VirtualBox, VMware. Può essere remoto come AWS, OpenStack. All'interno di questi, se usi i container, a Vagrant non importa, e lo abbraccia: può ad esempio installare, abbattere, costruire ed eseguire automaticamente container Docker. Con Vagrant 1.6, Vagrant ha ambienti di sviluppo basati su docker e supporta l'utilizzo di Docker con lo stesso flusso di lavoro di Vagrant su Linux, Mac e Windows. Vagrant non cerca di sostituire Docker qui, abbraccia le pratiche Docker.

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

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

Altrimenti, non vedo alcun vantaggio nel tentare di utilizzare Docker da solo, poiché perdi molto di ciò che Vagrant ha da offrire, che offre vantaggi reali in termini di business / produttività:

  • Vagrant può avviare macchine VirtualBox, VMware, AWS, OpenStack, ecc. Non importa di cosa hai bisogno, Vagrant può avviarlo. Se stai usando Docker, Vagrant può installare Docker su uno di questi in modo da poterli utilizzare a tale scopo.

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

  • Vagrant funziona su Windows (indietro su XP), Mac (indietro su 10.5) e Linux (indietro su 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 a porte dirette e la configurazione è la stessa indipendentemente dal sistema in uso (VirtualBox, VMware, ecc.) Per le cartelle sincronizzate, Vagrant fornisce diversi meccanismi per ottenere il tuo locale file sul computer remoto (cartelle condivise VirtualBox, NFS, rsync, Samba [plugin], ecc.). Se stai usando Docker, anche Docker con una VM senza Vagrant, dovresti farlo manualmente o dovrebbero reinventare Vagrant in questo caso.

  • Vagrant 1.6 ha un supporto di prima classe per ambienti di sviluppo basati su docker . Ciò 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 rete, cartelle sincronizzate, ecc.

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

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

  • "È più veloce!" - Una volta che hai l'host che può eseguire container Linux, Docker è decisamente più veloce nell'esecuzione di un container di quanto qualsiasi macchina virtuale sarebbe in grado di lanciare. Ma l'avvio di una macchina virtuale (o macchina remota) è un costo una tantum. Nel corso della giornata, la maggior parte degli utenti di Vagrant non distrugge mai la propria VM. È una strana ottimizzazione per ambienti di sviluppo. In produzione, dove Docker brilla davvero, capisco la necessità di girare rapidamente su / giù i container.

Spero ora sia chiaro che è molto difficile, e credo non corretto, confrontare Docker con Vagrant. Per gli ambienti di sviluppo, Vagrant è più astratto, più generale. Docker (e i vari modi in cui puoi farlo comportare 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, non lo è. Vagrant non ostacola l'utilizzo di Docker; fa davvero il possibile per rendere quell'esperienza più fluida. Se ritieni che ciò non sia vero, sono felice di dare suggerimenti per migliorare le cose, dal momento che un obiettivo di Vagrant è lavorare ugualmente bene con qualsiasi sistema.

Mi auguro questo chiarisca tutto!


4
@JaredMarkell Penso che forse stia cercando un servizio basato sul web che gli permetta di gestire le sue macchine Vagrant, come Protobox .
Ryan Kennedy,

73
@Mitchell Volevo solo ringraziarti per averlo spiegato in modo così dettagliato. Ovviamente è impossibile per te essere completamente obiettivo, quindi apprezzo che tu abbia impiegato del tempo per spiegare le sfumature e le varie situazioni in cui potrebbero essere utilizzate. Penso che molta della confusione attorno a una varietà di strumenti oggi sia che si sovrappongono molto, e molte persone vogliono una soluzione unica per tutti dove qualcuno dice loro cosa fare e possono implementarlo. Il bello della tua risposta è che risponde alla domanda di fondo: come posso creare un ambiente isolato? (indipendentemente dagli strumenti).
Giordania,

4
@JaredMarkell Docker ha un'API REST docs.docker.com/reference/api/docker_remote_api
Tarnay Kálmán

3
@ OğuzÇelikdemir Vagrant può fare molto di più. Naturalmente, se prepari una macchina virtuale specifica per ogni progetto, questo durerà. Ma durante lo sviluppo finisco spesso per aggiungere più servizi / demoni / impostazioni (ad es. Quando decido di usare RabbitMQ per un progetto durante lo sviluppo). L'approccio puramente VM richiederà di preparare una nuova immagine, con RabbitMQ installato e configurato, e costringere gli sviluppatori a cambiare la loro VM con questa nuova. Per Vagrant: sto aggiungendo le linee appropriate nella configurazione vagabonda e tutti gli sviluppatori possono aggiornare facilmente le loro macchine virtuali (usando vagrant provision).
Tomasz Struczyński,

5
(Intendi "divulgazione", rivelando qualcosa di importante, non "disclaimer", negando la responsabilità: english.stackexchange.com/q/115850 )
Jerry101

1418

Sono l'autore di Docker.

La risposta breve è che se si desidera gestire le macchine, è necessario utilizzare 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 dell'app una volta e la distribuisce ovunque: sul laptop per i test, quindi su server diversi per la distribuzione live, ecc.

È un'idea sbagliata comune che è possibile utilizzare Docker solo su Linux. Non è corretto; puoi anche installare Docker su Mac e Windows. Se installato su Mac, Docker raggruppa una piccola 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 Docker esattamente nello stesso modo. Questo ti offre il meglio di entrambi i mondi: puoi testare e sviluppare la tua applicazione utilizzando contenitori 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 devi preoccuparti dei dettagli chiacchieroni della gestione delle macchine virtuali, che sono comunque solo un mezzo per raggiungere un fine.

In teoria è possibile usare Vagrant come strato di astrazione per Docker. Lo sconsiglio 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 modi più ricchi e dispone di maggiori informazioni sul runtime dell'applicazione. Le primitive in Docker sono processi, flussi di log, variabili di ambiente e collegamenti di rete tra i componenti. Le primitive in Vagrant sono macchine, dispositivi a blocchi e chiavi ssh. Vagrant è semplicemente più basso nello stack e l'unico modo in cui può interagire con un container è fingendo che sia solo un altro tipo di macchina, che puoi "avviare" e "accedere". Quindi, certo, puoi digitare "vagrant up" con un plugin Docker e accadrà qualcosa di carino. È un sostituto per l'ampiezza di ciò che Docker può fare? Prova Docker nativo per un paio di giorni e vedi di persona :)

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

Quale runtime scegli per la tua applicazione non ha nulla a che fare con il modo in cui esegui il provisioning dei tuoi computer! Ad esempio, è abbastanza frequente distribuire applicazioni su macchine fornite da qualcun altro (ad esempio un'istanza EC2 distribuita dall'amministratore di sistema, magari usando Vagrant), oppure su macchine bare metal che Vagrant non può affatto eseguire il provisioning. Al contrario, è 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 IIS di Windows 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 il sandboxing, ad esempio.

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


396
Volevo solo notare che gli aspetti vagabondi di questa risposta sono errati. Vagrant non è per la gestione di macchine, Vagrant è per la gestione di ambienti di sviluppo. Il fatto che Vagrant faccia girare le macchine è per lo più storico. La prossima versione di Vagrant ha un supporto di prima classe per far girare l'ambiente di sviluppo usando Docker come provider direttamente sull'host o su qualsiasi VM (Mac, Win). Può anche far girare LXC crudo se questo è quello che qualcuno vuole (di nuovo, sull'host o sulla VM). Vagrant è interessato a fare ciò che è meglio per creare un ambiente di sviluppo portatile, sia che ciò significhi creare una VM o meno.
Mitchell,

7
@Davide Questo lo copre in modo più dettagliato: vagrantup.com/blog/…
Mitchell

48
"È un'idea sbagliata comune che puoi usare Docker solo su Linux" Anche se è vero, è corretto affermare che puoi usare Linux solo su Docker. Se voglio impostare un runner di test che eserciti la mia applicazione in un'ampia varietà di configurazioni ambientali (database diversi, versioni php, backend di cache ecc.), Posso farlo facilmente con i contenitori docker. Ma non riesco a vedere se la mia applicazione verrà eseguita correttamente in un ambiente Windows IIS o su BSD o OSX.
Mixologic,

10
Il tuo primo punto è obsoleto poiché Vagrant ha il supporto del provider integrato per la finestra mobile: docs.vagrantup.com/v2/provisioning/docker.html
Alp

19
Il post è obsoleto. Vagrant supporta Docker come provider ora. E ci sono alcuni video che dimostrano come usare Vagrant e Docker all'unisono sul loro blog .
sargas,

86

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

Ho una discreta esperienza con Vagrant e lo consiglio vivamente. È certamente una soluzione più pesante in quanto basata su VM anziché su LXC. Tuttavia, ho trovato un laptop decente (8 GB di RAM, CPU i5 / i7) non ha problemi a far funzionare una VM usando Vagrant / VirtualBox insieme agli strumenti di sviluppo.

Una delle cose veramente fantastiche di Vagrant è l'integrazione con gli script Puppet / Chef / shell per automatizzare la configurazione. Se stai utilizzando una di queste opzioni per configurare il tuo ambiente di produzione, puoi creare un ambiente di sviluppo il più vicino identico a quello che otterrai e questo è esattamente ciò che desideri.

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

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


7
Ragazzi, ho rilasciato un fornitore sperimentale di vagabondi per docker: github.com/fgrehm/docker-provider .
fgrehm,

2
Docker non è virtualizzazione, ma esegue il sistema operativo all'interno del proprio contenitore, usando lo stesso kernel host, non è nemmeno un provider come le altre VM, quindi la docker è già supportata da Vagrant.
Aftab Naveed,

1
Docker è la virtualizzazione del sistema operativo stesso, riutilizzando implicitamente l'hardware sottostante. È la virtualizzazione poiché estrae e isola il filesystem, la rete e i processi in esecuzione in un contenitore.
jose.angel.jimenez,

63

Sono molto complementari.

Sto usando una combinazione di VirtualBox, Vagrant e Docker per tutti i miei progetti da diversi mesi e ho sentito fortemente i seguenti vantaggi.

In Vagrant puoi eliminare completamente qualsiasi provisioning da solo di Chef e tutto ciò di cui hai bisogno per fare il tuo file vagrant è preparare una macchina che esegua un singolo script shell che installa docker. Ciò significa che i miei file Vagrant 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 si presenta così

#!/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 assomiglia a questo

#!/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 da solo Chef non docker sarebbe notevolmente più complicata.

Un grande vantaggio finale si ottiene quando ci si sposta nella produzione, traducendo l'ambiente di sviluppo in un'infrastruttura di host che sono tutti uguali in quanto hanno solo una configurazione sufficiente per eseguire docker significa davvero molto 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


2
Hai eseguito tutta quell'orchestrazione docker_start ma non hai disturbato a collegare i contenitori insieme. Stai solo andando con numeri di porta hardcoded perché lo stai eseguendo sotto Vagrant?
WineSoaked

6
Ciao WineSoaked, l'esempio sopra non mostra il contenitore che effettivamente utilizza tutti quei servizi. Se si guarda al post di blog menzionato, esiste un altro script di script / vagrant / docker_web che attiva il contenitore di sviluppo per il progetto. Questo effettivamente usa --link sul comando run docker e il progetto Rails usa le variabili d'ambiente iniettate docker per connettersi ai servizi.
Mark Stratmann,

1
Vedo il potenziale che unisce entrambi i prodotti. Vagabondo come test ambientale e docker per wrapper di app. Unendo entrambi puoi testare una singola app o unit-test su molti escenari. Penso che molti dei "servizi di piattaforme di test" stiano utilizzando Vagrant + Docker alla volta.
m3nda,

8
"Sono davvero gratuiti." - Entrambi sono gratuiti, in effetti.
Underyx

2
Ciao @koppor Ho usato l'ultima volta la docker machine circa tre mesi fa e non ci sono ancora tornato. Il problema che ho avuto è stato che ha un bug nella condivisione delle cartelle dal mio host host MAC alla finestra mobile che esegue VM quando si utilizza il driver VMWare. Ciò significava che non potevo modificare il codice localmente sul Mac e che le modifiche si riflettessero nel contenitore della finestra mobile. Non so se l'hanno ancora risolto, quando lo farò davvero passerò ad esso. Ho comunque cambiato tutta la mia orchestrazione di container in composizione docker da quando ho scritto questa risposta
Mark Stratmann

53

Vagrant-lxc è un plugin per Vagrant che ti consente di utilizzare LXC per eseguire il provisioning di Vagrant. Non ha tutte le funzionalità della VM virtuale (VirtualBox) predefinita, ma dovrebbe consentire una maggiore flessibilità rispetto ai container docker. C'è un video nel link che mostra le sue capacità che vale la pena guardare.


5
Ed ecco il link diretto al progetto github.com/fgrehm/vagrant-lxc
gertas

46

Con Vagrant ora puoi avere Docker come fornitore. http://docs.vagrantup.com/v2/docker/ . Il provider Docker può essere utilizzato al posto di VirtualBox o VMware.

Nota che puoi anche utilizzare Docker per il provisioning con Vagrant. Questo è molto diverso dall'uso di Docker come provider. http://docs.vagrantup.com/v2/provisioning/docker.html

Ciò significa che puoi sostituire Chef o Puppet con Docker. Puoi utilizzare combinazioni come Docker come provider (VM) con Chef come provisioner. Oppure puoi usare VirtualBox come provider e Docker come provisioner.


23
mondo appena impazzito;) possiamo eseguire il vagabondo utilizzando il fornitore di docker per eseguire i contenitori di docker all'interno del vagabondo
Andrzej Rehmann

@zainengineer, il provider Docker per Vagrant su Windows utilizza ancora boot2docker o utilizza una variante di Docker Toolbox?
Derek Mahar,

@zainengineer Hai dei link ad esempi illustrativi (non documenti vagabondi)?
Wlad

16

L'uso di entrambi è una parte importante del test di consegna delle applicazioni. Sto solo cominciando a mettermi in gioco con Docker e pensando molto a un team di applicazioni che ha una terribile complessità nella costruzione e nella consegna del suo software. Pensa a un classico progetto Phoenix / consegna continua.

Il pensiero va in questo modo:

  • Prendi un componente dell'applicazione Java / Go e crealo come contenitore (nota, non sei sicuro che l'app debba essere compilata nel contenitore o compilata e installata nel contenitore)
  • Consegnare il contenitore a una macchina virtuale Vagrant.
  • Ripetere l'operazione per tutti i componenti dell'applicazione.
  • Scorrere sui componenti su cui codificare.
  • Testare continuamente il meccanismo di consegna alle VM gestite da Vagrant
  • Dormi bene sapendo quando è il momento di distribuire il container, che i test di integrazione si stavano verificando su una base molto più continua rispetto a prima di Docker.

Questa sembra essere l'estensione logica dell'affermazione di Mitchell secondo cui Vagrant è per lo sviluppo combinato con il pensiero di Farley / Humbles in Continuous Delivery. Se io, come sviluppatore, posso ridurre il ciclo di feedback sui test di integrazione e sulla consegna delle applicazioni, seguiranno ambienti di lavoro di qualità superiore e migliori.

Il fatto che come sviluppatore consegni costantemente e costantemente container alla VM e collauda l'applicazione in modo più olistico significa che le versioni di produzione saranno ulteriormente semplificate.

Quindi vedo Vagrant evolversi come un modo per sfruttare alcune delle fantastiche conseguenze che Docker avrà per la distribuzione delle app.


hai per caso un post sul blog a riguardo? sono passati quasi due anni, come sta andando? stai ancora usando il vagabondo con docker o solo docker e docker-fleat / machine?
Andrzej Rehmann,

La società per cui lavoravo è stata acquisita e hanno rimosso tutti i miei contenuti @Hoto. La risposta breve è che uso una docker-machine a casa per i miei progetti di animali domestici. Al lavoro sono <gulp> manager </gulp> e non mi occupo molto di tecnologia. Non abbiamo in programma di utilizzare Docker, quindi il nostro strumento è generalmente Vagrant.
Boyd Hemphill,

10

Sicuramente Docker per la vittoria!

Come forse saprai, Vagrant è per la gestione delle macchine virtuali, mentre Docker è per la gestione dei contenitori di software. Se non si è consapevoli della differenza, ecco: Un contenitore software può condividere la stessa macchina e lo stesso kernel con altri contenitori software. Usando i contenitori risparmi denaro perché non sprechi risorse su più sistemi operativi (kernel), puoi impacchettare più software per server mantenendo un buon grado di isolamento.

Naturalmente è una nuova disciplina prendersi cura dei propri problemi e sfide.

Scegli Docker Swarm se le tue esigenze superano il limite delle risorse della singola macchina.


8

C'è un articolo davvero informativo sull'attuale rivista Oracle Java sull'uso di Docker in combinazione con Vagrant (e Puppet):

Conclusione

I container leggeri Docker sono più veloci rispetto alle macchine virtuali classiche e sono diventati popolari tra gli sviluppatori e nell'ambito delle iniziative su CD e DevOps. Se il tuo scopo è l'isolamento, Docker è una scelta eccellente. Vagrant è un gestore di macchine virtuali che consente di creare script delle configurazioni delle singole macchine virtuali e di eseguire il provisioning. Tuttavia, si tratta di una VM che dipende da VirtualBox (o da un altro gestore VM) con un sovraccarico relativamente elevato. È necessario disporre di un disco rigido inattivo che può essere enorme, richiede molta RAM e le prestazioni possono essere non ottimali. Docker utilizza i cgroup del kernel e l'isolamento dello spazio dei nomi tramite LXC. Questo significa che stai usando lo stesso kernel dell'host e lo stesso sistema ile. Vagrant è un livello superiore a Docker in termini di astrazione, quindi non sono realmente comparabili. Gli strumenti di gestione della configurazione come Puppet sono ampiamente utilizzati per il provisioning degli ambienti di destinazione. Riutilizzare le soluzioni esistenti basate su Puppet è facile con Docker. Puoi anche suddividere la tua soluzione, in modo che l'infrastruttura sia fornita con Puppet; il middleware, l'applicazione aziendale stessa o entrambi sono forniti con Docker; e Docker è avvolto da Vagrant. Con questa gamma di strumenti, puoi fare ciò che è meglio per il tuo scenario.

Come costruire, utilizzare e orchestrare i contenitori Docker in DevOps http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0


1
Mancavano così tante cose
Paul Verest,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.