Tutorial > Introduzione a Docker

Introduzione a Docker

Pubblicato il: 28 marzo 2021

Cloud DevOps Docker

Cos'è Docker

Docker è un progetto open-source che facilita e automatizza il processo di rilascio del software. Si inserisce nel solco di varie tecnologie di virtualizzazione che hanno permesso di semplificare le procedure di installazione e messa in esercizio del software. Da vari punti di vista Docker risulta superiore rispetto alle tecnologie che lo hanno preceduto.

A partire dal 2013, anno della sua nascita, Docker ha conosciuto un crescente utilizzo. Allo sviluppo e alla diffusione di questa tecnologia hanno contribuito, tra gli altri, Google, Huawei, IBM, Microsoft e Red Hat.

Negli anni Docker è diventato lo standard de facto per la costruzione e la diffusione di applicazioni all’interno di container, ha preparato il terreno per l’adozione di piattaforme di orchestrazione quali Kubernetes.

Docker in breve

Adottando questa tecnologia le applicazioni vengono distribuite sotto forma di immagini cioè di files che contengono tutto il necessario per l’esecuzione del programma: codice, dipendenze, librerie, configurazioni. A partire da un'immagine possono essere istanziati velocemente uno o più container, al cui interno gira l’applicazione.

Un container è un ambiente di esecuzione autosufficiente e isolato. Per implementare queste funzionalità Docker sfrutta due elementi del kernel Linux: cgroups e namespaces. Adottando i cgroups è possibile stabilire limiti all’uso di risorse come ad esempio CPU e RAM per un gruppo di processi (nella fattispecie, da parte di un container).

I namespaces, invece, permettono di garantire l’isolamento dei processi: un processo in esecuzione all’interno di un container non può accedere direttamente ad un altro container o alla macchina che lo ospita. Benché sia basato sul kernel Linux, Docker è disponibile anche in ambiente Windows e macOs.

Differenze tra Docker e macchine virtuali

Come abbiamo accennato, Docker rappresenta un’evoluzione delle tecniche di virtualizzazione più tradizionali. Per virtualizzazione si intende la capacità di astrarre risorse tecnologiche come hardware, memoria e componenti di rete, ai fini di impiegarle in modo più efficiente e flessibile.

Docker vs Hypervisor

Dalla figura è possibile intuire la differenza principale tra l’architettura delle macchine virtuali e quella di Docker. Nelle Virtual Machines (VM) un’applicazione o un gruppo di applicazioni sono eseguite in un ambiente che viene reso disponibile e controllato dallo Hypervisor, tale ambiente comprende necessariamente il sistema operativo distinto da quello dello host.

Le applicazioni lanciate all’interno di container Docker condividono, invece, l’utilizzo del kernel del sistema operativo host. Non contenendo il sistema operativo i container Docker sono più leggeri delle VM: Docker dà origine a immagini più piccole rispetto alle macchine virtuali, i tempi di avvio di un container sono ridotti.

Rispetto alle VM i container garantiscono, inoltre, una maggiore portabilità e fanno registrare un minor consumo di risorse permettendo uno sfruttamento più efficiente dello host. D’altra parte le macchine virtuali assicurano un maggiore isolamento tra host e applicazioni, risultando meno esposte a rischi di sicurezza rispetto ai container Docker.

Approfondiremo in una lezione successiva le best practices per realizzare container sicuri.

Vantaggi dell’adozione di Docker

Per quanto visto finora, l’adozione di Docker consente di impiegare in modo efficiente e pratico le risorse tecnologiche a nostra disposizione. Ad un'analisi più approfondita emergono ulteriori aspetti che possono spiegare il carattere innovativo di Docker e il considerevole successo ottenuto. Esaminiamo nel dettaglio i vantaggi offerti da questa tecnologia.

Docker viene pubblicizzato con lo slogan: "Build, Ship, and Run Any App, Anywhere". Aldilà dei richiami promozionali, Docker permette effettivamente di realizzare un deploy riproducibile e deterministico.

In una prima fase costruiamo l’immagine che racchiude la nostra applicazione, comprendente dipendenze e librerie: il Dockerfile (approfondiremo questo aspetto nei prossimi capitoli). Al momento ci basti sapere che il Dockerfile è essenzialmente una "ricetta" per la preparazione dell’ambiente di esecuzione in cui codifichiamo tutti i passaggi di installazione e configurazione che in precedenza realizzavamo, magari, manualmente.

Possiamo quindi procedere in modo semplice e rapido al rilascio in vari ambienti, anche caratterizzati da diversi sistemi operativi, ottenendo l’esecuzione dello stesso software, all’interno di ogni container. Si capisce che l’uso di Docker semplifica e velocizza anche il passaggio del software attraverso gli ambienti che caratterizzano il suo ciclo di vita (sviluppo, test/collaudo, produzione).

Docker è, inoltre, uno strumento centrale nella metodologia DevOps: un insieme di pratiche emerse nell’ultimo decennio che punta a ridurre la distanza tra sviluppatori e addetti alle operations, allo scopo di produrre software in modo più veloce ed efficiente. Docker è particolarmente adatto allo sviluppo di microservizi. È anche una tecnologia abilitante per il paradigma CI/CD (Continuous Integration/Continuous Delivery).

Protagonista delle innovazioni degli ultimi anni, Docker è diventato ormai un ecosistema maturo, ricco e vasto. Anche i non esperti di queste tematiche potranno approcciarsi con facilità a Docker e iniziare a sfruttarne le potenzialità a partire dall’enorme archivio di immagini disponibili.

Docker e cloud

Docker è una delle tecnologie centrali nella crescita del Cloud Computing, importante paradigma di erogazione di risorse e servizi informatici on-demand in cui l’utente paga in funzione dell’uso. Questo modello permette all’utente di abbattere i costi fissi per il mantenimento e l’aggiornamento dell’infrastruttura IT nonché il rilascio più rapido delle applicazioni, rende inoltre possibile scalare agevolmente queste ultime in base alle necessità effettive.

A seguire i principali motivi per cui Docker ha un ruolo di primo piano nel cloud computing.

  • Leggerezza: i container hanno dimensioni ridotte e si avviano velocemente, pertanto sono particolarmente adatti ad applicazioni che scalano orizzontalmente;
  • Portabilità: le immagini sono portabili e indipendenti dal sistema operativo ospite, di conseguenza i container possono girare indifferentemente su laptop, infrastruttura on-premise o ambiente cloud e sono adatti anche a contesti ibridi;
  • Efficienza: i container sfruttano in modo efficiente le risorse computazionali, inoltre Docker incoraggia lo sviluppo di software a microservizi permettendo di gestire lo scaling in modo più preciso e proporzionato alle reali esigenze.

Ad oggi, tutti i principali cloud provider, tra cui Aruba, sono compatibili con l’ecosistema Docker e offrono, in alcuni casi, soluzioni CaaS (Containers-as-a-Service). Generalmente, i cloud provider mettono a disposizione anche sistemi di orchestrazione, come Docker Swarm o Kubernetes, che automatizzano i processi di deploy, controllo e scalabilità dei container e diventano sempre più rilevanti all’aumentare del numero di container istanziati.

I prossimi passi

In questo ciclo di tutorial realizzeremo una panoramica delle principali funzionalità dell’ecosistema Docker. I tutorial avranno un taglio pratico per consentire al lettore di acquisire familiarità con questa tecnologia attraverso l’esperienza e la sperimentazione.

Inizialmente forniremo una guida all’installazione di Docker sulle principali piattaforme: Windows, Ubuntu Linux e macOS per poi approdare subito dopo all’utilizzo di Docker mediante risorse in Cloud.

Approfondiremo quindi i concetti di immagine e container imparando a crearli e controllarli. Ci occuperemo poi della gestione dei dati e della rete in Docker.

Introdurremo anche buone pratiche e tecniche avanzate per lo sviluppo e il rilascio di applicazioni nell’ambito di pertinenza. Infine esploreremo applicazioni composte da più container comunicanti apprendendo le basi dell’orchestrazione.

Tutorial successivo: