3.1 File compose.yaml
Il file compose.yaml
(o una delle seguenti varianti: docker-compose.yaml
, docker-compose.yml
, compose.yml
) è il file di configurazione principale utilizzato da Docker Compose per definire e gestire applicazioni multi-container. Descrive quali container (servizi) devono essere avviati, come interagiscono tra di loro e quali risorse necessitano.
Per uniformità in questa lezione, useremo la variante compose.yaml
, poiché è raccomandata per le versioni moderne di Docker Compose.
Struttura del file compose.yaml
Il file compose.yaml
è composto da diverse sezioni, ognuna delle quali descrive vari aspetti della configurazione dell'applicazione. Le sezioni principali includono:
- version: specifica la versione del file Compose (ad esempio,
'3.9'
). - services: descrive i container (servizi), le loro configurazioni e dipendenze.
- volumes: definisce i volumi per memorizzare i dati tra i container e l'host.
- networks: configura le reti attraverso le quali i servizi comunicano tra di loro.
3.2 Direttive principali
1. version
La direttiva version definisce la versione della sintassi Docker Compose utilizzata nel file compose.yaml
. Al momento in cui scriviamo, la versione più aggiornata è la 3, in particolare gli aggiornamenti come 3.8 e 3.9.
version: '3.9'
2. services
La sezione services definisce i container che Compose deve creare ed eseguire. Ogni servizio rappresenta un container separato con una configurazione specifica.
Esempio:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
In questo esempio sono definiti due servizi: web
e db
. Il servizio web
utilizza l'immagine nginx:latest
e apre la porta 80. Il servizio db
utilizza l'immagine mongo:latest
e collega un volume per archiviare i dati.
3. volumes
La sezione volumes è utilizzata per definire i volumi che possono essere collegati ai container per l'archiviazione dei dati. Questo è utile per conservare i dati nel caso in cui i container vengano riavviati.
Esempio:
volumes:
mongo-data:
4. networks
La sezione networks consente di definire reti personalizzate in cui operano i container. Questo garantisce isolamento e configurazione delle connessioni di rete. Se le reti non sono specificate, Docker Compose creerà una rete predefinita e tutti i servizi vi saranno collegati.
Esempio:
networks:
front-end:
back-end:
3.3 Direttive per la configurazione dei servizi
Le principali direttive per configurare i servizi:
1. image
La direttiva image indica l'immagine che verrà utilizzata per creare il container.
Esempio:
services:
web:
image: nginx:latest
2. build
La direttiva build viene utilizzata per specificare il percorso al Dockerfile, che deve essere utilizzato per costruire l'immagine.
Esempio:
services:
app:
build: ./app
3. ports
La direttiva ports definisce le porte che devono essere aperte e inoltrate dalla macchina host al container.
Esempio:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
La direttiva volumes monta i volumi nei container, consentendo di salvare i dati tra i riavvii dei container.
Esempio:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
La direttiva environment imposta le variabili di ambiente per il container.
Esempio:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
La direttiva depends_on indica che questo servizio dipende da altri servizi e deve essere avviato dopo di essi.
Importante!
Quando avvii il tuo servizio, non hai una garanzia del 100% che tutti i servizi necessari per il suo funzionamento siano completamente pronti. Saranno avviati, sì, ma il successivo funzionamento non è garantito. Questo problema può essere risolto con l'health-check, ma ne parleremo più avanti.
Esempio:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
La direttiva command consente di sovrascrivere il comando che verrà eseguito all'avvio del container.
Esempio:
services:
app:
image: myapp:latest
command: python app.py
8. networks
La direttiva networks connette il servizio a una o più reti.
Esempio:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Esempio completo
Esempio completo del file compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
In questo esempio:
- Sono definiti tre servizi:
web
,app
edb
. -
web
usa l'immagine Nginx, monta un file di configurazione e dipende dal servizioapp
. -
app
viene buildato da un Dockerfile locale, monta il codice sorgente dell'applicazione e usa variabili d'ambiente. -
db
usa l'immagine MongoDB e monta un volume per archiviare i dati. - Sono creati due volumi e due network per isolare e gestire l'interazione tra i servizi.
Nota: un volume è mongo-data
, e l'altro è una directory montata dalla macchina host (per esempio, ./app
).
GO TO FULL VERSION