Perché un container perde i dati quando si riavvia
Scrivi una riga su un database in esecuzione in un container Docker, fermi il container, lo riavvii: la riga non c’è più.
Ogni container riceve il suo filesystem dall’immagine, nuovo, a ogni avvio. Tutto ciò che il container scrive — file del database, upload, log — finisce in uno strato scrivibile che viene buttato via quando il container viene rimosso. Un volume Docker è il modo per tenere quei dati fuori dal container, dove sopravvivono.
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
Volumi, bind mount e tmpfs: quale usare
Ci sono tre modi per rendere persistenti i dati, nell’ordine in cui dovresti considerarli: volumi, bind mount, tmpfs.
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).
| |
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.
| |
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.
| |
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 per i volumi Docker: create, list, inspect, remove
Creare un Volume
| |
Elencare i Volumi
| |
Ispezionare un Volume
| |
Questo comando mostra dove il volume è fisicamente salvato e altre informazioni utili.
Eliminare un Volume
| |
Attenzione: eliminare un volume significa perdere tutti i dati contenuti. Non c’è cestino o recupero.
Esempi di volumi Docker: database, sviluppo con live reload, condivisione
Esempio 1: Database MySQL con Dati Persistenti
Senza volume, ogni volta che riavvii il container MySQL perdi tutti i dati. Ecco come risolvere:
| |
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:
| |
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:
| |
Volumi in Docker Compose
In Docker Compose dichiari i volumi una volta e ogni servizio che ne ha bisogno li richiama per nome:
| |
Con un semplice docker-compose up, Docker crea automaticamente i volumi necessari.
Backup e Ripristino dei Volumi
Fare il Backup di un Volume
| |
Questo comando:
- Monta il volume in sola lettura (
ro) - Crea un archivio compresso nella directory corrente
Ripristinare un Backup
| |
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:
| |
Per eliminare i volumi non più collegati a nessun container.
Quale opzione di storage per quale scopo
| Scenario | Soluzione |
|---|---|
| Database in produzione | Volume Docker |
| Sviluppo locale | Bind mount |
| Dati sensibili temporanei | tmpfs |
| Condivisione tra container | Volume Docker |
| File di configurazione | Bind mount o Volume |
| Log applicazione | Volume Docker |
La regola che copre quasi tutti i casi
Usa un volume con nome per tutto ciò che un container scrive e che vuoi conservare, i database prima di ogni altra cosa. Usa un bind mount quando vuoi che il container veda una cartella della tua macchina mentre la modifichi, che è per lo più sviluppo locale. Tieni tmpfs per i dati che non devono mai toccare il disco.
Quando un database ha un volume, puoi eliminare e ricreare il suo container quante volte vuoi e i dati restano al loro posto. È tutto qui.