Cos’è Docker e come funziona questo preziosissimo tool

Docker

Docker è una piattaforma di containerizzazione open-source che consente di costruire, distribuire e avviare applicazioni in ambienti isolati chiamati container. Dal suo rilascio iniziale nel 2013, Docker è diventato uno strumento fondamentale per sysadmin, ingegneri DevOps e sviluppatori che necessitano di deployment consistenti e riproducibili su qualsiasi infrastruttura – locale, on-premises o in cloud.

In questo articolo trattiamo le principali funzionalità di Docker, come funziona, i concetti chiave da comprendere e le differenze tra container e macchine virtuali.

A cosa serve Docker?

Docker risolve un problema infrastrutturale comune: un’applicazione che funziona in un ambiente ma fallisce in un altro a causa di differenze nelle versioni del sistema operativo, nelle librerie o nella configurazione. Impacchettando l’applicazione insieme a tutte le sue dipendenze in un container, Docker garantisce che funzioni allo stesso modo ovunque.

In pratica, Docker consente di:

  • Standardizzare gli ambienti tra sviluppo, testing, staging e produzione, eliminando i problemi del tipo “funziona sulla mia macchina”.
  • Distribuire più velocemente e in modo più affidabile, poiché i container si avviano in pochi secondi e includono tutto ciò che serve all’applicazione per funzionare.
  • Semplificare i rollback, perché ogni versione dell’applicazione è un’immagine immutabile che può essere ridistribuita in qualsiasi momento.
  • Ottimizzare l’utilizzo delle risorse, poiché i container condividono il kernel del sistema operativo host e consumano molto meno overhead rispetto alle macchine virtuali.

Struttura di Docker: come funziona Docker?

La struttura di Docker è basata su un’architettura client-server. I componenti principali sono:

  • Docker Engine: il runtime principale che costruisce e avvia i container. Include il daemon Docker (dockerd), che gestisce immagini, container, reti e volumi sull’host.
  • Docker CLI: l’interfaccia a riga di comando (docker) utilizzata per interagire con il daemon. Comandi come docker build, docker run e docker pull vengono impartiti tramite la CLI.
  • Docker Images: template di sola lettura che contengono il codice dell’applicazione, il runtime, le librerie e le dipendenze. Le immagini vengono costruite da un Dockerfile, un file di testo con istruzioni passo dopo passo.
  • Docker Containers: istanze in esecuzione di un’immagine. Ogni container è isolato dagli altri e dall’host, ma condivide il kernel del sistema operativo host. Questo è ciò che rende i container leggeri e veloci rispetto alle macchine virtuali.
  • Docker Registries: servizi che archiviano e distribuiscono le immagini. Il più utilizzato è Docker Hub, ma è possibile usare anche Amazon ECR, GitHub Container Registry o Google Artifact Registry. Per maggiori dettagli, leggi la nostra guida su come funziona un Docker repository.

Ecco un esempio minimale di Dockerfile:

FROM nginx:alpine

COPY ./site /usr/share/nginx/html

EXPOSE 80

Questo Dockerfile parte dall’immagine ufficiale Nginx Alpine, copia i file del tuo sito web nel container e espone la porta 80. Puoi costruirlo e avviarlo con:

$ docker build -t my-site:1.0 .
$ docker run -d -p 8080:80 my-site:1.0

Il tuo sito è ora in esecuzione in un container, accessibile all’indirizzo http://localhost:8080.

Gestione di applicazioni multi-container

La maggior parte delle applicazioni reali è composta da più di un servizio – un web server, un database, un livello di cache. Esistono due strumenti principali per gestire configurazioni multi-container, ciascuno progettato per una scala diversa: 

  • Docker Compose: definisce e avvia applicazioni multi-container su un singolo host utilizzando un file di configurazione YAML. Ideale per sviluppo, testing e deployment di produzione su piccola scala.
  • Kubernetes: una piattaforma di orchestrazione di container completa che gestisce i container su larga scala su più host. Lo standard del settore per workload di produzione che richiedono alta disponibilità, auto-scaling e rolling update.

Container Docker vs macchine virtuali: qual è la differenza?

Questa è una delle domande più comuni per chiunque si avvicini alla containerizzazione per la prima volta. Entrambe le tecnologie forniscono isolamento, ma lo raggiungono in modi fondamentalmente diversi.

Una macchina virtuale (VM) esegue un sistema operativo guest completo sopra un hypervisor, che virtualizza l’hardware sottostante. Ogni VM include il proprio kernel, le librerie di sistema e i binari. Questo fornisce un forte isolamento ma ha un costo: le VM sono pesanti (tipicamente gigabyte), lente da avviare (minuti) e consumano una quantità significativa di CPU e RAM.

Un container Docker condivide il kernel del sistema operativo host e utilizza funzionalità a livello di sistema operativo (namespace e cgroup) per isolare processi, filesystem e interfacce di rete. I container non includono un sistema operativo completo – solo l’applicazione e le sue dipendenze. Questo li rende leggeri (spesso megabyte), veloci da avviare (secondi) ed efficienti nell’uso delle risorse.

Diagramma che confronta l'architettura delle macchine virtuali con l'architettura dei container Docker

In molti ambienti di produzione, i container Docker vengono eseguiti all’interno di macchine virtuali – la VM fornisce l’isolamento a livello hardware e il container fornisce l’isolamento a livello applicativo. Le due tecnologie sono complementari, non mutuamente esclusive.

Iniziare con Docker

Se vuoi approfondire, esplora gli altri articoli di questa serie:

Se gestisci ambienti containerizzati in produzione, ricorda che una solida strategia di backup è importante tanto quanto il deployment stesso. Uranium Backup supporta il backup di macchine virtuali, database e dei dati che alimentano le tue applicazioni containerizzate.

Cos’è Docker in parole semplici?

Docker è una piattaforma che permette di impacchettare un’applicazione e tutte le sue dipendenze in un’unità standardizzata chiamata container. I container funzionano allo stesso modo su qualsiasi macchina, eliminando i problemi legati alle differenze tra ambiente di sviluppo e produzione.

Docker è gratuito?

Docker Engine è open-source e gratuito. Docker Desktop è gratuito per uso personale e per piccole aziende (meno di 250 dipendenti e meno di 10 milioni di dollari di fatturato annuo); le organizzazioni più grandi necessitano di un abbonamento a pagamento.

Qual è la differenza tra un container Docker e un’immagine Docker?

Un’immagine è un modello di sola lettura che contiene il codice dell’applicazione, il runtime, le librerie e la configurazione. Un container è un’istanza in esecuzione di quell’immagine. È possibile eseguire più container dalla stessa immagine, ciascuno isolato dagli altri.

Qual è la differenza tra Docker e una macchina virtuale?

Una macchina virtuale esegue un sistema operativo guest completo su un hypervisor e virtualizza l’hardware sottostante. Un container Docker condivide il kernel del sistema operativo host e include solo l’applicazione e le sue dipendenze. Questo rende i container più leggeri, più rapidi da avviare e più efficienti nell’uso delle risorse. Le due tecnologie vengono spesso utilizzate insieme in ambienti di produzione.

Cos’è un Dockerfile?

Un Dockerfile è un file di testo che contiene un insieme di istruzioni per creare un’immagine Docker. Ogni istruzione definisce un layer – ad esempio, da quale immagine base partire, quali file copiare e quali porte esporre.

Quando è meglio usare Docker Compose invece di Kubernetes?

Docker Compose è progettato per applicazioni multi-container su un singolo host – ideale per sviluppo, test e piccoli deployment. Kubernetes è una piattaforma di orchestrazione completa per gestire container su larga scala attraverso più host, con funzionalità come l’auto-scaling e gli aggiornamenti rolling. Per ambienti di piccola scala, Compose è più semplice; per carichi di lavoro in produzione che richiedono alta disponibilità, Kubernetes è lo standard.

Read related articles