Cos’è il Docker Compose? Un esempio pratico!

Docker, fin dalla sua nascita, è diventato uno strumento utilissimo. In pochi secondi possiamo creare rapidamente e facilmente un ambiente di lavoro isolato simile a quello di produzione, il tutto con poche risorse e su una singola macchina.

Una delle caratteristiche chiave di Docker che ha contribuito alla sua facilità è Docker Compose. In questo articolo capiremo cos’è Docker Compose e come usarlo facendo un esempio pratico.

Cos’è il Docker compose?

Fin dalla sua nascita Docker si è affermato come potente strumento per creare ed eseguire container. Tuttavia, a volte ci si ritrova a gestire più containers contemporaneamente. Non solo, spesso ci ritroviamo a dover implementare un’intera infrastruttura con reti, volumi e altro ancora. Inoltre, potrebbe essere necessario replicare altre volte lo stesso ambiente di lavoro o di implementarlo nuovamente a distanza di tempo. È qui che ci viene in soccorso Docker Compose.

Docker Compose è un tool che ci permette di definire e gestire applicazioni multi-container usando un singolo file in formato YAML, possiamo dichiarare tutti i servizi necessari alla nostra applicazione e, con un singolo comando, gestire l’intero lifecycle dei container.

L’ambiente che creeremo

In questo articolo lavoreremo alla creazione di una applicazione che sfrutta Docker per generare un ambiente di lavoro composto da un database MongoDB usando l’immagine di Mongo e un interfaccia web per gestire il database usando l’immagine di Mongo Express.

Prima di iniziare, è importante notare che oltre a definire una rete per consentire la comunicazione tra i due servizi, abbiamo anche bisogno di un volume per il database, in questo modo i dati saranno salvati e persisteranno tra le esecuzioni. Inoltre, Mongo Express richiede che il servizio Mongo esista già per essere eseguito e funzionare correttamente.

Useremo Docker Compose per semplificare la creazione e la gestione dell’interno ambiente di lavoro.

Creazione del Docker Compose

Passiamo ora alla creazione del nostro file, la best practice vuole che il file venga creato in una directory e venga chiamato docker-compose.yml, è comunque possibile usare un nome custom ma bisognerebbe poi specificare il percorso del file usando il flag -f. All’interno del file specificheremo i services ovvero i vari container che volgiamo creare con le immagini da usare. Oltre a definire i services possiamo specificare le restart policies, i volumi e le network da usare. Volumi e Reti hanno una loro sezione, in questo modo anche se non esistono Docker le creerà.

Per iniziare, creiamo una cartella di lavoro e creiamo il file con estensione .yml

Fatto ciò, possiamo aprire il file con il nostro editor preferito.

La prima cosa da fare è specificare la versione di Docker Compose che intendiamo utilizzare, usiamo la sintassi version: ‘3’ per usare la versione 3 del formato Docker Compose.

Successivamente creiamo la sezione “services:” in cui dichiarare i container che vogliamo creare, in questo caso useremo due container: “mongo” e “mongo-express”.

Nel servizio “mongo” specifichiamo l’immagine “mongo” da utilizzare per il container. Usando poi la coppia chiave/valore “restart: always” possiamo assicurarci che il container verrà riavviato automaticamente in caso di errore. Inoltre, definiamo un volume chiamato “localdatabase” che verrà montato nella directory “/data/db” del container per persistere i dati del db. Infine, associamo il container alla rete “composenetwork”.

Per il servizio “mongo-express” specifichiamo l’immagine “mongo-express” da usare per il container. Mappiamo la porta locale 8081 alla porta 8081 del container per consentire l’accesso all’interfaccia web di Mongo Express. Inoltre, impostiamo le variabili d’ambiente “ME_CONFIG_MONGODB_SERVER” e “ME_CONFIG_MONGODB_PORT” per indicare a Mongo Express di connettersi al servizio “mongo” sulla porta predefinita di MongoDB. Assicuriamoci che il servizio sia avviato dopo “mongo” usando la sezione “depends_on”.

				
					version: '3'

services:
  mongo:
    image: mongo
    restart: always
    volumes:
      - localdatabase:/data/db
    networks:
      - composenetwork

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongo
      - ME_CONFIG_MONGODB_PORT=27017
    networks:
      - composenetwork
    depends_on:
      - mongo

				
			

Dopo aver definito i servizi, creiamo le sezioni “networks” e “volumes” per dichiarare le reti e i volumi usati dal container.

				
					version: '3'

services:
  mongo:
    image: mongo
    restart: always
    volumes:
      - localdatabase:/data/db
    networks:
      - composenetwork

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      - ME_CONFIG_MONGODB_SERVER=mongo
      - ME_CONFIG_MONGODB_PORT=27017
    networks:
      - composenetwork
    depends_on:
      - mongo

volumes:
  localdatabase:

networks:
  composenetwork:
    driver: bridge

				
			

Avvio del Docker Compose

Va notato che le immagini dei container, reti e volumi specificati nel file docker-compose non devono necessariamente esistere localmente, è proprio questo il nostro caso.

Pronto il file di configurazione possiamo avviare tutti i container usando il comando docker compose up -d. Questo comando leggerà il contenuto del file e avvierà i container in modalità detached, vale a dire in backgorund senza che il terminale si blocchi, e così facendo il controllo viene restituito al terminale in modo da poterlo usare per altre attività. Docker Compose si occuperà automaticamente di scaricare le immagini dei container, creare i container e configurare reti e volumi.

Ovviamente potremmo avere più docker compose in esecuzione e dare semplicemente il comando docker ps non ci aiuterebbe in quanto vedremmo tutti i container in esecuzione, anche quelli che non fanno parte dello stesso “gruppo”. Per vedere dettagli circa la mappatura delle porte, lo status dei container e i comandi che vengono eseguiti possiamo usare il comando docker compose ps .

A questo punto è possibile verificare il corretto funzionamento dell’applicazione aprendo il browser e visitando localhost:8081. Otterremo in questo modo l’interfaccia di Mongo Express.

Con Docker Compose abbiamo creato rapidamente un ambiente di lavoro multi-container facilmente replicabile in modo facile e veloce.

Conclusione e considerazioni

Anche se il file Docker Compose può diventare più complesso e con più servizi, questo non incide sulla facilità di creazione e gestione dell’ambiente. Se vogliamo mettere in pausa l’ambiente possiamo semplicemente eseguire il comando docker compose stop. Per riprendere basta dare il comando docker compose start .

Se poi abbiamo esigenza di fare pulizia oltre a stoppare il tutto possiamo eseguire il comando docker compose down .

In sostanza, Docker Compose ci semplifica notevolmente la gestione di ambienti di lavoro complessi permettendoci di gestire l’intero lifecycle dell’ambiente di lavoro. 

Se lavori con Docker e hai bisogno di una panoramica completa sullo strumento, consulta i nostri Corsi Docker DSD per ottenere una certificazione!