community italiana di domotica personale
 
Gestire applicazioni Docker tramite Docker Compose

Gestire applicazioni Docker tramite Docker Compose

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 always home-assistant: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 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 Raspberry Pi OS/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 ~/esempio-compose
nano ~/esempio-compose/docker-compose.yaml

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

services:
  home-assistant:
    container_name: home-assistant
    image: ghcr.io/home-assistant/home-assistant:stable
    volumes:
    - ~/homeassistant/.homeassistant:/config
    environment:
    - TZ=Europe/Rome
    network_mode: host
    restart: always

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 nostre guide).
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 ~/caddy/Caddyfile:/etc/caddy/Caddyfile -v ~/caddy/data:/data --restart always -p 443:443 caddy:latest

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

services:
  home-assistant:
    container_name: home-assistant
    image: homeassistant/home-assistant:stable
    volumes:
    - /home/homeassistant/.homeassistant:/config
    environment:
    - TZ=Europe/Rome
    network_mode: host
    restart: always
  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
    - "443:443"
    environment:
    - "TZ=Europe/Rome"
    volumes:
    - "~/caddy/Caddyfile:/etc/caddy/Caddyfile"
    - "~/caddy/data:/data"
    restart: always

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/i servizi, 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.

Vetrina Promo

docker-compose” o “docker compose“?

Il modo più recente per eseguire Docker Compose è quello di utilizzarlo come plug-in di Docker: in sostanza, lo si installa come plug-in e questo lo aggiunge quale possibile sotto-comando del comando principale “docker“. Precedentemente (ma la pratica è ancora valida e operativa), Docker Compose poteva venire installato come applicazione a sé, la quale poteva venire evocata col comando “docker-compose“.

In pratica, i comandi (esemplificativi):

docker compose up -d

e

docker-compose up -d

sono negli effetti la stessa cosa, ma possono essere utilizzati:

  • il primo, solo installando Docker Compose come plug-in di Docker;
  • il secondo, solo installando Docker Compose come applicazione a sé (ormai pratica deprecata).

Si possono istallare entrambi, anche se ha poco senso. In caso si possono utilizzare entrambi i comandi.

GESTIONE ORDINARIA

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 -fa

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:

Questa pagina è redatta, manutenuta e aggiornata dallo staff di inDomus, un gruppo di persone molto diverse tra loro che trovi, per domande e supporto, sul forum e sulla chat del sito. Alcuni link sono taggati in qualità di affiliati Amazon e riceviamo un compenso dagli acquisti idonei, utile al sostenimento del sito, ma le nostre recensioni sono tutte indipendenti e non sponsorizzate. Se ti sei perso, a tua disposizione c'è la mappa.