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. |
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:
- Come installare Docker su Raspbian di Raspberry Pi
- Come installare e configurare Caddy con Docker su Raspbian di Raspberry Pi
- Come installare e configurare Home Assistant (HASSIO) con Docker su un Raspberry Pi già operativo
- Come installare e configurare Home Assistant Core con Docker su un Raspberry Pi già operativo
- Come installare e configurare il broker MQTT “Mosquitto” su Docker (su Raspbian)
- Come installare e configurare OpenZWave con Docker su Raspbian di Raspberry Pi
- Come installare e configurare ZigBee2MQTT con Docker su Raspbian di Raspberry Pi
- Docker Compose: cos’è, a cosa serve e perché si usa
- Gestire un UPS con Raspberry Pi tramite “Network UPS Tools” (NUT) con Docker su Raspbian
- Home Assistant (HASSIO) o Home Assistant CORE: quale installazione fa al caso mio?
- Home Assistant su Raspberry Pi: le varie installazioni, le cose da fare
- HUB: IoT “WebThings” (Gateway)
- Realizzare un NVR (Network Video Recorder) per videosorveglianza con motionEye (parte 1)
- Recensione: QNAP TS-251D
