In uno dei recenti approfondimenti di InternetPost abbiamo parlato di virtualizzazione con hypervisor, unikernel e container. Nel post di oggi dedicheremo la nostra attenzione proprio a questi ultimi ripercorrendone le principali tappe “evolutive” della tecnologia.
I container rappresentano un’interessante tecnica di virtualizzazione dei sistemi operativi (OS) che permette la “convivenza” di ambienti Linux multipli sul medesimo host. A differenza delle classiche VM (macchine virtuali) non dispongono tuttavia di un guest OS (ospite) dedicato ma si oppoggiano invece al kernel ed alle librerie del sistema operativo sottostante (dell’host). Questo permette ai container di assicurare diversi vantaggi agli utilizzatori come:
- velocità di avvio molto più rapida rispetto alle VM – grazie all’assenza di un guest OS dedicato che richiede più tempo per essere caricato;
- un ambiente di lavoro isolato grazie all’impiego di varie funzionalità del kernel Linux (Apparmor, SELinux profiles, chroot, CGroups, Neamespaces) che regolano i processi di accesso alla macchina host ed al kernel, al fine di evitare qualsiasi intrusione e sconfinamento tra le parti;
- l’impiego di distribuzioni differenti da quella utilizzata dall’host OS (a condizione che entrambe siano in grado di funzionare sulla medesima architettura CPU).
La tecnologia dei container Linux, contrariamente a quanto si potrebbe dedurre pensando a Docker (2013), non è recente ma nasce “concettualmente” agli albori della modernità tecnologica, ovvero nel “lontano” 1979. Vediamo di ripercorrere nel prossimo paragrafo le principali tappe della sua storia.
Container: dal 1979 ad oggi
Come appena accennato la base concettuale dei container risale al 1979 ed a chroot UNIX, una chiamata di sistema (call) in grado di cambiare la directory di riferimento dei processi in esecuzione e di quelli generati da questi ultimi (detti processi figlio). L’idea era quella di fornire ai processi degli spazi “isolati” nello storage in uso, una caratteristica che rende chroot un “precursore” dei container Linux.
Dovettero passare tuttavia 21 anni affinchè si giungesse ad una soluzione molto più vicina a Docker ed affini: FreeBSD Jail, introdotta nell’OS FreeBSD nel 2000 ed ideata da Derrick T. Woolworth, era simile a chroot ma aggiungeva funzionalità di sandboxing per l’isolamento dei file di sistema, degli utenti e della rete consentendo ad esempio di assegnare determinate configurazioni software ed IP a ciascuna jail.
Nel 2001 arriva una soluzione simile a Jail, Linux VServer, in grado di partizionare le risorse di un computer (file di sistema, indirizzi di rete, memoria, CPU time). Ciascuna partizione veniva chiamata “security context” mentre il sistema al suo interno VPS (virtual private server).
La parola “container” fa tuttavia la sua prima apparizione nel 2004 con i Solaris Container, destinati agli ecosistemi x86 e SPARC, una combinazione tra controllo delle risorse di sistema ed ambienti isolati che operano come server virtuali (detti anche zone) all’interno di una singola istanza dell’OS.
OpenVZ (2005) segue l’esempio di Solaris utilizzando però una versione modificata del kernel Linux al fine di garantire virtualizzazione, isolamento, gestione delle risorse. Ciascun container OpenVZ dispone di un file di sistema isolato, utenti e gruppi, un’albero di processi, dispositivi, reti etc.
L’isolamento, registrazione e limitazione dell’utilizzo di risorse (CPU, memoria, network etc.) da parte di una serie di processi è invece l’idea alla base di Process Container, una soluzione sviluppata da Google nel 2006 e successivamente inserita nella versione 2.6.24 del kernel Linux con il nome “Control Groups” (2007) – per evitare la confusione dei molteplici significati della parola “container” in ambito Linux.
I LinuX Container (LXC) esordiscono nel 2008 (sono attualmente supportati da Canonical) rappresentando l’implementazione più completa di un gestore di container Linux – effettuata mediante l’utilizzo di croups e namespaces. A differenza delle altre tecnologie di conteinerizzazione, LXC è in grado di funzionare anche con una versione non modificata del kernel Linux (in gergo vanilla).
Warden (2011) si ispira inizialmente a LXC per poi differenziarsi da quest’ultimo distaccandosi dall’ecosistema Linux e supportando altri OS in grado di fornire ambienti isolati. Warden funziona come un demone e dispone di un API per la gestione dei container.
Il 2013 rappresenta indubbiamente l’anno della svolta. LMCTFY (Let Me Contain That For You) è la prima delle due importanti novità da ricordare. Il progetto è la variante opensource di una soluzione proprietaria Google progettata con l’intento di garantire un determinato livello di prestazioni, un elevato utilizzo di risorse, condividere risorse e ridurre al minimo il “peso” dei container sull’OS sottostante (host OS). LMCTFY fu presentato ufficialmente ad ottobre ma non fu più portato avanti in quanto Mountain View decise di affidarne nel 2015 alcuni dei principi chiave a libcontainer, un progetto avviato da Docker e confluito successivamente nella Open Container Foundation.
La seconda novità del 2013 è appunto Docker, un progetto il cui sviluppo fu avviato internamente dalla compagnia dotCloud (poi rinominata Docker) e che parti, come abbiamo visto per altre soluzioni, da una base LXC. Con l’avanzamento dei lavori si passò alla libreria Docker libcontainer per giungere infine ad un complesso ecosistema per la gestione dei container, attualmente il più adoperato in ambito IT. Docker vanta infatti un efficiente e stratificato sistema di immagini, registri locali e globali per i container, un’interfaccia a linea di comando (CLI) e molto altro.
CoreOS propone nel 2014 una personale reinterpretazione dei container Docker lanciando Rocket. Il progetto si focalizzo sui punti deboli individuati dai programmatori dell’azienda nell’ambizioso Docker puntando a requisiti di sicurezza più rigidi e ad uno standard più aperto (implementazione nelle specifice App Container). Altre soluzioni sviluppate da CoreOS (etcd, il sistema operativo CoreOS, flannel) sono attualmente utilizzate dallo stesso Docker e da Kubernetes (lo strumento di orchestrazione dei container di Google più utilizzato).
La breve storia dei Linux Containers si chiude (per il momento) nel 2016 con l’arrivo di Windows Container in Windows Server 2016 – previsto teoricamente per la fine di settembre. L’implementazione consentirà di utilizzare nativamente Docker sull’OS Microsoft senza ricorrere ad alcuna macchina virtuale – inizialmente Docker poteva essere eseguito solo attraverso una VM Linux).