Code, Learn

Docker Compose – tool per per gestire applicazioni multi container

30 Luglio 2020 - 3 minuti di lettura

Da quando lavoro in Intré uno degli strumenti che utilizzo e che sto apprezzando sempre di più è Docker [1], una piattaforma software open source che permette di creare, testare e distribuire applicazioni software rapidamente attraverso l’uso di unità standardizzate chiamate container che offrono tutto il necessario per la loro corretta esecuzione.

Con l’evoluzione della rete e delle applicazioni sempre più spesso si ha la necessità di organizzare un’applicazione in più container.

Docker Compose è uno strumento per la definizione e l’esecuzione di applicazioni Docker multi-contenitore. Tramite un file Compose possiamo quindi utilizzare un singolo comando per creare e avviare tutti i servizi della propria configurazione.

Vi mostrerò un esempio di un semplice file Compose e qualche comando Docker utile per Compose.

Un semplice caso d’uso

In questo esempio definiamo tre semplici servizi per una generica applicazione: web-ui per il front-end, web-api per il back-end e mongo per l’istanza di MongoDB, il database.

Ogni servizio della nostra applicazione avrà bisogno di un Dockerfile che verrà buildato per creare l’immagine specifica. Il file si chiama docker-compose.yml o (.yaml, è indifferente), scritto utilizzando il linguaggio YAML [2].

version: '3'
services:
 web-ui:
  build:
   context: web-ui
  ports:
   - 5000:5000
 web-api:
  build:
   context: web-api
  volumes:
   - ./web-api/data:/data
 mongo:
  image: mongo
  restart: always
  ports:
   - 27017:27017
  environment:
   MONGO_ROOT_USERNAME: root
   MONGO_ROOT_PASSWORD: example
  volumes:
   - mongo-data-volume:/data/db
volumes:
 mongo-data-volume:

Il servizio web-ui utilizza un’immagine buildata dal Dockerfile presente nella cartella /web-ui quindi lega il container e l’host della macchina alla porta esposta, la 5000.

Il servizio web-api utilizza un’immagine buildata dal Dockerfile presente nella cartella /web-api. Utilizzando la chiave volumes il sistema monta la cartella ./web-api/data sulla macchina host nella cartella /data all’interno del container, permettendo di modificare i dati al volo senza dover ricostruire l’immagine.

Il servizio mongo utilizza un’immagine di MongoDB per far partire un database. Anche in questo caso viene montato un volume con i dati del database ma Docker utilizzerà un volume condiviso usato appunto per gestire dati in condivisione tra più container.

Per ulteriori approfondimenti sul file Compose vi consiglio la documentazione ufficiale [3].

Comandi utili

A differenza dei comandi Docker che possono essere eseguiti ovunque, per poter utilizzare i comandi di Docker Compose bisogna trovarsi in una cartella contenente almeno un file docker-compose.

Di seguito vi elenco alcuni comandi principali:

  • docker-compose ps visualizza i processi attivi relativi ad un Compose;
  • docker-compose up -d crea ed avvia i container del Compose, con l’opzione -d per avviarli in background;
  • docker-compose down stoppa e rimuove i container del Compose;
  • docker-compose logs -f <nome_container> visualizza i log di un container;
  • docker-compose exec <nome_container> bash, per avere accesso tramite shell all’interno di un container;
  • docker-compose restart <nome_container>, per stoppare e riavviare un container.

Ricordiamoci che se nella cartella corrente abbiamo più file docker-compose dobbiamo specificare quale usare inserendo -f <nome_file> prima di qualsiasi comando (se non specificato viene preso docker-compose.yml).

E’ inoltre possibile utilizzare anche –p <nome_progetto> per specificare il nome che verrà dato al progetto, di default viene preso il nome della cartella.

Di seguito un esempio di un ps utilizzato specificando il file e il progetto:
docker-compose -f <nome_file> -p <nome_progetto> ps

Per approfondire l’utilizzo dei comandi CLI, rimando alla documentazione ufficiale [4].

Articolo scritto da