Dovrei usare Vagrant o Docker per creare un ambiente isolato?


Answers

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 dispone di ambienti di sviluppo basati su docker e 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 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 offre un supporto di prim'ordine per gli 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!

Question

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?




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.




Sicuramente Docker per la vittoria!

Come forse saprai, Vagrant è destinato alla gestione delle macchine virtuali mentre Docker è destinato alla gestione dei contenitori software. Se non si è consapevoli della differenza, ecco: Un contenitore software può condividere la stessa macchina e il kernel con altri contenitori software. Utilizzando i contenitori si risparmiano soldi perché non si sprecano risorse su più sistemi operativi (kernel), è possibile impacchettare più software per server mantenendo un buon grado di isolamento.

Naturalmente è una nuova disciplina da curare con le proprie buche e sfide.

Vai su Docker Swarm se i tuoi requisiti superano il limite di risorse per singola macchina.




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 posso raccomandarlo caldamente. È 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 gli script di Puppet / Chef / 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. Vedi https://github.com/dotcloud/docker/issues/404 per la discussione recente sull'argomento.




L'utilizzo di entrambi è una parte importante dei test di consegna delle applicazioni. Sto solo iniziando a essere coinvolto con Docker e sto pensando seriamente a un team di applicazioni che ha una terribile complessità nella creazione e distribuzione del suo software. Pensa a un classico progetto Phoenix / situazione di consegna continua.

Il pensiero va più o meno così:

  • Prendere un componente dell'applicazione Java / Go e compilarlo come contenitore (nota, non è sicuro se l'app debba essere compilata nel contenitore o creata e poi installata nel contenitore)
  • Consegna il contenitore a una VM Vagrant.
  • Ripetere l'operazione per tutti i componenti dell'applicazione.
  • Iterare sui componenti da codificare.
  • Testare continuamente il meccanismo di consegna alle VM gestite da Vagrant
  • Dormire bene sapendo quando è il momento di implementare il contenitore, i test di integrazione si sono verificati su una base molto più continua rispetto a prima di Docker.

Questa sembra essere la logica estensione dell'affermazione di Mitchell secondo cui Vagrant è destinato allo sviluppo combinato con il pensiero di Farley / Humbles in Continuous Delivery. Se io, in qualità di sviluppatore, posso ridurre il ciclo di feedback sui test di integrazione e sulla distribuzione delle applicazioni, seguirò una migliore qualità e migliori ambienti di lavoro.

Il fatto che come sviluppatore io stia costantemente e costantemente consegnando contenitori alla VM e testando l'applicazione in modo più olistico significa che le versioni di produzione saranno ulteriormente semplificate.

Quindi vedo Vagrant in continua evoluzione come un modo per sfruttare alcune delle impressionanti conseguenze che Docker avrà per la distribuzione delle app.




Links