Docker… questo sconosciuto!

Se non l’avete mai sentito nominare probabilmente è perché il progetto Docker nasce nel 2013 come evoluzione open source di un progetto privato, ma è solo dal 2015 che inizia seriamente a diffondersi, soprattutto anche ai non “addetti ai lavori”. Si tratta quindi di un software piuttosto giovane, ma che è maturato velocemente e oggi mostra funzionalità e caratteristiche degne di nota.

Cosa è docker?

Per dirla in modo molto semplice, docker è un virtualizzatore che permette di eseguire applicazioni con le relative dipendenze all’interno di contenitori software astratti a livello di sistema operativo anziché di hardware. Per dirla ancora più semplice dobbiamo immaginare docker come un gestore di contenitori nei quali possiamo mettere qualsiasi applicazione e farla funzionare e interagire col sistema ospitante, ma contemporaneamente mantenerla da esso isolato. Docker permette l’esecuzione di più contenitori contemporaneamente e quindi l’esecuzione di più processi simili ma sempre isolati rispetto al sistema operativo ospitante.
Docker nasce su sistemi Linux, ma oggi è disponibile anche per Windows e Mac ed esiste un’enorme varietà di contenitori di applicativi in giro per il web, principalmente raccolti nel sito hub.docker.com.

Come si usa docker?

Innanzitutto docker va installato nel proprio sistema, e per farlo consiglio di seguire le indicazioni più che chiare presenti nel sito ufficiale. Quel che è più interessante è invece distinguere e spiegare i principali attori che intervengono nell’uso di docker: l’engine, il compose, il container, le images e i volumes.

In ambiente Linux esiste una netta distinzione tra questi attori che invece tende a sfumare all’interno di sistemi operativi come Windows e Mac, anche se è pur sempre presente. Cerchiamo quindi di vederli in dettaglio.
L’engine è il motore principale che si occupa del funzionamento di tutto il sistema di virtualizzazione. Grazie all’engine è possibile creare, eseguire e monitorare tutti i containers installati nel sistema, ma fa anche molto altro.
Le images sono invece file contenenti il software con le relative dipendenze da virtualizzare e si possono scaricare dal web, o generare autonomamente (grazie all’engine). Come detto prima uno dei più grossi distributori di immagini per docker è proprio il sito docker.com.
Quando docker avvia una virtualizzazione partendo da un’immagine crea da essa un contenitore (container) contenente l’ambiente in esecuzione. Partendo da una singola immagine possono essere eseguiti più container e quindi è possibile avere in esecuzione più istanze di una stessa applicazione.
Ogni container è un ambiente a se, contiene tutte le risorse necessarie in termini di applicazioni, spazio disco, rete e memoria per funzionare, ma non sono ambienti completamente sigillati, è possibile farli interagire con il resto del mondo e anche con il sistema ospitante. A seconda del container in esecuzione esiste infatti la possibilità di fornirgli spazio disco aggiuntivo, specifici instradamenti di rete ma anche la possibilità di eseguirlo come processo di sistema.
Spesso un container necessita di file di configurazione specifici per l’applicativo in uso e per quanto detto sopra questi normalmente si trovano all’interno del container stesso. Per fare in modo che tali parametri possano essere riutilizzati in caso di aggiornamento o sostituzione del container, spesso si preferisce che la directory che li contiene venga mappata con una directory del sistema ospitante. Per farlo si utilizzano i volumi (volumes) che altro non sono che dei riferimenti con un proprio nome che permettono per l’appunto di fare in modo che una directory interna al container sia collegata ad una nel sistema ospitante esterno.

Come è facile immaginare esistono appositi comandi per fare in modo che l’engine possa gestire immagini, contenitori, volumi, rete e processi. Le opzioni sono parecchie e spesso le istruzioni che vengono scritte sono molto lunghe. Inoltre partendo da un container in esecuzione non è affatto semplice risalire alle opzioni che gli hanno dato vita. Questo crea una certa difficoltà nel mantenimento a lungo termine di container che hanno bisogno di aggiornamenti. Tale procedura infatti prevede che il container venga fermato, cancellato, si aggiorni la sua immagine e da questa venga avviato un nuovo container con gli stessi parametri di quello precedente.
Per semplificare tutto questo è stato inventato il docker compose, che altro non è che un interprete yaml che a partire da un file di configurazione genera ed esegue autonomamente il container docker.
Docker compose non si limita naturalmente solo a questo, semplifica enormemente anche altre funzioni come ad esempio la costruzione di nuove immagini. È quindi uno strumento molto utile che conviene avere sempre installato insieme all’engine.

Quello che abbiamo visto qui è una spolverata leggera al velo di mistero che cela docker, ma la ritengo necessaria per spiegare sommariamente cosa esso sia. Segnalo però a tutti di non lasciare perdere l’argomento, ma soprattutto consiglio a coloro i quali hanno servizi dislocati nei propri server, anche domestici, di approfondire e sperimentare perché docker è veramente un enorme e potente strumento che oggi è in grado, grazie alla grande varietà di immagini disponibili, di semplificazione il deploy di quasi tutti i servizi.