Per lo sviluppo di un software è necessario avere a disposizione un ambiente locale con tutti i servizi a disposizione per la corretta esecuzione dell’applicazione che si sta sviluppando.
Ad esempio, se si sta sviluppando un’applicazione web con Symfony, sarà necessario avere a disposizione un webserver come Apache o Nginx, un interprete PHP e probabilmente un database sul quale salvare i dati, come Postgre o MySql.
Come può aiutarti Docker?
Docker permette di suddividere queste tre parti lanciando tre ambienti isolati, in cui ogni servizio viene eseguito. Questi ambienti isolati sono i Docker container. Quindi, seguendo l’esempio, per la corretta esecuzione della nostra applicazione dovremo avere tre container in esecuzione: uno per il web server, uno con l’interprete PHP e uno con il database.
Lanciare l’esecuzione di questi container da solo non è sufficiente. Abbiamo anche la necessità di farli comunicare fra di loro. Come abbiamo detto, ogni container è un ambiente isolato, e non è a conoscenza del mondo esterno. Per questo il container PHP non è a conoscenza del fatto che esista un container MySql al quale connettersi.
Docker compose
Docker compose è un tool che permette la realizzazione di applicazioni multi-container. E’ molto utilizzato per la configurazione di ambienti di sviluppo in locale, perché è facile da configurare e ha una api da riga di comando molto semplice e veloce da imparare.
Si configura con un file yaml, che per convenzione viene nominato docker-compose.yaml, ma non necessariamente. Attenzione perché è’ possibile anche utilizzare un diverso file specificandolo all’avvio di Docker compose.
Una volta pronto il file di configurazione è possibile lanciare i container, con il comando:
docker-compose up
…e fermare tutti i container con il comando:
docker-compose down
File docker-compose.yaml
Vediamo come si presenta un file di configurazione per Docker compose.
version: ‘3.4’
services:
myappdb:
image: mysql:5.7.29
container_name: myappdb
volumes:
– ./docker:/init
command: –init-file /init/db-init.sql
environment:
MYSQL_ROOT_PASSWORD: “secret”
nginx:
image: nginx:latest
container_name: myapp-nginx
ports:
– 80:80
volumes:
– ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
– “myapp”
myapp:
build:
context: ./
container_name: myapp
volumes:
– ./:/var/www/myapp
Vediamo adesso di commentare le parti interessanti di questo file per capire il funzionamento di ognuna.
version: ‘3.4’
Questa è la versione della sintassi di configurazione utilizzata.
myappdb:
Ogni servizio è contraddistinto da un nome. Questo nome è molto importante e deve essere univoco. Infatti viene utilizzato come namespace per raggiungere il container. Ad esempio in questo caso l’applicazione PHP dovrà cercare di connettersi al database che ha come hostname “myappdb” e porta 3306.
image: mysql:5.7.29
Immagine dalla quale inizializzare il container.
container_name: myappdb
Nome del container.
volumes:
– ./docker:/init
Con questa istruzione eseguiamo il mapping di una cartella locale con una all’interno del container, in modo che i file in essa contenuti possano essere raggiungibili da parte di un processo in esecuzione all’interno del container.
command: –init-file /init/db-init.sql
Aggiunge l’argomento al comando principale del Dockerfile o lo sovrascrive.
environment:
MYSQL_ROOT_PASSWORD: “secret”
E’ possibile assegnare variabili d’ambiente.
ports:
– 80:80
E’ possibile mappare una porta in modo che sia raggiungibile dall’host. In questo caso potremo raggiungere il container nginx tramite la porta 80.
build:
context: ./
Per il container PHP non iniziamo da un’immagine pronta, ma la creiamo dinamicamente, cercando un Dockerfile nella cartella specificata.
Risorse ufficiali
Documentazione di Docker compose e Docker compose reference da consultare sempre e comunque!
In conclusione
Abbiamo voluto offrirti un’infarinatura di cos’è Docker compose e come funziona. Consulta la documentazione ufficiale e inizia a sperimentare in locale. Il modo migliore di imparare è quello di sporcarsi le mani!
Read related articles
Kubernetes Cloud: servizi Cloud per Kubernetes, mini guida pratica
Kubernetes Cloud: vediamo da vicino Amazon Elastic Kubernetes Service (EKS) Google Kubernetes Engine (GKE) e Servizio Azure Kubernetes (AKS) I
Come funziona Kubernetes: funzionamento e struttura
Come funziona Kubernetes: mini guida per capire il funzionamento di uno dei tools più importanti per un developer oggi Come
Docker vs Kubernetes: vediamo in cosa differiscono
Docker vs Kubernetes: vediamo in cosa differiscono e perché a volte si tende a far confusione Spesso sentiamo chiedere in