Come creare un ambiente Docker ottimale

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.

Docker environment

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!

Share: Facebook Twitter Linkedin

Comments