Lo sviluppo di applicazioni con l’utilizzo di Docker può diventare difficile quando si creano più container per erogare più servizi. Impariamo Docker Compose, lo strumento che ci aiuterà a eseguire ambienti applicativi multi-container.
In questo tutorial impareremo tutto su Docker Compose, i vantaggi dell’utilizzo di questo strumento, i suoi casi d’uso e le sue funzionalità.
Cos’è Docker Compose?
Un’applicazione può essere costituita da più contenitori che eseguono servizi diversi. Può essere complicato avviare e gestire i contenitori manualmente, quindi Docker ha creato uno strumento utile che aiuta ad accelerare il processo: Docker Compose.
Docker Compose è un software utilizzato per definire ed eseguire applicazioni Docker multi-container. Può gestire più container contemporaneamente nell’ambiente di produzione, staging, sviluppo, test e CI [Continuous Integration]. Pertanto, utilizzare Docker Compose per gestire l’intero ciclo di vita dello sviluppo del software [SDLC, software development life cycle].
Docker Compose funziona applicando le regole definite in un file docker-compose.yaml
. Il file YAML configura i servizi dell’applicazione e include regole che specificano come si desidera che vengano eseguiti. Con questo file, puoi avviare, interrompere o ricostruire tutti i servizi utilizzando un unico comando. Inoltre, puoi controllare lo stato di un servizio, visualizzare gli output del registro ed eseguire comandi una tantum.
Docker Compose viene fornito in due “gusti”:
- standalone: occorre installare un nuovo programma che è
docker-compose
, per questo di veda [2]. - full package: se si è installato docker, sarà anche disponibile l’opzione compose per cui si usa il comando
docker compose
senza dover installare altro.
Casi d’uso di Docker Compose
I casi in cui risulta utile usare Docker Compose sono i seguenti:
- Ambienti di test automatizzati. Compose supporta il test automatizzato, che è una parte essenziale di CI/CD in quanto può creare e distruggere facilmente l’ambiente di test richiesto. Gli sviluppatori possono definire e configurare l’ambiente necessario per l’esecuzione di test end-to-end automatizzati utilizzando il file Docker Compose appropriato.
- Installazioni su singolo host. In Docker Compose, i container sono progettati per essere eseguiti su un singolo host poiché sono stati tradizionalmente focalizzati sullo sviluppo e sui flussi di lavoro di test.
- Ambienti di sviluppo. Compose è un modo semplice e veloce per avviare progetti in quanto può creare rapidamente nuovi ambienti di sviluppo isolati. Il software documenta e configura tutte le dipendenze del servizio dell’applicazione (inclusi database, cache, API del servizio Web, ecc.). Consente di creare e avviare uno o più contenitori per ciascuna dipendenza utilizzando un unico comando.
I vantaggi di Docker Compose
Ecco alcuni dei principali vantaggi dell’utilizzo di Docker Compose:
- Configurazione semplice e veloce. Grazie agli script YAML e alle variabili di ambiente, puoi configurare o modificare facilmente i servizi applicativi.
- Comunicazione interna sicura. Compose crea una rete per tutti i servizi da condividere. Ciò aggiunge un ulteriore livello di sicurezza per l’app poiché non è possibile accedere ai servizi dall’esterno.
- Portabilità e supporto CI/CD. Poiché tutti i servizi sono definiti all’interno del file docker-compose, gli sviluppatori possono facilmente accedere e condividere l’intera configurazione. Estraendo il file YAML e il codice sorgente, possono avviare l’ambiente in pochi minuti. Ciò contribuisce a creare e abilitare una pipeline CI/CD efficiente.
- Uso efficiente delle risorse. Docker Compose consente di ospitare più ambienti isolati su un solo host. L’esecuzione di tutto su un singolo componente hardware ti consente di risparmiare molte risorse. Le sue caratteristiche che gli consentono di memorizzare una configurazione nella cache e di riutilizzare i contenitori esistenti, contribuiscono all’uso efficiente delle risorse.
Caratteristiche di Docker Compose
Esistono diverse importanti funzionalità di Docker Compose che offrono i vantaggi sopra menzionati.
Hosting di più ambienti isolati su un singolo host
Per impostazione predefinita, il nome del progetto è il nome di base della directory del progetto, mentre la directory del progetto è la directory di base del file docker-compose.yml
. È possibile modificare i valori predefiniti:
- Impostando il nome del progetto utilizzando l’opzione della riga di comando
-p
o la variabile di ambienteCOMPOSE_PROJECT_NAME
. - Impostando la directory del progetto usando
la variabile di ambienteil parametro--project-directory
da linea di comando.
È possibile utilizzare questa funzionalità su un host di sviluppo per eseguire copie stabili di ciascun ramo di funzionalità del progetto creando più copie dell’ambiente con nomi diversi.
Supporto delle variabili di ambiente
È possibile personalizzare i contenitori per ambienti o utenti diversi aggiungendo variabili di ambiente nel file docker-compose
. Ciò offre maggiore flessibilità durante la configurazione dei contenitori con Compose, poiché i valori delle variabili non sono codificati nella configurazione.
I valori delle variabili possono essere impostati nell’ambiente della shell (da cui si esegue docker-compose) o in un file .env
(memorizzato nella directory del progetto). Per impostazione predefinita, Docker Compose applica i valori specificati nel file .env
. Tuttavia, i valori impostati nell’ambiente shell hanno la precedenza su quelli del file .env
.
Ad esempio posso definire così il nome del progetto, in base a quanto visto poco fa: nella directory del progetto (quella in cui c’è il file docker-compose-yml) creo un file .env che contiene la linea:
COMPOSE_PROJECT_NAME
=My Beautiful Project
Compose cerca il file automaticamente nella directory del progetto, oppure nelle variabili di ambiente impostati da shell.
Attenzione! I valori impostati nell’ambiente shell hanno la precedenza su quelli impostati nel file .env.
Se lancio la composizione del progetto, tra i log leggo:
$ sudo docker compose up [+] Running 2/2 ⠿ Container mybeautifulproject-postgres_db-1 Recreated 0.2s ⠿ Container mybeautifulproject-app-1 Created .....
Conservazione dei dati sul volume
Un’altra grande caratteristica di Docker Compose è che salva i dati utilizzati dai servizi. Pertanto, non devi preoccuparti di perdere i dati creati nei contenitori. Se sono presenti contenitori di esecuzioni precedenti, Compose li troverà e copierà i relativi volumi nella nuova esecuzione.
Riutilizzo dei contenitori esistenti
Compose ricrea solo i contenitori che sono stati modificati dall’ultima esecuzione. Se non ci sono modifiche, riutilizza il contenitore esistente.
Questa funzione si basa sulla capacità del software di memorizzare nella cache le configurazioni dei container, consentendoti di configurare i tuoi servizi più velocemente.
I comandi di base di Docker Compose
L’uso di Compose è fondamentalmente un processo in tre fasi:
- Definire l’ambiente della app con un Dockerfile in modo che possa essere riprodotto ovunque.
- Definire i servizi che compongono la app nel file
docker-compose.yml
in modo che possano essere eseguiti insieme in un ambiente isolato. - Esegui
docker compose up
(docker <spazio> compose) e il comando Docker Compose si avvia ed esegue l’intera app.
In alternativa, puoi eseguiredocker-compose up
(docker <trattino> compose) utilizzando Composer standalone (docker-compose
eseguibile binario, attenzione al trattino!).
Un esenpio di file docker-compose.yml è il seguente:
version: "3.9" # optional since v1.27.0 services: web: build: . ports: - "8000:5000" volumes: - .:/code - logvolume01:/var/log depends_on: - redis redis: image: redis volumes: logvolume01: {}
Per ulteriori informazioni sulla sintassi del file docker-compose.yml
, vedere il Compose file reference.
Compose dispone di comandi per la gestione dell’intero ciclo di vita della tua applicazione:
- Avvio, arresto e ricostruzione dei servizi
- Visualizzazione dello stato dei servizi in esecuzione
- Logging dell’output del registro dei servizi in esecuzione
- Esecuzione di comandi una tantum su un servizio
Una breve sintassi di base per eseguire i comandi Docker Compose è compendiata nel seguente elenco:
Comando | Descrizione |
docker compose help | mostra la guida, le istruzioni per l’uso e gli argomenti per il comando docker-compose |
docker compose build | cerca tutti i servizi che contengono l’istruzione build: nel file docker-compose.yml ed esegui un docker build per ognuno |
docker compose run | esegue un comando una tantum su un servizio |
docker compose up | compila, (ri)crea, avvia e collega ai contenitori per un servizio |
docker compose -f [comando] | specifica la posizione di un file di configurazione docker-compose aggiungendo il flag -f |
docker compose start | avvia un contenitore esistente perché svolga un serivizio |
docker compose stop | arresta i contenitori (senza rimuoverli) |
docker compose pause | metti in pausa un servizio erogato da un contenitore |
docker compose unpause | riavvia dalla pausa un servizio erogato da un contenitore |
docker compose down | arresta i contenitori (e rimuovi contenitori, reti, volumi e immagini) |
docker compose ps | elenca i contenitori all’interno del file di configurazione di docker-compose |
docker compose images | elenca le immagini su cui sono basati i contenitori |
docker compose ls | elenca i progetti Compose in esecuzione |
Altri articoli betaingegneria che parlano di Docker
- Docker application container
- Docker: terminologia di base
- Compilare una immagine Docker
- Montare un volume Docker
Commenti recenti