Docker Compose – tool per per gestire applicazioni multi container
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].