Il concetto di virtualizzazione è ormai ben conosciuto. Meno noti sono invece i container così come le loro finalità e possibilità di utilizzo.
In generale è possibile affermare che sia le macchine virtuali che i container permettono di sfruttare in modo più efficace le risorse hardware e software disponibili sulla macchina.
Cos’è una macchina virtuale
Una macchina virtuale è un ambiente virtuale creato utilizzando un apposito software che emula il comportamento di una macchina fisica (client o server). La creazione della macchina virtuale è possibile destinando temporaneamente ad essa una parte delle risorse hardware della macchina fisica (RAM, CPU, GPU, hard disk/SSD). Quando la macchina virtuale viene spenta, tutte le risorse vengono liberate e restituite alla macchina ospitante (sistema “host”) fatta eccezione per la totalità o una parte dei dati memorizzati negli hard disk virtuali.
Le informazioni relative al sistema operativo e ai programmi installati installati nella macchina virtuale (così come i dati in essa salvati) saranno conservate nelle unità di memorizzazione del sistema host, tipicamente in un unico file di grandi dimensioni.
L’hypervisor è il componente che si occupa di orchestrare il funzionamento delle macchine virtuali ed è pensabile come l’intermediario tra l’hardware del sistema host e le macchine virtuali.
Con l’avvento dei servizi cloud e la disponibilità di macchine on-premise sempre più potenti, la virtualizzazione è diventata uno degli strumenti più utilizzati dalle grandi aziende, dalle imprese di piccole e medie dimensioni e, in ultima analisi, anche dai professionisti.
La virtualizzazione è infatti un approccio che permette di aumentare l’efficienza riducendo i costi.
D’altra parte anche professionisti e utenti finali possono trarre benefici dalle soluzioni per la virtualizzazione perché possono eseguire sistemi operativi diversi rispetto a quello caricato sulla macchina ospitante ed effettuare test in ambienti isolati evitando di danneggiare la configurazione del sistema principale (si pensi ai vantaggi derivanti dall’installazione di applicazioni di ogni genere senza che esse possano modificare registro di sistema e file system della macchina host).
Di contro, le macchine virtuali possono occupare un bel po’ di risorse hardware: ogni macchina virtuale non esegue solo una copia di un certo sistema operativo ma sfrutta una copia virtuale di tutto l’hardware di cui lo stesso sistema operativo necessita per funzionare correttamente. Un approccio che necessita di RAM e che occupa parecchi cicli di CPU. Sempre più economico se paragonato all’utilizzo di più macchine a sé stanti ma gravoso dal punto di vista dell’occupazione delle risorse in alcuni frangenti.
Strumenti come VMware, Virtualbox, Xeon, Hyper-V e KVM, dei quali abbiamo spesso parlato nelle pagine de IlSoftware.it sono alcuni esempi di soluzioni che mettono a disposizione hypervisor per la creazione e la gestione di macchine virtuali.
Cosa sono i container
Già due anni fa parlavamo di containerizzazione e dei suoi vantaggi: Azure e la visione sempre più open di Microsoft.
La principale differenza tra macchine virtuali e container è che questi ultimi non virtualizzano l’intero hardware “sottostante” bensì solamente il sistema operativo.
Ogni container condivide l’utilizzo del kernel del sistema operativo e, solitamente, anche librerie e binari, sia su Linux che su Windows.
I componenti del sistema operativo vengono condivisi in sola lettura e la condivisione di componenti software come le librerie riduce in maniera significativa la necessità di duplicare il codice del sistema operativo mantenendone in esecuzione più istanze in contemporanea.
I container sono quindi eccezionalmente leggeri, pesano pochi megabyte e impiegano pochi secondi per avviarsi al contrario, evidentemente, delle macchine virtuali.
Diversamente dalle macchine virtuali, poi, il quantitativo di risorse che i container richiedono per il loro funzionamento è esattamente lo stesso del sistema operativo e delle applicazioni installati.
Tipologie di container
La tecnologia originariamente utilizzata in Linux per la gestione dei container si chiama Linux Containers (LXC).
LXC è un sistema di virtualizzazione che permette il caricamento di più sistemi Linux isolati sulla medesima macchina host.
Docker è nato come progetto per costruire container LXC per singole applicazioni introducendo molteplici modifiche strutturali all’approccio iniziale.
Grazie a Docker i container sono divenuti estremamente più portabili e flessibili; più avanti Docker ha lanciato il suo proprio ambiente runtime per il caricamento e la gestione dei singoli container: Docker lancia lo store delle app containerizzate: i dettagli.
Le macchine virtuali si rivelano una scelta migliore per il caricamento e l’esecuzione di app che richiedono tutte le risorse disponibili sulla macchina, quando si dovessero molteplici applicazioni o si intendesse gestire diverse tipologie di sistemi operativi.
I container sono invece più adatti quando la priorità fosse quella di massimizzare il numero delle applicazioni in esecuzione riducendo al minimo il numero delle macchine. In molti casi la configurazione migliore è quella che unisce i vantaggi della virtualizzazione a quelli dei container.