Negli ultimi anni potresti aver sentito parlare di container, architettura a microservizi, orchestrazione, Docker e Kubernetes. Se ti stai approcciando per la prima a questo mondo e/o vorresti approfondire le tue conoscenze, sei nel posto giusto!
In questa serie di articoli andremo a discutere le moderne tecnologie di sviluppo e a scoprire cosa c’è dietro: partiamo subito!
Cos'è un Container?
Un container è un pacchetto software che contiene tutte le librerie e le dipendenze necessarie per eseguire l’applicazione o il servizio in esso incapsulato.
La containerizzazione è resa possibile da tre componenti principali:
- Kernel Namespaces: funzionalità del kernel Linux che permette l’isolamento tra container. Esistono diverse tipologie di kernel namespaces, ognuna con le proprie caratteristiche, come ad esempio:
- Network namespace – attribuisce ad ogni container uno stack di rete differente (indirizzi IP, tabelle di routing, Firewall, ecc.)
- PID namespace – attribuisce ad ogni container una lista processi isolata da altri container: sarà possibile avere 2 processi distinti con lo stesso process identifier (PID)
- Control Groups (cgroups): feature del kernel Linux che permette di gestire priorità e limiti in termini di utilizzo delle risorse (CPU, memoria RAM, disco, rete) dei vari container.
- Container Runtime: software responsabile della gestione del ciclo di vita dei container. Docker è sicuramente la container runtime più famosa, tant’è che spesso, la parola Docker viene utilizzata (in modo errato) come sinonimo di container, ma non è l’unica disponibile; tra le altre container runtime (o engine) abbiamo ContainerD e CRI-O.
Possiamo quindi rappresentare i container e l’infrastruttura che li ospita come segue:
Container VS Macchine Virtuali - Differenze
Se prendiamo come riferimento l’illustrazione precedente e la contrapponiamo a quella delle macchine virtuali (VM), con cui molto probabilmente hai più familiarità , possiamo notare delle similitudini:
Osserviamo come entrambe le soluzioni, container e VM, offrono la possibilità di far girare applicazioni, con le proprie dipendenze e librerie, in ambienti piuttosto isolati.
Tuttavia, le analogie si fermano qua, infatti le macchine virtuali e i container agiscono a 2 diversi livelli: le prime virtualizzano l’hardware, messo a disposizione dal server, tramite l’hypervisor; mentre i secondi virtualizzano un sistema operativo.
Questo porta molteplici vantaggi a favore della containerizzazione, ad esempio non avendo lo strato del Guest OS (sistema operativo che viene eseguito su una VM), i container risultano molto più leggeri sia in termini di dimensioni, tipicamente qualche megabyte contro le decine e decine di gigabyte di una macchina virtuale, sia in termini di esecuzione; infatti, avviare un container richiederà pochi secondi perché verrà lanciata effettivamente solo l’applicazione, a differenza di una VM dove viene avviato un intero sistema operativo. Tra gli altri vantaggi possiamo elencare:
- Sviluppo agile (DevOps, microservizi)
- Maggiore portabilitÃ
- Minor numero di sistemi operativi da gestire e mantenere
- ScalabilitÃ
- Ottimizzazione delle risorse
Conclusione:
In sintesi, la containerizzazione è una tecnologia in forte crescita che permette di isolare e gestire in modo efficiente le applicazioni e i servizi.
I container sono pacchetti software autonomi che includono tutte le dipendenze necessarie per l’esecuzione dell’applicazione, rendendoli leggeri e altamente portatili.
A differenza delle macchine virtuali, che virtualizzano l’hardware del server, i container virtualizzano il sistema operativo, offrendo numerosi vantaggi come la maggiore agilità nello sviluppo, la portabilità , la scalabilità e l’ottimizzazione delle risorse.
Con l’aumento della popolarità della containerizzazione e delle architetture a microservizi, acquisire competenze in questo settore diventa sempre più importante per gli sviluppatori e gli ingegneri IT.
Condividi l’articolo!!
-
Linkedin
-
Twitter
-
Facebook
-
Whatsapp
Scopri i nostri corsi!
Abdelah Sato
DevOps Instructor & Engineer
Sono un System Engineer, istruttore e consulente nell’ambito delle tecnologie di virtualizzazione (VMware) e container (Docker & Kubernetes) con una smodata passione per il problem solving. Nel corso degli anni ho maturato esperienza nella gestione di sistemi informatici e nel campo dell’automazione attraverso l’utilizzo di strumenti quali Ansible, Terraform e VMware Automation.