Spesso installare mantenendo applicativi non è facile specialmente quando questi vengono forniti all’esterno del repository di sistema – ossia sui canali di distribuzione ufficiale dei programmi relativi al nostro sistema operativo.
C’è il rischio di complicarsi la vita configurando un’applicazione distribuita all’interno di uno zip o installato tramite un misterioso script bash.
Parliamo di container e di come questi funzionino grazie ad alcune funzionalità base del sistema operativo Linux.
I vantaggi dei container rispetto all’approccio classico sono innumerevoli.
Il paradigma dei container Linux punta a standardizzare il ciclo di vita di un’applicazione, dal suo avvio all’aggiornamento e, in caso di problemi, persino al suo roll back.
Le operazioni per scaricare ed eseguire altre applicazioni non saranno particolarmente differenti una volta imparati i comandi di base.
Il concetto base della containerizzazione è l’isolamento tra i processi e le risorse. I processi di un container girano isolati da quelli del sistema host ed accedono ad un set ristretto di risorse in maniera simile a quanto avviene con una virtual machine ma con una footprint ridotta in quanto non dovremo virtualizzare l’hardware.
Alla base del funzionamento dei container ci sono delle funzionalità core di Linux incluse nella maggior parte delle distribuzioni.
Ma quali sono queste funzionalità di cui stiamo parlando?
- Namespaces. Una funzionalità del kernel che permette di isolare i processi, la rete, le comunicazioni tra i processi e i volumi montati.
- Capabilities e SecComp. Permettono all’applicazione di far affidamento su funzionalità riservate all’utente root senza per questo concedervi tutti i permessi che sono normalmente riservati a quest’ultimo.
- SELinux. Un’evoluzione rispetto ai permessi base di Linux, consente ai processi di accedere solamente ai files di un contesto specificato – ad esempio permettendo a un server web di accedere ai file da servire ma non alla cartella home dell’utente applicativo.
- Chroot. Il suo scopo è isolare l’applicazione all’interno di un’area riservata in modo che questa non veda i file all’esterno del suo sistema.
Non è necessario interfacciarsi con tutte queste componenti singolarmente!
Per configurare, avviare e mantenere un container esistono programmi appositi.
Nel mondo Red Hat troviamo Podman, uno strumento Open Source simile a Docker ma decisamente molto più potente e maturo; entrambi i progetti fanno uso delle immagini basate sugli standard OCI (Open Container Initiative) che memorizzano l’applicativo in più strati.
Queste immagini sono vere e proprie bolle di Linux in quanto l’immagine base contiene una distro Linux minimale e negli strati superiori – che si aggiungono – ci sono metadati, librerie e binari dell’applicazione.
Il container runtime si occupa di unire gli strati, configurare le restrizioni dei container e avviare il processo specificato.
Podman, poi, aggiunge due importantissime funzionalità rispetto a Docker:
- la gestione dei cosiddetti “pod” che possono raggruppare più container al loro interno, permettendo la comunicazione tra i processi e condividendo, per esempio, i namespaces di rete e i limiti di cgroups.
- la capacità di lavorare con gli oggetti di Kubernetes e di esportarli in formato yaml.
Grazie all’utilizzo dei container, la gestione delle applicazioni diventa molto più semplice e sicura grazie alla standardizzazione delle componenti e dei procedimenti.
L’evoluzione l’abbiamo con gli orchestratori: il gold standard è sicuramente usare Kubernetes o una delle distribuzioni come Red Hat OpenShift.