Come funziona lo storage di Docker: Volumi vs Bind Mounts
Introduzione
In questo tutorial, imparerai come funziona lo storage di Docker e come mantenere i dati utilizzando Docker Volumes e Bind Mounts. Capirai anche le differenze chiave tra questi approcci e quando utilizzare ciascuno in produzione. Questo ti aiuterà a evitare la perdita di dati e a progettare sistemi containerizzati affidabili.
Prerequisiti
- Pubblico target: Amministratori di sistema principianti
- Tempo stimato: ~30 minuti
- Sistema operativo: Qualsiasi OS con supporto Docker come Ubuntu 22.04+, Debian 12+, CentOS Stream o macOS con Docker Desktop
- Software: Docker 24.0.0 o successivo
- Permessi: Utente con accesso a Docker o privilegi sudo
- Hardware: Almeno 2 GB di RAM e 10 GB di spazio libero su disco
- Rete: Accesso a Internet per scaricare le immagini dei container
- Conoscenze presunte: Uso base della riga di comando e comprensione dei container
Passo 1: Comprendere come funziona lo storage di Docker
I container Docker utilizzano un filesystem a strati. Ogni container ha uno strato scrivibile sopra gli strati di immagine in sola lettura.
Cosa succede quando un container scrive dati
- Docker memorizza gli strati di immagine come sola lettura
- Quando avvii un container, Docker aggiunge uno strato scrivibile
- Qualsiasi modifica ai file avviene solo in questo strato scrivibile
Risultato
Quando elimini un container, tutti i dati nello strato scrivibile vengono persi. Questo significa che lo storage del container è effimero per impostazione predefinita.
Questo comportamento è utile per applicazioni senza stato ma non per database o servizi persistenti.
Passo 2: Creare e utilizzare Docker Volumes
I Docker Volumes sono posizioni di storage gestite create e mantenute da Docker.
Crea un volume
Esegui il seguente comando:
docker volume create my_volume
Dovresti vedere il nome del volume restituito.
Usa un volume in un container
Esegui il seguente comando:
docker run -d -v my_volume:/app/data --name volume_test busybox
Docker monta il volume all'interno del container in /app/data.
Risultato
I dati scritti in /app/data persistono anche se il container viene rimosso.
Caratteristiche chiave dei volumi
- Gestiti da Docker
- Memorizzati in directory interne di Docker come
/var/lib/docker/volumes/ - Facili da eseguire il backup e migrare
- Isolati dalla struttura del filesystem dell'host
Usa i volumi per database e carichi di lavoro in produzione.
Passo 3: Creare e utilizzare Bind Mounts
I Bind Mounts collegano una directory specifica sull'host a una directory all'interno del container.
Usa un bind mount
Esegui il seguente comando:
docker run -d -v /home/<YOUR_USERNAME>/data:/app/data --name bind_test busybox
Risultato
Il container accede direttamente alla directory dell'host. Qualsiasi modifica nella directory dell'host è immediatamente visibile all'interno del container.
Caratteristiche chiave dei bind mounts
- Dipendono dai percorsi del filesystem dell'host
- Consentono la modifica diretta dei file dall'host
- Nessun isolamento gestito da Docker
- Più flessibili ma meno portabili
I bind mounts riflettono immediatamente le modifiche tra host e container.
Passo 4: Confrontare Volumes e Bind Mounts
Comprendere le differenze ti aiuta a scegliere l'opzione giusta.
Docker Volumes
- Gestiti da Docker
- Portabili tra ambienti
- Più sicuri per l'uso in produzione
- Più facili da eseguire il backup
- Astratti dal filesystem dell'host
Bind Mounts
- Gestiti dall'host
- Legati a percorsi specifici del filesystem
- Utili per lo sviluppo
- Forniscono accesso diretto ai file
- Meno sicuri se configurati male
Passo 5: Scegliere tra Volumes e Bind Mounts in produzione
Usa le seguenti linee guida.
Quando usare Docker Volumes
- Esecuzione di database come MySQL o PostgreSQL
- Memorizzazione di dati applicativi che devono persistere
- Distribuzione di servizi in produzione
- Necessità di portabilità tra server
Quando usare Bind Mounts
- Ambienti di sviluppo locale
- Modifica diretta di codice o file di configurazione
- Debug del comportamento del container
- Impostazioni temporanee o di test
Importante: I bind mounts possono esporre file sensibili dell'host ai container se configurati male. Verifica sempre percorsi e permessi.
Verifica e Test
Crea un container di test con un volume:
docker run -it -v my_volume:/data --name playground busybox
All'interno del container, crea un file:
echo test > /data/file.txt
Esci dal container e rimuovilo:
docker rm -f playground
Avvia un nuovo container con lo stesso volume:
docker run -it -v my_volume:/data --name playground busybox
Controlla il file:
cat /data/file.txt
Risultato atteso: Il file esiste ancora, confermando la persistenza dei dati.
Ripristino delle modifiche
Per pulire le risorse, esegui i seguenti comandi:
docker rm -f playground volume_test bind_test
docker volume rm my_volume
docker system prune -f
Importante: Rimuovere i volumi elimina permanentemente tutti i dati memorizzati.
Risoluzione dei problemi
- Problema: I dati scompaiono dopo il riavvio del container
Causa: Nessun volume o bind mount utilizzato
Soluzione: Allegare storage persistente utilizzando volumi o bind mounts - Problema: Errori di permesso negato
Causa: Mismatch dei permessi della directory dell'host
Soluzione: Regolare i permessi usandochmodochown - Problema: Volume non montato correttamente
Causa: Percorso o sintassi errati
Soluzione: Verificare il formato del mount e i percorsi
Conclusione e Passi Successivi
Hai imparato come funziona lo storage di Docker e come mantenere i dati utilizzando volumi e bind mounts. Capisci anche quando utilizzare ciascun approccio in produzione. Successivamente, esplora Docker Compose per gestire applicazioni multi-container e definire lo storage in modo più strutturato.