Gestire applicazioni Docker tramite Docker Compose

4 minuti di lettura
Premessa importante: questa scheda formativa non ha l’ambizione (né lo scopo) di approfondire in dettaglio tutti gli aspetti tecnico/funzionali legati a questo potente tool di gestione. Lo scopo, semmai, è quello di fornire alcuni elementi operativi utili all’utente per operare, in modo elementare ma efficace, tramite tale strumento.

docker compose logo

Abbiamo precedentemente spiegato in modo semplice a cosa serva e perché sia utile il tool Docker Compose in un ambiente dove siano presenti applicazioni basate sull’ambiente di virtualizzazione Docker. Qui su inDomus l’elenco è ampio: tante le applicazioni distribuite e istanziate in questo modo; al di là della domotica personale, comunque, gli ambiti di applicazione sono tantissimi.

In questa scheda vediamo assieme come si utilizza, a grandi linee, questo strumento.

QUESTIONE DI CONTAINER

Solitamente le pagine Internet dedicate alle più disparate applicazioni distribuite in modalità container Docker forniscono tutte le informazioni utili a “modellare” il comando Docker per l’istanziamento dell’applicazione. Prendiamo il caso dell’HUB per domotica personale Home Assistant: la pagina su come installarlo su Docker descrive – per i vari ambiti in cui è in esecuzione Docker (Linux, Windows, macOS eccetera) – come definire tale comando.

Un comando “tipo” per istanziare Home Assistant Core per esempio su Docker su Raspberry Pi (vedi nostra guida) appare più o meno come segue:

sudo docker run --init -d --name="home-assistant" -e "TZ=Europe/Rome" -v /home/homeassistant/.homeassistant:/config --net=host --restart unless-stopped raspberrypi4-homeassistant:stable

nel quale viene indicato:

–name per indicare il nome del container
-e per passare in input alcune variabili d’ambiente
-v per montare come volumi le nostre directory/file locali
–net per indicare il tipo di rete
–restart per indicare il comportamento di riavvio del container

infine, il nome dell’immagine container da utilizzare, in questo caso raspberrypi4-homeassistant:stable.
Lanciando il domando, l’immagine verrebbe scaricata e immediatamente istanziata sulla base dei parametri specificati.

PASSARE A DOCKER COMPOSE

Come spiegato nella scheda dedicata a cos’è e a cosa serve Docker Compose, questo tool permette di evitare di utilizzare un comando strutturato come quello sopra spiegato (o più d’uno), cosa utile per diversi motivi che non staremo a ripetere.

Va da sé che, volendo istanziare una nuova app Docker, più che del comando ci interessi il codice YAML corrispondente da aggiungere alla configurazione di Docker Compose. Tale codice recepisce le caratteristiche del comando di lancio manuale.

Dopo aver facilmente installato Docker Compose sullo stesso host ospitante Docker, la prima cosa da fare è definire dunque un file docker-compose.yaml.

Successivamente all’installazione del tool va creata una directory qualunque nel quale ospitare tale file (l’esempio che segue è dedicato al mondo Raspbian/Raspberry Pi o genericamente Linux, ma su ambienti Windows o altro è possibile fare la stessa cosa semplicemente creando una cartella dentro la quale poi creare il file):

mkdir -p /home/pi/esempio-compose
nano /home/pi/esempio-compose/docker-compose.yaml

copiamo dunque nell’editor che si aprirà il seguente codice:

version: '3'
services:
  home-assistant:
    container_name: home-assistant
    image: homeassistant/raspberrypi4-homeassistant:stable
    volumes:
    - /home/homeassistant/.homeassistant:/config
    environment:
    - TZ=Europe/Rome
    network_mode: host
    restart: unless-stopped

Al termine, uscire salvando (CTRL+X, Y, invio).
Ciò che abbiamo creato è il corrispettivo YAML per Docker Compose del comando di lancio Docker di cui sopra.

Commentiamo il tutto.

In primis specifichiamo la versione del compose file che andremo a scrivere (version). Noi utilizzeremo la versione 3; maggiori informazioni utili alla scelta della versione da utilizzare possono essere trovate qui.

Subito sotto definiamo il blocco “services” nel quale andranno elencati appunto tutti i servizi che andranno utilizzati in questo stack (nel nostro caso – per il momento – solo Home Assistant). Nell’esempio abbiamo quindi indicato il nome del servizio “home-assistant“.

Successivamente definiamo il nome da assegnare al container e l’immagine da utilizzare tramite “image“; con “-volumes” e “environment” vengono definiti i volumi e variabili d’ambiente. “network_mode” ci permette invece di indicare il tipo di network così come fatto nel comando con “–net“. Infine, con “restart” viene indicata a docker la modalità di riavvio, nel comando indicata con “–restart


Ora ipotizziamo di dover istanziare, sullo stesso Raspberry, anche il servizio “Caddy” (vedi nostra guida).
In questo caso il solito comando manuale di avvio del container sarebbe più o meno così:

sudo docker run --init -d --name="caddy" -e "TZ=Europe/Rome" -v /home/pi/caddy/Caddyfile:/etc/caddy/Caddyfile -v /home/pi/caddy/data:/data --restart unless-stopped -p 443:443 caddy:latest

modificando quindi il file docker-compose.yaml precedentemente creato, come segue:

version: '3'
services:
  home-assistant:
    container_name: home-assistant
    image: homeassistant/raspberrypi4-homeassistant:stable
    volumes:
    - /home/homeassistant/.homeassistant:/config
    environment:
    - TZ=Europe/Rome
    network_mode: host
    restart: unless-stopped<
  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
    - "443:443"
    environment:
    - "TZ=Europe/Rome"
    volumes:
    - "/home/pi/caddy/Caddyfile:/etc/caddy/Caddyfile"
    - "/home/pi/caddy/data:/data"
    restart: unless-stopped 

Sulla falsariga di quanto già fatto per Home Assistant abbiamo aggiunto un nuovo servizio (“caddy“): oltre ai parametri già visti anche nell’esempio precedente, abbiamo aggiunto anche “ports“, il quale che ci permette di indicare quali porte del container esporre e come esporle.

AVVIARE LO STACK

A questo punto, invece di eseguire i comandi manuali che istanzierebbero i due container, è sufficiente eseguire lo stack del quale abbiamo informato Docker Compose tramite il file YAML.

Per eseguirlo, il comando da ricordare è uno e piuttosto semplice. Eseguendolo dall’interno della stessa cartella nel quale è presente il file docker-compose.yaml (il che lascia intuire che, volendo, si potrebbero definire più stack autonomi e indipendenti), il comando è:

docker-compose up -d

L’opzione “up” permetterà di creare l’immagine e tirare su il servizio, mentre “-d” indicherà di far partire il tutto in background (detached).

Finito!
Docker Compose provvederà a far tutto da sé in base a quanto indicato nel file di configurazione YAML.

GESTIONE ORDINARIA

Ovviamente è anche possibile effettuare stop/start/restart dei singoli container. Per esempio:

docker-compose stop nome_servizio
docker-compose start nome_servizio
docker-compose restart nome_servizio

Volendo fermare tutto lo stack (con relativa rimozione dei container), è possibile utilizzare il seguente comando:

docker-compose down

Nel caso in cui si voglia aggiornare un container in esecuzione scaricando l’ultima immagine disponibile, sarà necessario digitare i seguenti comandi:

docker-compose pull nome_servizio
docker-compose up -d nome_servizio

Infine, per rimuovere eventuali immagini datate e non più utilizzate per alcun container, il comando è:

docker image prune -f

Va da sé che questo tipo di gestione semplifichi enormemente la gestione dei container Docker: anche solo banalmente il solo aggiornamento di un container a fronte della disponibilità di una nuova immagine è estremamente semplificato, perché non è necessario ricordare l’intero comando Docker per l’esecuzione del container, ma è bensì sufficiente utilizzare i comandi (ben più astratti e semplici) sopra elencati.


Altre pagine con attinenza al tema Docker:

   
Telegram News Channel