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,appedb. -
webusa l'immagine Nginx, monta un file di configurazione e dipende dal servizioapp. -
appviene buildato da un Dockerfile locale, monta il codice sorgente dell'applicazione e usa variabili d'ambiente. -
dbusa 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