Panoramica
Con containerizzazione intendiamo il raggruppamento di codice software e di tutti i relativi componenti necessari, come librerie, framework e altre dipendenze, in modo che risultino isolate in un proprio contenitore che chiamiamo "container".
Questo metodo consente di essere spostare ed eseguire in modo uniforme il software o l'applicazione contenuta nel container in qualsiasi ambiente e infrastruttura, indipendentemente dal sistema operativo eseguito. Il container costituisce una sorta di bolla, un ambiente di elaborazione circostante all'applicazione, che la mantiene indipendente da ciò che la circonda. Si tratta in sostanza di un ambiente di elaborazione portatile e completamente funzionale.
I container sono un'alternativa al coding in una piattaforma o sistema operativo quando il codice potrebbe non essere compatibile con il nuovo ambiente e lo spostamento dell'applicazione risulta quindi difficile, causando bug, errori e difficoltà che devono essere superate, ma che richiedono tempo, rallentano la produttività e aumentano la frustrazione.
Raggruppando tutti gli elementi di un'applicazione in un container che può essere spostato tra piattaforme e infrastrutture, l'applicazione potrà essere utilizzata dove necessario.
L'idea dell'isolamento dei processi non è nuova, ma è solo nel 2013, quando Docker ha presentato Docker Engine, che è stato definito lo standard per l'impiego dei container con strumenti di facile utilizzo per gli sviluppatori e un approccio universale alla creazione dei pacchetti. Da allora, l'adozione della tecnologia dei container ha registrato una forte accelerazione. Gli sviluppatori possono oggi scegliere tra varie piattaforme e strumenti di containerizzazione, ad esempio Podman, Buildah e Skopeo, che supportano gli standard di Open Container Initiative, un progetto avviato da Docker.
Vantaggi
La caratteristica di leggerezza o portabilità dei container deriva dalla capacità di condividere il kernel del sistema operativo dell'host, evitando la necessità di disporre di un sistema operativo distinto per ogni container e consentendo l'esecuzione dell'applicazione su qualsiasi infrastruttura —bare metal, cloud — anche in macchine virtuali, come vedremo nel prossimo paragrafo.
Inoltre, gli sviluppatori possono avvalersi degli stessi strumenti quando lavorano con i container in diversi ambienti host, il che semplifica nettamente lo sviluppo e il deployment di app containerizzate su diversi sistemi operativi.
Container e macchine virtuali
Una macchina virtuale (VM) è un ambiente virtuale che funziona come un sistema informatico virtuale autonomo, dotato di CPU, memoria, interfaccia di rete e storage, creato su un sistema hardware fisico, ubicato fuori sede o on premise.
La somiglianza tra containerizzazione e virtualizzazione sta nel fatto che entrambe consentono l'isolamento completo delle applicazioni, che le rende operative su più ambienti. La differenza sta invece nelle dimensioni e nella portabilità.
Le VM hanno la maggiore dimensione, calcolata di solito in gigabyte. Contengono il proprio sistema operativo, che consente loro di eseguire contemporaneamente funzionalità ad uso intensivo di risorse. Il numero di risorse sempre maggiore a disposizione delle VM consente loro di estrarre, suddividere, duplicare ed emulare interi server, sistemi operativi, desktop, database e reti.
La dimensione dei più piccoli container è in genere calcolata in megabyte; essi non contengono altro che un'app e il proprio ambiente di esecuzione.
Le VM sono ideali per le architetture IT monolitiche e tradizionali, mentre i container sono progettati per essere compatibili con le tecnologie più recenti quali cloud, CI/CD e DevOps.
Container e microservizi
I container sono spesso utilizzati per raggruppare singole funzioni che eseguono attività specifiche, noti come microservizi. Nei microservizi i componenti dell'applicazione sono suddivisi in servizi più piccoli e specializzati, che consentono agli sviluppatori di lavorare su una specifica area dell'applicazione senza incidere sulle sue prestazioni complessive.
In questo modo l'app è sempre in esecuzione, anche durante gli aggiornamenti o la correzione dei problemi, accelerando le migliorie, i test e i deployment.
Caratteristiche quali portabilità, compatibilità e scalabilità rendono microservizi e container simili e funzionali.
Orchestrazione dei container
Come vengono gestiti i container? È qui che entra in gioco l'orchestrazione dei container, ovvero l'automazione dei processi di deployment, gestione, scalabilità e networking dei container.
Kubernetes è una piattaforma di orchestrazione per container open source che semplifica la gestione di applicazioni distribuite e containerizzate su larga scala. È sufficiente indicare a Kubernetes dove si desidera eseguire il software perché la piattaforma si occupi delle attività necessarie a distribuire e gestire i container.
Prima di essere donato alla Cloud Native Computing Foundation (CNCF), nel 2015, Kubernetes fu progettato e sviluppato dagli ingegneri di Google, uno dei primi contributori alla tecnologia per container Linux. Oggi CNCF è l'organismo responsabile della gestione della community Kubernetes, i cui contributori e amministratori volontari si occupano dello sviluppo, della manutenzione e delle release del prodotto.
Red Hat è stata una delle prime aziende a collaborare con Google all'iniziativa Kubernetes, sin da prima del lancio, ed è diventata il secondo contributore al progetto Kubernetes.
Perché scegliere la containerizzazione Red Hat?
Red Hat OpenShift è la versione di Kubernetes per l'ambiente enterprise. Un prodotto software che include i componenti del progetto Kubernetes per la gestione dei container oltre a funzionalità per la produttività e la sicurezza fondamentali per le aziende più grandi.
Il termine "OpenShift" fa riferimento alla tecnologia di orchestrazione dei container downstream che deriva dal progetto open source OKD, già noto come OpenShift Origin. Con "Red Hat OpenShift" si intende la suite di prodotti per l'orchestrazione dei container di Red Hat. I prodotti Red Hat OpenShift includono pacchetti contenenti diversi componenti preconfigurati, insieme a OpenShift, tra cui: