Cos’è il Docker Compose e come usarlo

Cos’è il Docker Compose e come usarlo

Per rendere più ordinata la gestione di applicazioni composte da più servizi è nato Docker Compose. Invece di configurare singolarmente container, reti, porte e volumi, consente di descrivere l’intero ambiente in un unico file YAML, trasformando l’infrastruttura in una configurazione leggibile e riutilizzabile. Questo approccio semplifica lo sviluppo, riduce gli errori manuali e rende più rapido l’avvio di stack complessi, come applicazioni web collegate a database, cache o servizi esterni.

Cos’è Docker Compose

Docker Compose è uno strumento dell’ecosistema Docker progettato per organizzare applicazioni formate da più container, riunendo configurazione, avvio e gestione dei servizi in un unico punto di controllo. In un progetto reale, infatti, raramente un’applicazione vive dentro un solo container: spesso esistono un servizio web, un database, una cache, code di messaggi, API interne o altri componenti che devono comunicare tra loro in modo coordinato.

Lo strumento risponde a questa esigenza attraverso un file di configurazione in formato YAML, nel quale vengono descritti i servizi necessari all’applicazione, le immagini da utilizzare, le porte da esporre, le variabili d’ambiente, i volumi persistenti e le reti interne. In questo modo, l’ambiente applicativo diventa una sorta di mappa tecnica riproducibile, utile sia in fase di sviluppo sia nei test.

Il vantaggio principale è la possibilità di sostituire una lunga sequenza di comandi manuali con una configurazione dichiarativa. Una volta definito il file, l’intero stack può essere avviato, arrestato o ricreato con pochi comandi.

Come funziona Docker Compose

Docker Compose funziona come un livello di coordinamento sopra Docker: interpreta un file di configurazione e trasforma le istruzioni dichiarate in container, reti e volumi pronti all’uso. Il punto di partenza è il file YAML, di solito chiamato compose.yaml o docker-compose.yml, nel quale ogni servizio dell’applicazione viene descritto con le proprie regole operative.

All’interno del file, la sezione dedicata ai servizi definisce quali container devono essere creati e con quali impostazioni. Un servizio può usare un’immagine già disponibile in un registry, come Redis o MySQL, oppure essere costruito da un Dockerfile presente nel progetto. A queste indicazioni possono aggiungersi porte, variabili d’ambiente, dipendenze, comandi personalizzati e montaggi di directory locali.

Quando viene eseguito il comando docker compose up, Compose legge la configurazione, prepara le immagini necessarie, crea una rete interna dedicata e avvia i container secondo le relazioni definite. I servizi possono comunicare usando il rispettivo nome, senza configurazioni manuali di indirizzi IP.

I volumi completano il funzionamento permettendo di conservare dati anche dopo la rimozione dei container.

Cos’è il Docker Compose e come usarlo

Esempio di file YAML per Docker Compose

Un file YAML di Docker Compose rappresenta il documento operativo che descrive la composizione dell’applicazione. Al suo interno vengono indicati i servizi da avviare, le immagini da utilizzare, le porte da collegare, i volumi da mantenere e le eventuali dipendenze tra i container. La logica è dichiarativa: non viene spiegato passo dopo passo come creare l’ambiente, ma viene definito quale risultato deve essere ottenuto.

Un caso tipico può riguardare un’applicazione web collegata a un servizio Redis. Il servizio principale può essere costruito a partire dal codice sorgente presente nella directory del progetto, mentre Redis può essere avviato usando un’immagine ufficiale già pronta. Le porte consentono di rendere l’applicazione raggiungibile dall’esterno, mentre i volumi permettono di sincronizzare file locali o conservare dati generati dal servizio.

La sezione environment consente di passare parametri di configurazione ai container, evitando di inserire valori direttamente nel codice dell’applicazione. La direttiva depends_on, invece, definisce l’ordine di avvio tra i servizi, utile quando un componente deve essere disponibile prima di un altro.

Questo tipo di file rende lo stack applicativo più leggibile, versionabile e facile da condividere. Inserito nel repository del progetto, diventa una base comune per replicare lo stesso ambiente su macchine diverse.

Come installare Docker Compose

L’installazione di Docker Compose dipende dal sistema operativo e dal modo in cui Docker è stato configurato. Nei contesti più semplici, come l’utilizzo di Docker Desktop su Windows, macOS o Linux, Compose è già incluso e pronto all’uso. In questo caso non serve installare componenti aggiuntivi: è sufficiente verificare la disponibilità dello strumento dal terminale con il comando docker compose version.

Negli ambienti server, soprattutto su distribuzioni Linux, Docker Compose viene in genere installato come plugin della Docker CLI. Prima di procedere è necessario che Docker Engine sia già presente e funzionante, perché Compose non sostituisce Docker, ma ne estende le capacità operative. Su sistemi basati su Debian o Ubuntu, l’installazione può avvenire tramite il gestore di pacchetti con il comando sudo apt install docker-compose-plugin, dopo aver aggiornato l’indice dei pacchetti.

Su distribuzioni diverse, il principio resta lo stesso: il plugin viene installato attraverso il package manager previsto dal sistema, come dnf negli ambienti basati su RHEL. Su macOS, in assenza di Docker Desktop, è possibile usare Homebrew.

Una volta completata l’installazione, la verifica della versione conferma che Compose è correttamente integrato nella riga di comando. Da quel momento, i comandi docker compose possono gestire file YAML e stack multi-container.

Come usare Docker Compose

Usare Docker Compose significa trasformare la configurazione di un ambiente applicativo in un processo controllato e ripetibile. Il flusso operativo parte dalla creazione di un file compose.yaml o docker-compose.yml, nel quale vengono definiti i servizi dello stack: applicazione principale, database, cache, code, strumenti di supporto o altri componenti necessari al funzionamento del progetto.

Dopo aver descritto immagini, porte, volumi, reti e variabili d’ambiente, l’intero ambiente può essere avviato con il comando docker compose up. Compose legge il file, prepara le risorse richieste e crea i container seguendo la configurazione indicata. Se un servizio deve essere costruito da un Dockerfile, può occuparsi anche della build dell’immagine prima dell’avvio.

Durante lo sviluppo, è possibile eseguire lo stack in primo piano per osservare i log direttamente nel terminale, oppure in background usando l’opzione -d. Questa modalità consente di mantenere i container attivi senza bloccare la sessione di lavoro.

Quando l’ambiente non serve più, docker compose down arresta e rimuove i container collegati al progetto. I dati salvati nei volumi possono restare disponibili, così da evitare perdite accidentali. Per configurazioni non standard, il flag -f permette di indicare un file YAML diverso da quello predefinito.

Comandi principali di Docker Compose

Docker Compose mette a disposizione una serie di comandi pensati per controllare l’intero ciclo di vita di un’applicazione multi-container. Il comando più utilizzato è docker compose up, che avvia i servizi definiti nel file YAML, creando container, rete e risorse necessarie. Con l’opzione -d, l’esecuzione avviene in background, lasciando libero il terminale.

Per arrestare e rimuovere lo stack si usa docker compose down. Questo comando elimina i container e la rete creata per il progetto, ma mantiene i volumi, salvo diversa indicazione. Per cancellare anche i dati persistenti, è possibile aggiungere l’opzione –volumes, da usare con attenzione negli ambienti in cui sono presenti database o file importanti.

Il comando docker compose ps mostra lo stato dei container gestiti dal progetto, mentre docker compose logs consente di leggere i log dei servizi. Con logs -f, l’output viene seguito in tempo reale, utile durante debug e monitoraggio.

Altri comandi completano la gestione quotidiana: start riavvia container già creati, stop li arresta senza rimuoverli, restart li riavvia, build ricostruisce le immagini definite tramite Dockerfile, pull scarica immagini aggiornate dai registry e push pubblica immagini verso repository remoti.

Differenza tra Docker e Docker Compose

Docker e Docker Compose appartengono allo stesso ecosistema, ma rispondono a esigenze diverse. Docker fornisce gli strumenti di base per creare immagini, avviare container, gestire reti, volumi e registry. È il motore operativo che permette di eseguire applicazioni isolate in ambienti leggeri e portabili.

Docker Compose, invece, interviene quando un’applicazione non è composta da un solo container, ma da più servizi che devono lavorare insieme. Invece di avviare manualmente ogni componente con comandi separati, Compose permette di descrivere l’intero stack in un file YAML e di gestirlo con istruzioni centralizzate.

La differenza principale riguarda quindi il livello di gestione. Con la Docker CLI, ogni container viene configurato attraverso comandi specifici e opzioni inserite nel terminale. Con Docker Compose, la configurazione diventa dichiarativa, più ordinata e facilmente condivisibile all’interno di un progetto.

Questo rende Docker adatto anche a scenari semplici o operazioni puntuali, mentre Docker Compose risulta più efficace quando esistono dipendenze tra servizi, come applicazione web, database e cache.

Quando usare Docker Compose e quali alternative considerare

Docker Compose è particolarmente utile quando un progetto richiede più servizi coordinati, ma non necessita ancora di un’infrastruttura di orchestrazione complessa. È una soluzione efficace per ambienti di sviluppo, test, staging e piccoli deployment, perché consente di descrivere l’intero stack in modo chiaro e replicabile. Applicazioni web con database, cache, code di messaggi o servizi interni possono essere avviate con una configurazione unica, riducendo passaggi manuali e differenze tra macchine diverse.

Il suo punto di forza è la semplicità operativa: un file YAML diventa il centro dell’ambiente applicativo, rendendo più immediata la collaborazione tra sviluppatori, sistemisti e team DevOps. Tuttavia, quando aumentano traffico, numero di nodi, esigenze di autoscaling, bilanciamento avanzato, alta disponibilità e aggiornamenti progressivi, Docker Compose può diventare limitante.

In questi casi possono essere considerate alcune alternative:

  • Kubernetes: indicato per infrastrutture distribuite, gestione di cluster complessi, scalabilità automatica, bilanciamento dei carichi e aggiornamenti progressivi. È una scelta adatta quando l’applicazione deve garantire alta disponibilità e resilienza su più nodi;
  • Docker Swarm: rappresenta un’alternativa più semplice rispetto a Kubernetes per orchestrare container su un cluster Docker. Può essere utile in contesti in cui serve distribuire servizi su più macchine senza introdurre una piattaforma particolarmente complessa.