Container, Docker e Kubernetes – Introduzione (1)
Cominciamo a dare delle definizioni, per capire meglio cosa rappresentano questi oggetti e perchè sono così importanti in un’ottica cloud.
Container: I container sono un modo per preparare package preconfezionato, con all’interno tutto quello che serve per eseguire il codice (codice, librerie di run-time, variabili e file di configurazione) nella macchina di destinazione.
Come nella virtualizzazione, lo strumento dei container viene enormemente in aiuto in un ambito cloud, soprattutto nell’ottica dell sharing delle risorse e del porting delle applicazioni; infatti i container sono:
- Flessibili: anche le applicazioni più complesse possono essere containerizzate;
- Leggeri: i container sfruttano e condividono il kernel host;
- Intercambiabili: è possibile distribuire aggiornamenti e aggiornamenti al volo;
- Portatili: è possibile creare localmente, distribuire nel cloud ed eseguire ovunque;
- Scalabili: è possibile aumentare e distribuire automaticamente le repliche del contenitore;
- Impilabili: è possibile impilare i servizi verticalmente e al volo.
Quindi, quando prendo un container “master” e lo duplico su un altro server, so esattamente come verrà eseguito e quale sarà il suo comportamento: è prevedibile, ripetibile e immutabile. Non ci sono errori imprevisti quando lo si sposta su una nuova macchina o tra ambienti
Basti pensare a un sito web, in cui invece di fare export/import degli ambienti di sviluppo/test/produzione, si prende il container che contiene il sito e lo si porta nell’ambiente di destinazione, lasciando invariati i dati.
Ma se i container portano semplicità d’uso e scalabilità, impongono anche un development dell’applicazione modulare, in cui i moduli sono indipendenti e disaccopiati. I vari moduli saranno incapsulati in un gruppo di container che cooperano tra di loro e vengono esposti verso l’esterno per formare un service. Quindi anche le applicazioni dovranno seguire uno sviluppo diverso dallo sviluppo monolitico a cui eravamo abituati sino a poco tempo fa.
Ma qual è la differenza tra VM e container? Entrambi si basano sulla tecnologia della virtualizzazione, dello sharing delle risorse; le differenze principali (e sostanziali) sono:
- Il container viene eseguito in modo nativo su Linux e condivide il kernel della macchina host con gli altri container;
- la VM esegue un SO guest completo con accesso virtuale alle risorse host filtrato dall’hypervisor.
In generale, quindi, le VM forniscono un ambiente con più risorse di quante le applicazioni ne necessitano; rispetto alle VM, ho spreco di risorse a parità di container e VM.