I container e le macchine virtuali (VM) sono simili e complementari. Entrambi migliorano la portabilità delle applicazioni, l'efficienza e aumentano lo sviluppo e le operazioni (DevOps) nelle organizzazioni, anche se con differenze di architettura. I container creano un livello di astrazione a livello di sistema operativo (OS), consentendo agli sviluppatori di concentrarsi sulle applicazioni mentre il team operativo si concentra sull'infrastruttura.
Le VM, al contrario, sfruttano un hypervisor per replicare le funzionalità delle risorse hardware sottostanti con lo sviluppo delle applicazioni. La scelta tra un container e una VM dipende dai requisiti del sistema distribuito.
Le macchine virtuali sono un'astrazione dell'hardware del computer che consente a un sistema operativo di emulare il proprio hardware per l'utilizzo da parte di uno o più sistemi operativi guest. Il software responsabile dell'emulazione dell'hardware per questi sistemi operativi guest è chiamato hypervisor. Un hypervisor gestisce queste macchine virtuali assegnando loro una condivisione delle risorse (CPU, memoria, disco, ecc.) del computer host e del proprio sistema operativo. Ogni macchina virtuale si comporta come una singola macchina con hardware e risorse distinti. Ciò significa che un'applicazione non è responsabile della condivisione delle proprie risorse con altre applicazioni, può utilizzare tutte le risorse disponibili perché l'hypervisor fornisce a ciascuna VM il proprio hardware virtuale separato dalle altre VM sullo stesso server.
Esistono numerosi provider che consentono di eseguire VM on premise o nel cloud. Un piccolo esempio di questi provider di VM include:
- VirtualBox (on-prem e open source)
- QEMU (on-prem e open source)
- VMWare (on-prem o cloud)
- AWS EC2 or Lightsail (cloud)
- Azure VMs (cloud)
Oggi, quando si parla di container, di solito si riferisce ai container Linux. I container Linux sono costituiti da gruppi di controllo (cgroups), che consentono al kernel Linux di limitare e isolare risorse fisiche come CPU, memoria e I/O di rete a un gruppo di processi. Questo è simile al modo in cui un hypervisor crea risorse per un sistema operativo guest di una macchina virtuale, ma con i cgroup Linux è possibile dividere le risorse direttamente all'interno del sistema operativo Linux, indipendentemente dalla presenza di un hypervisor. Con i container, esegui le tue applicazioni con le proprie risorse separate senza dover emulare un intero sistema operativo guest.
Sia i container che le macchine virtuali semplificano l'esecuzione di più applicazioni in produzione. I container vengono eseguiti direttamente sul sistema operativo host tramite un motore di container e ogni container può avere i propri file dell'applicazione, binari e librerie. I container possono essere avviati e scalati in pochi secondi perché non necessitano di un proprio sistema operativo completo. Quando si considera il costo dei container rispetto alle VM nel cloud computing, è importante riconoscere che si sta realmente confrontando il costo dell'esecuzione dei container sulle VM con l'esecuzione delle sole VM. Molti provider di servizi cloud dipendono dalla tecnologia delle VM per fornire agli utenti i loro server personali, quindi se esegui container nel cloud, molto probabilmente eseguirai container su VM di cui è stato effettuato il provisioning. Nel cloud computing, il fattore chiave per ridurre i costi è sfruttare la tecnologia dei container migliorando la densità di distribuzione e rendendo le applicazioni più leggere e portatili in modo che più applicazioni possano essere eseguite su una singola VM, anziché utilizzare più VM.
Come le macchine virtuali, esistono molti provider e modi diversi per eseguire i container. I motori di container, i tipi di container e il fatto che tu stia sviluppando in locale o nel cloud influenzeranno la tua decisione nella scelta di un provider. Alcuni esempi di questi sono:
- Container Linux
- Container Docker
- Contenitainer Windows Server
Componenti | Containers | Virtual Machines |
---|---|---|
Livello di emulazione | Utilizza il motore del container per isolare più processi in un kernel del sistema operativo condiviso | Utilizza l'hypervisor per gestire i sistemi operativi guest |
Dimensioni | Dimensioni in megabyte | Dimensioni in gigabytes |
Costo minimo | Basso | Alto |
Scalabilità | Facile da scalare con velocità e dimensioni ridotte | Supporta un po' di ridimensionamento ma raggiungerà rapidamente i limiti delle risorse di calcolo |
Sostituibilità | Facile | Difficile |
Isolamento delle risorse | Moderato | Complesso |
Applicazioni monolitiche | Inefficiente per applicazioni monolitiche | Supporta applicazioni monolitiche |
Complessità per i team di sviluppo | Bassa | Alta |
Interazione del team di sviluppo con l'infrastruttura | Bassa | Alta |