Cosa sono i container in informatica?

I container rappresentano una tecnologia sempre più diffusa, soprattutto quando si parla di sviluppo applicazioni in cloud.

Naturale evoluzione delle tradizionali macchine virtuali, i container e le piattaforme che consentono di crearli e gestirli nei vari ambienti IT trovano sempre più spazio grazie a moderne metodologie di sviluppo, come DevOps, e alla crescente diffusione delle architetture basate sui microservizi.

Attraverso l’esperienza di IFIConsulting, vediamo in cosa consistono, come funzionano e quali sono le principali tipologie oggi disponibili.

Cosa sono i container in informatica

I container sono una tecnologia di riferimento per quanto riguarda lo sviluppo delle applicazioni a microservizi.

Grazie a specifiche istanze virtualizzate, contenenti codice, librerie e dipendenze, i container rendono disponibile l’ambiente per eseguire software in maniera immediata, consentendo al tempo stesso la portabilità tra più sistemi.

Tale caratteristica è la base del successo che hanno ottenuto queste tecnologie, capaci di accelerare notevolmente il time-to-market delle applicazioni, in funzione di una collaborazione più agile dei team di sviluppo che seguono metodologie moderne come DevOps.

I container operano attraverso una virtualizzazione a livello del sistema operativo, che funge a tutti gli effetti da host, e le cui funzioni vengono utilizzate per isolare i processi e per gestire le risorse hardware (CPU, memoria e storage) di cui l’unità virtuale necessita per essere eseguita in maniera corretta.

Il concetto su cui si basa la containerizzazione è radicato nel tempo, ma la sua moderna accezione è databile a partire dal 2013, anno in cui ha fatto la sua comparsa sulla scena Docker, tuttora una delle tecnologie più utilizzate dagli sviluppatori di tutto il mondo, insieme a LXC (Linux Containers).

I container sono dei file immagine che includono le informazioni eseguite con l’avvio del sistema operativo host, attraverso il container engine.

Le applicazioni containerizzate possono pertanto essere composte da diverse immagini del cointainer stesso. Grazie alla logica a microservizi, il software può essere infatti decomposto in vari moduli applicativi, ognuno dei quali avviato mediante l’esecuzione di uno specifico container.

Ad esempio, un’applicazione potrebbe prevedere tre livelli, eseguiti in maniera del tutto indipendente in altrettanti container, come un front-end, un application server e un database.

Questa tecnologia può essere o meno stateless, in base alla conservazione delle informazioni sulle sessioni eseguite. A prescindere da questo fattore, più container possono essere eseguiti contemporaneamente avviando più istanze della stessa immagine di base, senza dover interrompere il funzionamento dell’applicazione.

Oggi i container rappresentano strumenti di lavoro sempre più utilizzati dagli sviluppatori di software, che li impiegano end-to-end per lo sviluppo e il test delle loro applicazioni. I sistemisti IT installano i container su server bare metal e macchine virtuali, sia on-premise che in cloud.

Nella virtualizzazione tradizionale, tuttora diffusa sia in locale che in cloud, si impiega un software hypervisor per astrarre e consolidare le risorse di un server fisico, mettendole a disposizione dei sistemisti per configurare più macchine virtuali, ognuna delle quali vede allocata una quantità di risorse specifiche.

Ogni macchina virtuale (VM) prevede un sistema operativo guest e le applicazioni da eseguire, con tutte le librerie e le dipendenze di cui necessitano.

Il container rappresenta un metodo più snello rispetto alla VM, in quanto virtualizza il sistema operativo in modo che ogni singolo container includa soltanto l’applicazione, le librerie e le dipendenze, svincolandosi di fatto dal sistema operativo guest.

Per tali ragioni, il container è meno configurabile, ma al tempo stesso più leggero e portabile rispetto all’architettura di una VM completa.

In altri termini, una macchina virtuale rappresenta un server completo, da avviare a tutti gli effetti, che comprende molte funzioni superflue per l’avvio dell’istanza di un’applicazione.

Il container comprende lo stresso necessario e, grazie alla condivisione del kernel, può essere eseguito su un sistema operativo, che può fungere a sua volta da host per l’avvio di più istanze del container stesso.

Tra i principali vantaggi introdotti dalla containerizzazione figurano leggerezza, portabilità, indipendenza dalla piattaforma, funzionalità per lo sviluppo applicazioni moderne (microservizi).

Come già citato, il container condivide il kernel del sistema operativo host, il che consente di non dover avviare un’istanza completa dello stesso per ogni applicazione.

Questa caratteristica rendere il container un file di dimensioni contenute, specie se paragonato con l’immagine di una macchina virtuale completa.

I container presentano un’elevata scalabilità e vengono avviati molto rapidamente per l’esecuzione delle applicazioni cloud native.

I container comprendono al loro interno le risorse necessarie per eseguire le applicazioni, tra cui le dipendenze, consentendo agli sviluppatori di scrivere il loro codice ed eseguirlo senza doverlo riconfigurare ogni volta.

Grazie all’impiego di tecnologie dedicate è possibile avviare le istanze dei container su vari sistemi operativi, sia in locale che in cloud.

I container sono quindi estremamente portabili, anche grazie alla loro ridotta dimensione.

I container offrono una risposta pratica e funzionale alle esigenze dei team di sviluppo che impiegano metodologie moderne come DevOps.

La loro portabilità e la loro ridotta dimensione li rendono ideali per l’esecuzione dei microservizi che compongono il software cloud native e, in generale, recepiscono in pieno la logica CI/CD (continuous integration / continuous deploy) che si basa su brevi e frequenti variazioni di codice.

I container risultano funzionali ad altre tecnologie tipiche del cloud, come le architetture serverless, in grado di automatizzare l’allocazione delle risorse hardware necessarie per eseguire le applicazioni, in maniera del tutto trasparente per i team di sviluppo.

Il mercato delle tecnologie di containerizzazione vede la prevalenza di due tipologie: gli application container (Docker) e i system container (LXC).

Gli application cointainer comprendono i file, le librerie e le dipendenze di un’applicazione che viene eseguita su un sistema operativo host.

Consentono di creare e configurare rapidamente istanze avviate in maniera tra loro indipendenti, il che le rende ideali per lo sviluppo di applicazioni basate su microservizi.

La tecnologia più diffusa in questo ambito è Docker, spesso gestita attraverso la piattaforma di orchestrazione Kubernetes.

I system container, come LXC (Linux Containers) costituiscono una sorta di via di mezzo tra gli application container e le macchine virtuali.

Possono eseguire un sistema operativo in maniera simile alle VM, senza tuttavia emulare l’hardware di sistema. Ciò consente all’utente di poter configurare le librerie, le dipendenze e i database necessari per l’esecuzione del software, in maniera più snella rispetto a dover gestire una VM completa.

I principali casi d’uso dei container, oltre ai già citati microservizi e allo sviluppo DevOps, riguardano soprattutto gli ambienti multicloud.

La capacità innata di essere eseguiti in maniera coerente in più ambienti IT, li rende ideali per distribuire i servizi in multicloud, avvalendosi dei PaaS di differenti cloud service provider, ai fini di ottenere evidenti vantaggi in termini di performance, riducendo al tempo stesso i proverbiali rischi legati al vendor lock-in.

Oltre che nello sviluppo di applicazioni cloud native, i container costituiscono un punto di riferimento anche quando si tratta di migrare il software legacy, che viene decomposto rispetto all’architettura monolitica originale e distribuito in cloud attraverso una progressiva containerizzazione.