Guida

Docker. Cos’è, come funziona e quando usarlo

Uno dei più noti sistemi open source per la gestione dei container, Docker rappresenta la tecnologia di sviluppo del software basata sui microservizi e il metodo DevOps. Rispetto alla virtualizzazione, offre dei vantaggi di portabilità, leggerezza e risparmio che lo rendono particolarmente interessante soprattutto in un mercato come quello odierno, caratterizzato da un’esigenza diffusa di flessibilità e da una richiesta di tempistiche brevi nel rilascio delle soluzioni

Pubblicato il 27 Gen 2022

Docker 1

Quando si parla di una delle tecnologie più innovative nell’ambito del cloud computing, cioè dei container, che corrispondono a quel complesso di dati che occorrono a un’applicazione cloud nativa per essere eseguita, il riferimento a Docker è d’obbligo. Docker, infatti, rappresenta il software open source per la containerizzazione in ambiente Linux, ma non solo, forse più noto a livello mondiale. Con lo stesso nome vengono indicati sia il progetto e la community impegnata nel miglioramento costante della soluzione, sia la società Docker Inc., comprata nel novembre 2019 da Mirantis Inc., azienda specializzata in servizi cloud B2B e nello sviluppo di Kubernetes e OpenStack. Un’acquisizione che segue, perciò, una logica ben precisa. Kubernetes è infatti la piattaforma di orchestrazione di container per antonomasia. OpenStack è un’infrastruttura cloud “container friendly”, sebbene non sia l’unica.

Cos’è Docker e come funziona

Docker è una piattaforma open source basata su container e funzionalità sviluppate su Linux. Permette agli sviluppatori di operare sui container, che raccolgono il software in unità standardizzate. Docker ha la funzione di fornire all’applicazione le risorse per poter funzionare in qualsiasi ambiente.

Containerizzazione, microservizi e DevOps

Per comprendere il funzionamento di Docker, è opportuno fare una premessa. La containerizzazione è un approccio moderno nello sviluppo e nel rilascio del software basato sui microservizi e su un metodo come il DevOps che si ispira a un insieme di processi e strumenti “lean”. In sostanza, è il contrario della pratica monolitica del passato che prevedeva una sola unità di deployment per un’intera applicazione. Essa presentava l’inconveniente per cui, dover apportare anche una piccola modifica, costringeva a rimettere mano a tutto il software.

Invece, l’architettura granulare dei microservizi, ciascuno dei quali è incapsulato in un container, permette agli sviluppatori di lavorare in contemporanea sulla singola componente di una struttura più ampia, anche adoperando tipologie di codice differente. Senza che questo, fra l’altro, pregiudichi la possibilità di comunicazione fra i vari elementi, giacché i microservizi dispongono allo scopo di interfacce di programmazione delle applicazioni o API (Application Programming Interface). Il risultato è una maggiore agilità nello sviluppo e nel rilascio delle applicazioni. Di conseguenza si ha un accorciamento del time to market e una maggiore aderenza al contesto attuale di mercato che chiede flessibilità e risposte immediate.

Docker e virtualizzazione a confronto

Docker si inserisce in questa tendenza a semplificare il ciclo di vita del software, isolando processi e applicazioni. Obiettivo è che la loro esecuzione indipendente sia in grado di ottimizzare le risorse dell’infrastruttura. In tal senso si pone in continuità, migliorandolo, con il paradigma SOA (Service-Oriented Architecture). Essa èuna metodologia di scomposizione alternativa allo sviluppo monoblocco che ha anticipato l’avvento dei microservizi. Rispetto alla SOA e ad altre modalità di sviluppo, la novità che porta Docker si concentra in particolare nell’affrancamento dalla virtualizzazione come standard univoco di testing e deployment. Basti pensare che all’epoca del suo rilascio, avvenuto nel marzo 2013, veniva spesso equiparato agli hypervisor delle macchine virtuali (VM), di cui condivide diversi benefici, ma non i relativi costi.

Il paragone era dovuto probabilmente anche al fatto che per il primo anno Docker utilizzò un ambiente di virtualizzazione leggera a container come LXC. Ambiente poi abbandonato nel 2014 a favore della propria libreria scritta in linguaggio Go. Ma l’affinità, almeno dal punto di vista concettuale, è rimasta. Tanto che non è raro imbattersi ancora oggi in articoli e post che spiegano perché Docker non vada confuso con un sistema di virtualizzazione dell’hardware.

Portabilità e leggerezza, i vantaggi del download di Docker

Oltre a discostarsi dal meccanismo di astrazione tipico delle VM, superando i suoi potenziali sprechi di risorse di calcolo, il download di software Docker ha il duplice vantaggio della portabilità e della leggerezza. La portabilità deriva dal suo processo di distribuzione basato su file di immagine. Un processo che facilita la condivisione delle applicazioni e dei servizi tra più ambienti. Ogni file di immagine è formato da livelli o layer, che si creano ogni qualvolta interviene una modifica. La stratificazione in layer abilita al rollback e al ripristino della versione precedente, velocizzando i processi di deployment continui. Se si mette a confronto questo meccanismo con la difficoltà e i rischi che comporta la migrazione di una macchina virtuale da un host all’altro, si capisce in che senso i container di Docker siano portabili.

Per quanto riguarda la leggerezza, questa dipende dalla capacità dei container di sfruttare il kernel del sistema operativo, eliminando l’overhead richiesto per l’esecuzione di ogni singolo kernel. Da qui la possibilità della macchina fisica di ospitare tantissimi container. È anche vero che questo aspetto positivo convive con una maggiore vulnerabilità che si genera quando il kernel dell’host viene condiviso con i container. Bisogna considerare infatti che questo aumenta la base dell’esposizione a possibili attacchi. Una criticità non insormontabile, ma che necessita di policy di sicurezza integrate nel flusso dei container.

Sicurezza: le funzionalità del kernel Linux; namespace e cgroups, messe a disposizione anche da Windows

In materia di sicurezza, Docker si avvale di una funzionalità propria di Linux, namespace. Ogni namespace è associato a un processo in esecuzione nel container. Esso non può accedere ai namespace degli altri container, né a quelli della macchina ospitante. Questo garantisce l’opportuno isolamento tra container, ma non ne intacca la flessibilità che è governata mediante un altro strumento del kernel di Linux, i control groups (cgroups).

Strutturati secondo una gerarchia ad albero, i cgroups consentono di gestire l’allocazione delle risorse in ciascun container e la lista dei processi eseguibili. In tal modo assolvono al compito che in un sistema virtualizzato viene svolto dall’hypervisor. Questo coordina la distribuzione delle risorse in ogni VM, oltre ad assicurare l’isolamento dall’host. Incarico, quest’ultimo, a cui invece nell’ambiente containerizzato provvede namespace, come si è detto prima.

Analoghe funzionalità sono messe a disposizione da Windows. Si deve tener presente però che non è possibile eseguire container Linux direttamente sul kernel Windows. E che quindi bisogna passare da Hyper-V o da Oracle VirtualBox.

Differenza tra Docker e Kubernetes

Nonostante vengano spesso messi a confronto, in realtà Docker e Kubernetes sono due strumenti complementari, che si occupano di due momenti differenti dello sviluppo tramite container.

Kubernetes funziona tramite unità di pianificazione chiamate pod, utilizzati per risolvere problemi relativi alla presenza di grandi numeri di container. Si occupa dunque di orchestrazione.

Docker invece è una tecnologia di distribuzione di contenitori portabili e autosufficienti, eseguibili in locale o in cloud.

Perché anche la versione a pagamento di Docker conviene

Oggi Docker è disponibile in due versioni, quella gratuita (CE, Community Edition) e quella a pagamento (EE Enterprise Edition). Quest’ultima, a sua volta, ha due canali di aggiornamento: Edge, che contempla release mensili; Stable, a cadenza quadrimestrale. Anche la versione a pagamento è un buon investimento. Questo perché, in forza dell’automatizzazione del deployment, Docker abbatte drasticamente i tempi di configurazione e installazione. Secondo AWS, che offre soluzioni Docker attraverso il servizio Amazon Elastic Container Service (ECS), gli utenti Docker arrivano a distribuire software con una frequenza media 7 volte superiore.

A questo si aggiunge il risparmio sui costi sia di personale sia di infrastruttura. Nel primo caso significa meno individui impegnati nello sviluppo di una sola applicazione. O comunque maggiore efficienza su progetti articolati e particolarmente complessi ai quali collaborano piccoli team correlati ai vari container. Sul versante dell’infrastruttura, il ricorso a Docker contribuisce all’ottimizzazione dei livelli di utilizzo dei server. Questo perché memoria e dischi possono essere meglio sfruttati tra diverse istanze. L’unico problema potrebbe scaturire dall’eccessiva proliferazione di container e di applicazioni containerizzate. Problema facilmente risolvibile con un sistema di orchestrazione dei container qual è per esempio Kubernetes.

Valuta la qualità di questo articolo

La tua opinione è importante per noi!

Articoli correlati

Articolo 1 di 4