Docker, uno strumento per la Gestione Moderna delle Applicazioni
Nell’ambito dello sviluppo e della gestione delle applicazioni, Docker ha rapidamente guadagnato popolarità come uno strumento indispensabile. Questa tecnologia di containerizzazione ha rivoluzionato il modo in cui le applicazioni vengono sviluppate, distribuite e gestite, offrendo una soluzione efficiente, portatile e scalabile.
Cos’è Docker?
È una piattaforma open-source che semplifica la creazione, la distribuzione e l’esecuzione di applicazioni all’interno di container. Un container è un ambiente isolato che include tutto il necessario per eseguire un’applicazione, come il codice, le librerie, le dipendenze e le variabili di ambiente. A differenza delle macchine virtuali, i container condividono il kernel del sistema operativo host; ciò li rende molto più leggeri e veloci da avviare.
Container vs. Macchina Virtuale
Le macchine virtuali (VM) e i container sono due soluzioni che consentono di eseguire applicazioni in ambienti isolati, ma ci sono differenze fondamentali nel loro funzionamento e nel modo in cui gestiscono le risorse del sistema.
Cos’è una macchina virtuale? Come ben spiegato qui.
Le macchine virtuali sono software che offrono le stesse funzionalità dei computer fisici. L’idea più importante è che una macchina virtuale riproduce un sistema operativo completo, incluso il kernel, “simulando” (in qualche modo) le risorse hardware a disposizione del sistema.
Un container, invece, si appoggia al kernel del sistema operativo host, riproducendo e isolando solamente quello che serve per l’esecuzione dello strato applicativo.
Macchina Virtuale (VM)
Alcune caratteristiche che presentano le macchine virtuali:
- Isolamento: Le VMs forniscono un isolamento completo tra il sistema operativo guest e l’host. Ogni VM include un proprio sistema operativo, kernel e risorse virtualizzate come CPU, memoria, storage e interfacce di rete.
- Peso: Le VMs sono più pesanti in quanto includono un sistema operativo completo. Ogni VM richiede la duplicazione di tutti i componenti, inclusi il sistema operativo, i driver e le librerie.
- Avvio e Arresto: Il tempo di avvio di una VM è più lungo rispetto a quello di un container, poiché richiede il caricamento completo di un sistema operativo.
- Risorse: Le VMs possono richiedere più risorse in termini di memoria e storage, poiché ciascuna VM ha un proprio sistema operativo separato. Le VMs possono consumare più risorse poiché eseguono sistemi operativi completi.
Container
Ricordiamo che i container condividono il kernel del sistema operativo host e creano solo i componenti necessari all’esecuzione dell’applicazione, ovvero isolano solo l’applicazione, le dipendenze e i processi.
Questa caratteristica fondamentale si traduce nelle seguenti proprietà:
- Isolamento: Ogni container è un’istanza separata dell’applicazione, ma condivide il kernel e altri componenti del sistema operativo host.
- Peso: I container sono leggeri poiché non includono un sistema operativo completo.
- Avvio e Arresto: I container avviano e si arrestano rapidamente, poiché non devono avviare un sistema operativo completo.
- Risorse: I container richiedono meno risorse rispetto alle VMs, poiché non necessitano di eseguire un kernel separato o altre componenti che già si trovano sul sistema operativo host. I container sono più efficienti nell’utilizzo delle risorse, poiché possono essere avviati su un sistema più snello.
Quando scegliere una VM o un Container
- VM: Sono più adatte per applicazioni che richiedono un isolamento completo e devono eseguire sistemi operativi diversi. Ad esempio, in scenari in cui è necessario eseguire diverse versioni di sistemi operativi o applicazioni legacy.
- Container: Sono più adatti per applicazioni distribuite, microservizi e ambienti di sviluppo dove l’efficienza delle risorse e la velocità di avvio/arresto sono cruciali. Sono ideali per ambienti di sviluppo, staging e produzione di applicazioni basate su microservizi.
Come funziona Docker?
Docker utilizza il concetto di containerizzazione per isolare e gestire applicazioni in ambienti leggeri e portabili. Vediamo come funziona dal punto di vista tecnico: utilizza un approccio client-server: il Docker client comunica con il Docker daemon, che gestisce i container. I container Docker vengono creati a partire da immagini, che sono strati leggeri che contengono il codice dell’applicazione e tutte le sue dipendenze.
Queste immagini possono essere condivise attraverso Docker Hub, che è un registro pubblico di immagini, possono essere salvate in un registro privato di immagini, o possono essere create e gestite localmente.
Docker dietro le quinte
Ci possiamo chiedere come sia possibile che un container ottenga un isolamento in qualche modo analogo a quello delle macchine virtuali senza ricreare un sistema e un kernel propri. Ciò avviene sfruttando delle caratteristiche del kernel di Linux, che permettono di isolare processi e limitare risorse: i namespaces. I namespaces in Linux consentono di isolare un processo, una risorsa di rete, un filesystem; queste caratteristiche fanno sì che alcuni processi nel sistema vengano eseguiti in un ambiente isolato, nel senso che non hanno accesso ad altri processi e ad altre risorse che quelli a loro assegnati.
Dalla documentazione di Linux, presentiamo alcuni namespaces e l’isolamento che questi consentono:
Architettura di Docker
Docker daemon:
- Il daemon (dockerd) è un processo in background che gestisce la creazione, l’esecuzione e la distribuzione dei container.
- Il daemon comunica con il Docker client tramite REST API e gestisce le operazioni sui container.
Docker client:
- Il Docker client (docker) è un’interfaccia da riga di comando o una GUI che consente agli utenti di interagire con il Docker daemon.
- Gli utenti usano il client per dare comandi al daemon, come la creazione di nuovi container o la gestione di immagini.
Docker Images:
- Un’immagine Docker è uno snapshot leggero e autosufficiente di un sistema di file che include il codice dell’applicazione, le librerie, le dipendenze, le variabili di ambiente e altri elementi necessari per l’esecuzione dell’applicazione.
- Le immagini sono la base da cui i container vengono creati.
- Le immagini possono essere salvate e condivise su registri Docker online, che permettono di pubblicarle (con accesso più o meno ristretto) e scaricarle.
Docker Containers:
- I container sono istanze in esecuzione di un’immagine Docker. Ogni container è un ambiente isolato che esegue un’applicazione specifica.
- I container condividono il kernel del sistema operativo host ma sono separati per quanto riguarda il file system, i processi e le risorse.
Ecco come la pagina di presentazione della documentazione ufficiale riassume in un’immagine l’architettura:
Come riporta la documentazione di Docker:
Il Docker client e il Docker daemon possono essere eseguiti sullo stesso sistema oppure è possibile connettere un Docker client a un Docker daemon remoto. Il client e il daemon comunicano utilizzando un’API REST, tramite socket UNIX o un’interfaccia di rete.
Immagini Docker
Un’immagine Docker è un template che permette la creazione di un container (cf. la documentazione). Nell’immagine si possono includere i file e i programmi che dovranno essere presenti nel container e si può specificare il comando che verrà eseguito dal container all’avvio e le eventuali porte che esso dovrà esporre sulle sue interfacce di rete.
Un’immagine può essere taggata, ovvero, le si assegna un tag o identificatore che specifichi la versione dell’immagine stessa. In questo modo, possiamo avere più immagini per uno stesso software, ad esempio: potremmo avere più immagini per ubuntu, specificate nel nome dopo il segno di due punti : come segue: ubuntu:mantic o ubuntu:noble. Solitamente, si usa il tag latest per specificare la versione più recente di un’immagine.
Volumi
Sebbene i contenitori possano creare, aggiornare ed eliminare file, tali modifiche vengono perse quando il container viene rimosso: Docker isola tutte le modifiche apportate a quel container. Con i volumi si può modificare questo comportamento.
I volumi offrono la possibilità di connettere percorsi specifici del file system del container al computer host. Se si monta una directory nel container, le modifiche in quella directory verranno visualizzate anche sulla macchina host. Se si monta la stessa directory durante i riavvii del container, vedresti gli stessi file.
Esistono due tipi principali di volumi:
- Il mount di un volume è la scelta ottimale quando è necessaria una posizione persistente in cui archiviare i dati dell’applicazione; solitamente, l’accesso dal sistema host a questi dati non è una necessità ricorrente.
- Un bind mount è un altro tipo di mount, che consente di condividere una directory dal filesystem dell’host nel container. Quando si lavora su un’applicazione, è possibile utilizzare un bind mount per montare il codice sorgente nel container. Il container vede immediatamente le modifiche apportate al codice, non appena un file viene salvato. Ciò significa che è possibile eseguire processi nel container che controllano le modifiche del filesystem e rispondono ad esse.
Nella tabella seguente, tratta dalla documentazione, vengono illustrate le principali differenze tra i mount volume e i bind mount.
Cosa è Docker Desktop
Docker Desktop è un’applicazione installabile in ambiente Windows o Mac che consente di creare e condividere applicazioni containerizzate.
Docker Desktop include:
- il Docker daemon (dockerd),
- il Docker client (docker),
- Compose,
- Kubernetes.
Vantaggi di Docker
- Portabilità: Usando Docker, gli ambienti di sviluppo possono essere replicati esattamente in produzione, eliminando i problemi del tipo “funziona sul mio computer”.
- Efficienza: I container condividono il kernel del sistema operativo host, cosa che li rende più leggeri e veloci rispetto alle macchine virtuali.
- Isolamento: I container permettono di isolare le applicazioni, garantendo che una modifica in un container non influenzi gli altri.
- Scalabilità: I container possono essere facilmente scalati su più host, sia manualmente che con strumenti di orchestrazione come Swarm o Kubernetes.
In sintesi, questo software semplifica la distribuzione delle applicazioni, garantendo che siano eseguite in modo coerente in diversi ambienti. L’architettura leggera e flessibile ha reso Docker uno strumento fondamentale nello sviluppo e nella gestione delle applicazioni moderne.
Conclusione
In conclusione, Docker e le sue tecnologie correlate hanno cambiato il modo in cui si sviluppano, distribuiscono e gestiscono le applicazioni. Inoltre è uno strumento che facilita moltissimo la gestione di applicazioni e architetture cloud-based. L’uso di container offre grandi vantaggi in termini di portabilità e scalabilità; il costo richiesto è abbastanza gestibile: capire come lavorare con le API di questo potente prodotto, come usare il client e interfacciarsi al daemon.
In AIknow, grazie al deploy a container, siamo in grado di installare la sia in cloud che on premises, per esempio, abbiamo utilizzato questo prodotto per la realizzazione di un MES o alla realizzazione di una piattaforma di gestione/monitoraggio COIL.