I team DevOps sono sempre più sotto pressione per fornire maggiori funzionalità ai clienti rapidamente. I provider di cloud offrono una soluzione al problema attraverso piattaforme scalabili con eccellenti integrazioni CLI e API e, purtroppo, le interfacce esposte dai provider cloud possono risultare incompatibili. Alcuni strumenti cloud-native, però, aiutano i team DevOps a costruire soluzioni personalizzate per qualsiasi provider cloud.

Due di questi strumenti sono Vagrant e Docker. Capire cosa fanno e come lavorano insieme è fondamentale per ottenere il massimo dal vostro ambiente cloud.

Vagrant permette di creare e gestire ambienti di macchine virtuali (VM) in un unico flusso di lavoro. Sia che si stiano creando delle macchine virtuali locali da eseguire con gli hypervisor o solo delle macchine virtuali per il cloud, Vagrant offre comunque un formato di configurazione coerente, un’unica CLI e dei provisioner condivisi per installare il software e modificare le configurazioni.

Docker offre la possibilità di impacchettare il software e la configurazione di supporto in immagini che vengono eseguite in modo coerente su più piattaforme. Inoltre, permette ai team DevOps di avere la certezza che il software venga eseguito su una workstation locale nello stesso modo in cui viene eseguito su una piattaforma cloud gestita.

Sebbene Vagrant e Docker condividano l’obiettivo di creare ambienti ripetibili, lo fanno in modi diversi ma complementari. Questo articolo spiega in che modo Vagrant e Docker raggiungono i loro obiettivi.

Cos’è Docker?

Docker è una piattaforma aperta per sviluppare, distribuire ed eseguire applicazioni. Permette ai team DevOps di impacchettare il software personalizzato, le applicazioni di supporto e le librerie, così come le istruzioni per la configurazione, il networking, il montaggio dei file, gli health check e gli script di lancio in un artefatto autonomo chiamato immagine.

Le immagini vengono poi eseguite in un ambiente leggero e isolato chiamato container. A differenza delle macchine virtuali, che in genere riservano quantità fisse di memoria e limitano rigorosamente l’uso della CPU, i container sono molto più elastici e consumano solo la memoria e la CPU di cui hanno bisogno.

Questo permette a molti container di funzionare fianco a fianco in modo efficiente, riducendo i costi e aumentando la scalabilità. Tuttavia, i container non sono considerati sicuri come le macchine virtuali, quindi non sono la soluzione ideale per l’esecuzione di codice non attendibile.

Docker
Docker

Perché Usare Docker (vs Vagrant)?

I team DevOps di solito usano Docker per fornire ed eseguire applicazioni web, comprese le applicazioni native cloud che si integrano con code di messaggi o sono ospitate su piattaforme function-as-a-service (FaaS) che rispondono a trigger ed eventi basati sul cloud.

Piattaforme come Kubernetes si basano su Docker, consentendo l’orchestrazione dei container su scala. Inoltre, tutti i provider di cloud supportano la possibilità di eseguire container Docker nelle loro offerte di Platform as a Service (PaaS). È ormai raro trovare un PaaS che non supporti Docker.

Docker può anche distribuire ed eseguire strumenti basati su CLI: tutti gli strumenti nativi cloud più diffusi offrono immagini Docker che incorporano la loro CLI.

Quali Sono i Vantaggi di Docker?

Docker risolve un problema comune ai processi tradizionali di distribuzione del software: le applicazioni personalizzate possono presentare risultati diversi quando vengono eseguite sulla workstation locale di uno sviluppatore e in un ambiente di produzione. Queste differenze sono spesso dovute al fatto che gli sviluppatori utilizzano versioni diverse dei linguaggi di programmazione, hanno configurazioni diverse per le applicazioni di supporto come i server web o utilizzano sistemi operativi completamente diversi rispetto all’ambiente di produzione. Queste differenze portano a problemi di assistenza che rimbalzano da un team all’altro con commenti del tipo: “Sulla mia macchina funziona”.

Poiché le immagini Docker includono il codice delle applicazioni personalizzate, tutte le applicazioni di supporto e le librerie, le immagini vengono eseguite in contenitori che forniscono risultati più coerenti indipendentemente dal luogo in cui vengono eseguite.

Le immagini Docker sono facili da distribuire grazie a registri come Docker Hub, che consentono ai team DevOps di condividere rapidamente le immagini tra loro e di distribuirle utilizzando le varie piattaforme di hosting. Ad esempio, troverete Docker dietro la suite di sviluppo WordPress DevKinsta di Kinsta.

Quando sono necessari stack applicativi più complessi, come la distribuzione di un database insieme a un’applicazione backend o una collezione di microservizi correlati, Docker Compose offre la possibilità di creare e collegare più container Docker con un unico comando. Tutti i container, le impostazioni associate e le configurazioni di rete sono definite in un unico file YAML. Docker Compose legge questo file per creare e gestire più container come un’unica unità.

Docker gode inoltre di un supporto quasi universale presso i principali provider di cloud, il che significa che i team DevOps hanno l’imbarazzo della scelta quando devono eseguire le loro immagini Docker nel cloud.

Cos’è Vagrant?

Per decenni le macchine virtuali si sono dimostrate una soluzione affidabile e sicura per il partizionamento e il provisioning delle risorse informatiche. Le macchine virtuali rimangono i servizi più popolari proposti da provider di cloud e molte soluzioni commerciali e open-source ai team che cercano di operare le macchine virtuali on-premise.

Tuttavia, questa varietà rappresenta una sfida per i team DevOps. Ogni soluzione espone una CLI e un’API diversa per creare e gestire le macchine virtuali, rendendo difficile mantenere la coerenza tra gli ambienti di sviluppo locali e le piattaforme basate sul cloud.

Vagrant offre una soluzione astraendo le differenze di fondo tra le piattaforme VM, consentendo ai team DevOps di effettuare il provisioning di nuove VM con un’unica CLI e una sintassi di configurazione coerente. I team che adottano Vagrant possono creare macchine virtuali coerenti indipendentemente dal fatto che vengano eseguite in un ambiente on-premise o in un ambiente cloud e possono passare facilmente da un ambiente all’altro. Vagrant può essere utilizzato in molti modi diversi, tra cui come sostituto di MAMP (macOS, Apache, MySQL/MariaDB e PHP, Perl o Python).

Vagrant
Vagrant

Perché Usare Vagrant (vs Docker)?

È possibile avviare una macchina virtuale e configurare manualmente il sistema operativo installando manualmente il software e modificando i file di configurazione. Il che non è proprio l’ideale, perché il processo non è ripetibile e quindi le macchine virtuali devono essere ricreate manualmente per sistemi operativi e provider diversi. Inoltre, è quasi impossibile capire come è stata configurata una macchina virtuale in un secondo momento.

Una pratica migliore è quella di automatizzare il processo di configurazione di una macchina virtuale. Vagrant offre un unico strumento per automatizzare il processo di creazione di macchine virtuali per molti provider. Inoltre, offre anche un’ampia selezione di macchine virtuali di alta qualità su Vagrant Cloud, che i team DevOps possono utilizzare per creare le proprie macchine virtuali.

Quali Sono i Vantaggi di Vagrant?

I team DevOps che utilizzano Vagrant hanno a disposizione un unico strumento per imparare, indipendentemente dal fatto che stiano costruendo macchine virtuali per piattaforme on-premise, piattaforme cloud o entrambe. È possibile modificare i file di configurazione di Vagrant facilmente e rieseguirli o rivederli in un secondo momento per capire come è stata costruita una VM.

Vagrant permette inoltre ai team DevOps di migrare verso il cloud o da un provider all’altro senza dover riprogettare il processo di creazione delle macchine virtuali.

Le macchine virtuali create da Vagrant offrono un elevato livello di isolamento, spesso sfruttando il supporto specializzato per la virtualizzazione integrato nelle moderne CPU. Questo rende le macchine virtuali e gli strumenti che le creano, come Vagrant, la scelta migliore quando la sicurezza e l’isolamento sono una priorità assoluta.

Molte distribuzioni Linux, come Ubuntu e Fedora, forniscono anche box Vagrant ufficiali su cui i team DevOps possono costruire. Questo riduce il tempo necessario per creare macchine virtuali personalizzate.

Vagrant vs Docker: Uno sguardo più Approfondito

Sia Vagrant che Docker rendono più efficienti i team DevOps automatizzando la creazione, la distribuzione e l’esecuzione delle applicazioni software.

Docker raggiunge questo obiettivo con un formato di packaging personalizzato sotto forma di immagini e un ambiente di esecuzione leggero tramite i container. I container vengono eseguiti in modo coerente tra le varie piattaforme, dando ai team DevOps una maggiore sicurezza che il loro software funzioni come previsto. Docker è ben supportato dalle piattaforme cloud PaaS e FaaS, permettendo ai team DevOps di scegliere la piattaforma migliore per le loro esigenze.

Molti container possono coesistere su un singolo host, principalmente – ma non completamente – isolati l’uno dall’altro, pur condividendo lo stesso pool di risorse. Questo permette ai container di scalare in modo efficiente.

Vagrant raggiunge questo obiettivo fornendo un metodo coerente per la creazione di macchine virtuali con i provider esistenti. È la scelta ideale per i team che hanno già investito nelle macchine virtuali, contando sul loro alto livello di isolamento, sicurezza, controllo e personalizzazione.

Docker è anche la soluzione migliore per l’esecuzione di codice affidabile e per ridurre al minimo i costi di elaborazione. I container sono ragionevolmente isolati l’uno dall’altro ma comportano un overhead molto ridotto. Ciò significa che molti container possono essere eseguiti contemporaneamente su un sistema operativo condiviso. Le macchine virtuali sono la soluzione migliore quando i team hanno bisogno di alti livelli di isolamento e sicurezza o di poter eseguire molti sistemi operativi diversi l’uno accanto all’altro; Vagrant offre una soluzione conveniente per creare macchine virtuali in modo automatizzato e ripetibile.

Vagrant e Docker non sono tecnologie che si escludono a vicenda ed entrambi gli strumenti possono essere utilizzati fianco a fianco. Ad esempio, i team DevOps possono utilizzare Docker per sviluppare ed eseguire applicazioni e Vagrant per ricreare ambienti specializzati per riprodurre problemi. Docker può anche essere eseguito all’interno di una macchina virtuale creata da Vagrant, magari per testare nuove versioni di Docker o per testare strumenti distribuiti come immagini Docker in un ambiente isolato.

Riepilogo

I team DevOps hanno molte possibilità di scelta quando costruiscono, distribuiscono ed eseguono le applicazioni.

Docker offre un formato di immagine personalizzato e un ambiente di esecuzione dei container che consente un utilizzo efficiente delle risorse su larga scala ed è supportato da piattaforme PaaS e FaaS.

Le macchine virtuali offrono ambienti di esecuzione sicuri e isolati da molti fornitori di macchine virtuali cloud e on-premises, mentre Vagrant astrae da molte differenze per fornire un’unica CLI e una sintassi di configurazione coerente per istanziare le macchine virtuali tra i vari fornitori.

Prima di iniziare a sviluppare la vostra prossima applicazione, date un’occhiata a come il servizio di Hosting di Applicazioni di Kinsta può sfruttare i Dockerfile per gestire la distribuzione del vostro codice.

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.