7.1 Montaggio dei volumi
Montare volumi e reti in Docker Compose consente di creare applicazioni multicontainer flessibili ed efficaci. I volumi (volumes) vengono utilizzati per archiviare i dati che devono rimanere al di fuori dei container, mentre le reti (networks) permettono l'interazione tra container. In questa lezione vedremo in dettaglio come utilizzare volumi e reti in Docker Compose.
I volumi in Docker permettono di salvare i dati al di fuori dei container, assicurando la loro disponibilità anche dopo l'arresto o l'eliminazione dei container. Questo è particolarmente utile per conservare dati di database, file di log e altri dati che devono essere a lungo termine.
Tipi di volumi:
- Volumi nominati (Named Volumes): gestiti da Docker e salvati in una directory speciale sull'host.
- Volumi collegati (Bind Mounts): montati nel container da una directory specificata sull'host.
Definizione dei volumi in Docker Compose
Esempio di volumi nominati
In questo esempio è stato creato un volume nominato postgres-data
, che viene montato nella directory /var/lib/postgresql/data
all'interno del container db
.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Esempio di volumi collegati
In questo esempio, le directory e i file locali nginx.conf
e html
vengono montati nel container web
come volumi collegati.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Montaggio delle reti
Le reti in Docker Compose permettono ai container di interagire tra di loro. Ogni container può essere connesso a una o più reti, garantendo isolamento e gestione del traffico.
Tipi di reti:
- Reti Bridge (Bridge): per impostazione predefinita, i container sono connessi a una rete bridge, che consente la loro interazione su un unico host.
- Reti Overlay (Overlay): usate per l'interazione di container avviati su host diversi in un cluster Docker Swarm.
- Plugin di rete (Network Plugins): permettono di utilizzare driver di rete di terze parti per configurazioni più complesse.
Esempio di creazione e utilizzo di reti personalizzate
In questo esempio vengono create due reti personalizzate front-end e back-end. Il servizio app è connesso a entrambe le reti, il servizio web solo a front-end, e il servizio db solo a back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Consigli pratici:
- Utilizzo di volumi nominati: i volumi nominati sono gestiti da Docker e garantiscono semplicità nell'uso e nella gestione dei dati. I volumi nominati possono essere collegati a più servizi contemporaneamente. Ad esempio, il servizio di backend registra i log, e il servizio di monitoring li analizza e invia notifiche quando vengono rilevati errori di livello
error
. - Separazione delle reti: utilizzare più reti consente di isolare varie parti dell'applicazione e controllarne l'interazione.
- Archiviazione dei file di configurazione: utilizza volumi montati per i file di configurazione, in modo da poter modificare facilmente la configurazione senza ricostruire le immagini.
- Sicurezza delle reti: limita l'accesso alle reti affinché solo i container necessari possano interagire, migliorando così la sicurezza dell'applicazione.
7.3 Esempi di utilizzo di volumi e reti
Esempi di utilizzo di volumi e reti in Docker Compose:
Esempio 1: Applicazione con web server e database
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
In questo esempio:
- Il web server nginx e il database PostgreSQL sono connessi alla stessa rete webnet, permettendo loro di interagire. Se c'è una sola rete, non è necessario specificarla — ne verrà creata una di default.
- I dati del database sono memorizzati nel volume nominato db-data, garantendo la loro persistenza anche quando i container vengono riavviati.
Esempio 2: Applicazione con più livelli
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
In questo esempio:
- Sono state create due reti: front-tier e back-tier.
- Il servizio frontend è connesso a entrambe le reti, permettendo di interagire sia con il backend che con i client esterni.
- I servizi backend e database sono connessi solo alla rete back-tier per garantire il loro isolamento e interazione.
- I dati dei servizi backend e database sono memorizzati in volumi nominati separati backend-data e db-data.
GO TO FULL VERSION