2.1 Macchine Virtuali
I concetti di virtualizzazione sono apparsi negli anni '60, quando IBM ha sviluppato le macchine virtuali per i suoi mainframe. Questo ha permesso un utilizzo efficiente delle risorse dei computer e l'isolamento dei carichi di lavoro. Da allora, la virtualizzazione si è evoluta ed è oggi una parte integrante dell'infrastruttura IT.
Una macchina virtuale (VM) rappresenta una emulazione software di un computer fisico
. Permette di eseguire sistemi operativi e applicazioni come se funzionassero su un server fisico separato. I componenti principali di una VM sono: l'hypervisor, il sistema operativo ospite e le applicazioni.
L'hypervisor è un software per la gestione delle macchine virtuali e la distribuzione delle risorse tra di esse. Esistono due tipi di hypervisor:
- Tipo 1 (bare-metal): Si installa direttamente sull'hardware. È caratterizzato da alte prestazioni e sovraccarico minimo. Esempi: VMware ESXi, Microsoft Hyper-V.
- Tipo 2 (hosted): Funziona sopra il sistema operativo host, rendendolo più flessibile ma meno performante. Esempi: Oracle VirtualBox, VMware Workstation.
Sistema operativo ospite: ogni macchina virtuale contiene un sistema operativo completo che funziona sopra l'hypervisor. Questo consente di utilizzare diversi sistemi operativi su un unico server fisico.
Applicazioni: le applicazioni e le loro dipendenze sono installate all'interno del sistema operativo ospite, fornendo isolamento e indipendenza.
Vantaggi:
- Isolamento: le macchine virtuali sono completamente isolate, poiché ogni VM ha il proprio sistema operativo e risorse. Questo impedisce a un'applicazione di influenzarne un'altra.
- Compatibilità: le macchine virtuali supportano qualsiasi sistema operativo, incluse versioni diverse dello stesso sistema, offrendo flessibilità nell'uso.
- Sicurezza: un alto livello di isolamento rende le VM più sicure: le vulnerabilità di una VM non possono facilmente influenzare le altre.
Svantaggi:
Consumo di risorse: ogni VM richiede risorse significative, poiché contiene un sistema operativo completo. Questo aumenta i requisiti di memoria RAM e spazio su disco.
Avvio: le macchine virtuali si avviano e si arrestano più lentamente a causa della necessità di caricare e spegnere il sistema operativo.
Gestione: amministrare molteplici VM può essere complesso e dispendioso in termini di tempo, specialmente in infrastrutture di grandi dimensioni.
2.2 Container
La containerizzazione come concetto esiste già da decenni, ma è diventata estremamente popolare con la crescita di Docker, che è apparso nel 2013. Docker ha reso più semplice l'uso dei container e li ha resi accessibili alla maggior parte degli sviluppatori e amministratori di sistema.
I container si distinguono dalle macchine virtuali in quanto utilizzano il kernel del sistema operativo host e offrono isolamento a livello di processi. In essi è possibile eseguire applicazioni e dipendenze in ambienti isolati, senza dover installare un sistema operativo separato.
- Sistema operativo host: i container utilizzano il kernel del sistema operativo host, risparmiando risorse e riducendo i costi generali.
- Container: ogni container include un'applicazione e tutte le sue dipendenze, ma non include un sistema operativo separato. L'isolamento dei container è garantito dalle tecnologie namespaces e cgroups, che limitano l'accesso alle risorse e separano i processi.
- Namespaces: una funzione del kernel di Linux che crea un ambiente isolato per i processi, nascondendo loro processi, file system, interfacce di rete e altre risorse di altri container.
- Cgroups: una tecnologia di gestione delle risorse che consente di controllare l'utilizzo della CPU, della memoria, dell'I/O su disco e di altre risorse da parte dei container, prevenendo un consumo eccessivo.
Vantaggi:
- Leggerezza: I container utilizzano meno risorse perché non richiedono l'installazione di un sistema operativo separato. Su un singolo server fisico è possibile eseguire più container rispetto alle macchine virtuali.
- Avvio rapido: i container si avviano e si arrestano molto più rapidamente delle macchine virtuali, poiché non è necessario avviare e spegnere un sistema operativo.
- Portabilità: i container sono facili da trasferire tra diversi ambienti, poiché contengono tutte le dipendenze necessarie per eseguire l'applicazione. È possibile creare immagini uniche che funzionano su diverse piattaforme senza modifiche.
Svantaggi:
- Isolamento: l'isolamento dei container è meno rigoroso rispetto alle macchine virtuali, poiché utilizzano lo stesso kernel del sistema operativo host. Se un'applicazione in un container è compromessa, potrebbe creare vulnerabilità potenziali.
- Compatibilità: i container devono essere compatibili con il sistema operativo host, il che potrebbe limitarne l'uso in alcuni scenari.
2.3 Confronto tra contenitori e macchine virtuali

Consumo di risorse:
- Contenitori: richiedono meno risorse e utilizzano in modo più efficiente la memoria RAM e il processore. Su un server fisico è possibile eseguire più contenitori, il che li rende economicamente vantaggiosi per lo scaling.
- Macchine virtuali: consumano più risorse poiché richiedono un sistema operativo completo. Ogni macchina virtuale occupa una quantità significativa di RAM e spazio su disco, limitandone il numero su un singolo server.
Velocità:
- Contenitori: si avviano e si fermano in pochi secondi, rendendoli ideali per task che richiedono reazioni rapide e scalabilità.
- Macchine virtuali: l'avvio e lo spegnimento richiedono più tempo poiché è necessario caricare il sistema operativo. Le macchine virtuali possono impiegare diversi minuti per avviarsi, limitandone l'uso in ambienti dinamici.
Isolamento:
- Contenitori: garantiscono isolamento a livello di processo. Il livello di isolamento è inferiore a quello delle macchine virtuali, ma sufficiente per la maggior parte delle applicazioni. Non sono adatti per task che richiedono isolamento completo e massima sicurezza.
- Macchine virtuali: garantiscono isolamento completo a livello di sistemi operativi. Un alto livello di protezione le rende una scelta ottimale per applicazioni e dati critici.
Gestione e scalabilità:
- Contenitori: semplici da gestire e scalare grazie alla loro leggerezza e rapido avvio. Strumenti di orchestrazione come Kubernetes semplificano la gestione di grandi cluster di contenitori.
- Macchine virtuali: gestione e scalabilità più complesse a causa dell'elevato consumo di risorse. Amministrare un grande numero di macchine virtuali richiede un notevole sforzo, soprattutto in ambienti dinamici.
La scelta tra contenitori e macchine virtuali dipende dai task specifici. I contenitori sono ottimali dove è necessario un rapido deployment e scalabilità delle applicazioni con un consumo minimo di risorse. La loro portabilità e leggerezza li rendono una scelta eccellente per architetture a microservizi e cloud computing.
Le macchine virtuali offrono il miglior isolamento e compatibilità, rendendole ottimali per applicazioni complesse e critiche che richiedono un alto livello di sicurezza e indipendenza. Sono indispensabili per il deployment di applicazioni multilivello e infrastrutture in cui è necessario un intero sistema operativo per ogni carico di lavoro.
In pratica, molte organizzazioni adottano un approccio ibrido, utilizzando sia contenitori che macchine virtuali per ottenere un equilibrio ottimale tra prestazioni, flessibilità e sicurezza.
GO TO FULL VERSION