Il Problema: I Container Sono Effimeri

Prima di parlare dei volumi, devi capire un concetto fondamentale: i container Docker sono effimeri. Cosa significa?

Immagina di avere un container con un database. Inserisci dati, tutto funziona perfettamente. Poi fermi il container, lo riavvii e… i dati sono spariti. Puff, volatilizzati.

Questo succede perché ogni container ha un proprio filesystem isolato che vive e muore con il container stesso. È come scrivere sulla sabbia: appena arriva l’onda, tutto scompare.

Cos’è un Volume Docker?

Un volume Docker è un meccanismo per salvare i dati al di fuori del container, in modo che persistano anche quando il container viene fermato, riavviato o eliminato.

Pensa ai volumi come a un hard disk esterno che colleghi al tuo container. I dati vengono scritti su questo “disco esterno” e rimangono al sicuro indipendentemente da cosa succede al container.

Perché Usare i Volumi?

  • Persistenza: i dati sopravvivono al ciclo di vita del container
  • Condivisione: più container possono accedere agli stessi dati
  • Backup: è più facile fare backup dei dati
  • Performance: i volumi sono ottimizzati per le operazioni I/O
  • Portabilità: puoi spostare i dati tra host diversi

I Tre Modi per Gestire i Dati in Docker

Docker offre tre approcci per la gestione dei dati. Vediamoli dal più consigliato al meno.

1. Volumi (Volumes) - La Scelta Consigliata

I volumi sono gestiti completamente da Docker e salvati in una directory speciale sull’host (/var/lib/docker/volumes/ su Linux).

1
2
3
4
5
# Creare un volume
docker volume create mio-volume

# Usare il volume in un container
docker run -v mio-volume:/app/data mia-immagine

Vantaggi:

  • Gestiti da Docker (facili da creare, eliminare, ispezionare)
  • Funzionano su Linux, Windows e Mac
  • Possono essere condivisi tra più container
  • Supportano driver per storage remoto (cloud, NFS, ecc.)

2. Bind Mounts - Collegamento Diretto

I bind mounts collegano una cartella specifica del tuo computer direttamente al container.

1
2
# Collegare una cartella locale al container
docker run -v /percorso/sul/tuo/pc:/app/data mia-immagine

Quando usarli:

  • Durante lo sviluppo, per vedere le modifiche al codice in tempo reale
  • Quando hai bisogno di accedere a file specifici del sistema host
  • Per condividere configurazioni tra host e container

Attenzione: i bind mounts dipendono dalla struttura del filesystem dell’host, quindi sono meno portabili.

3. tmpfs Mounts - Dati Temporanei in Memoria

I tmpfs mounts salvano i dati nella RAM dell’host, non su disco.

1
docker run --tmpfs /app/temp mia-immagine

Quando usarli:

  • Per dati sensibili che non devono essere scritti su disco
  • Per cache temporanee ad alte prestazioni
  • I dati vengono persi quando il container si ferma (ed è proprio quello che vuoi)

Comandi Essenziali per i Volumi

Creare un Volume

1
docker volume create nome-volume

Elencare i Volumi

1
docker volume ls

Ispezionare un Volume

1
docker volume inspect nome-volume

Questo comando mostra dove il volume è fisicamente salvato e altre informazioni utili.

Eliminare un Volume

1
2
3
4
5
# Eliminare un volume specifico
docker volume rm nome-volume

# Eliminare tutti i volumi non utilizzati
docker volume prune

Attenzione: eliminare un volume significa perdere tutti i dati contenuti. Non c’è cestino o recupero.

Esempi Pratici

Esempio 1: Database MySQL con Dati Persistenti

Senza volume, ogni volta che riavvii il container MySQL perdi tutti i dati. Ecco come risolvere:

1
2
3
4
5
6
7
8
9
# Creare un volume per i dati MySQL
docker volume create mysql-data

# Avviare MySQL usando il volume
docker run -d \
  --name mio-mysql \
  -e MYSQL_ROOT_PASSWORD=password123 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

Ora puoi fermare, riavviare o anche eliminare e ricreare il container: i dati del database rimarranno intatti nel volume mysql-data.

Esempio 2: Sviluppo Web con Bind Mount

Durante lo sviluppo, vuoi che le modifiche al codice siano immediatamente visibili nel container:

1
2
3
4
5
docker run -d \
  --name mio-sito \
  -p 8080:80 \
  -v $(pwd)/src:/var/www/html \
  php:apache

Ogni modifica ai file nella cartella src sarà immediatamente disponibile nel container.

Esempio 3: Condividere Dati tra Container

Due container che devono accedere agli stessi file:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Creare il volume condiviso
docker volume create dati-condivisi

# Container che scrive
docker run -d --name scrittore -v dati-condivisi:/data alpine \
  sh -c "while true; do date >> /data/log.txt; sleep 5; done"

# Container che legge
docker run -it --name lettore -v dati-condivisi:/data alpine \
  tail -f /data/log.txt

Volumi in Docker Compose

Quando usi Docker Compose, definire i volumi è ancora più semplice:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
  database:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

  app:
    image: mia-app
    volumes:
      - ./codice:/app          # Bind mount per sviluppo
      - logs:/app/logs          # Volume per i log

volumes:
  postgres-data:    # Volume gestito da Docker
  logs:             # Volume gestito da Docker

Con un semplice docker-compose up, Docker crea automaticamente i volumi necessari.

Backup e Ripristino dei Volumi

Fare il Backup di un Volume

1
2
3
4
docker run --rm \
  -v nome-volume:/source:ro \
  -v $(pwd):/backup \
  alpine tar czf /backup/backup.tar.gz -C /source .

Questo comando:

  1. Monta il volume in sola lettura (ro)
  2. Crea un archivio compresso nella directory corrente

Ripristinare un Backup

1
2
3
4
docker run --rm \
  -v nome-volume:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/backup.tar.gz -C /target

Errori Comuni da Evitare

1. Dimenticare di Usare i Volumi per i Database

Se usi un database in Docker senza volume, perderai tutti i dati. Sempre.

2. Usare Bind Mounts in Produzione

I bind mounts sono ottimi per lo sviluppo, ma in produzione usa i volumi Docker per maggiore portabilità e sicurezza.

3. Non Fare Backup dei Volumi

I volumi non vengono inclusi automaticamente nei backup del sistema. Pianifica backup regolari.

4. Accumulare Volumi Orfani

Quando elimini container, i volumi rimangono. Usa periodicamente:

1
docker volume prune

Per eliminare i volumi non più collegati a nessun container.

ScenarioSoluzione
Database in produzioneVolume Docker
Sviluppo localeBind mount
Dati sensibili temporaneitmpfs
Condivisione tra containerVolume Docker
File di configurazioneBind mount o Volume
Log applicazioneVolume Docker

Conclusioni

I volumi Docker risolvono uno dei problemi fondamentali dei container: la persistenza dei dati. Senza volumi, i container sarebbero utili solo per applicazioni stateless.

Ricorda le regole d’oro:

  • Usa sempre i volumi per i database
  • Usa bind mounts per lo sviluppo locale
  • Fai backup regolari dei volumi importanti
  • Pulisci periodicamente i volumi orfani

Una volta capito il concetto, i volumi diventano naturali come salvare un file sul disco. E i tuoi dati saranno finalmente al sicuro, indipendentemente da cosa succede ai container.


Nel prossimo articolo vedremo come gestire le reti in Docker per far comunicare i container tra loro.