© Copyright 2026 Ferrantino Francesco

In questa sezione vedremo come Docker gestisce i dati dei container tramite bind mounts e volumi. Questi meccanismi permettono di collegare directory dell’host ai container o di salvare i dati in modo persistente, superando la natura effimera del filesystem interno ai container. Imparerai quando e perché usare i bind mount (collegamenti diretti a cartelle dell’host) oppure i volumi gestiti da Docker, e i comandi base per crearli e utilizzarli nei tuoi container.




Nota

Negli esempi che seguono il comando docker viene eseguito senza usare sudo. Questo è possibile perché l’utente è stato aggiunto al gruppo docker che consente di usare Docker con i permessi necessari.

frank@debian:~$ sudo usermod -aG docker $USER
frank@debian:~$ newgrp docker
frank@debian:~$ docker -v
frank@debian:~$ groups

Bind mounts: condivisione diretta dei file tra host e container

I bind mounts hanno senso tutte le volte in cui è necessario rendere disponibile all’interno di un container una risorsa che si trova già sul sistema host.

Questo approccio è utile quando serve uno scambio diretto e immediato tra host e container.

I bind mount permettono di condividere una risorsa del filesystem dell’host con un container. Questa risorsa può essere sia un singolo file sia un’intera directory. Nel caso di un file, viene resa disponibile nel container esattamente come sull’host ed è spesso usata per configurazioni o file di servizio. Nel caso di una directory, invece, tutto il suo contenuto viene montato all’interno del container, consentendo al servizio in esecuzione di accedere a file e sottodirectory come se fossero parte del proprio filesystem. In entrambi i casi, le modifiche effettuate sull’host sono immediatamente visibili anche nel container.

I dati non sono più legati alla vita del container: anche se il container viene fermato o rimosso, i file restano disponibili sull’host perché risiedono in una directory reale del sistema.

Un esempio classico è quello di un sito web: possiamo montare una directory dell’host che contiene i file del sito all’interno del container che esegue il web server. In questo modo, ogni modifica fatta ai file sull’host viene riflessa immediatamente nel container senza dover ricreare immagini o riavviare servizi.

Creare sul PC host le directory nginx_docker/webcontent e il file index.html, quindi montare questa directory del filesystem del PC host all’interno del container:
frank@debian:~$ cd /home/frank

frank@debian:~$ mkdir -p nginx_docker/webcontent

frank@debian:~$ echo "<h1>OK dal bind mount</h1>" > /home/frank/nginx_docker/webcontent/index.html

frank@debian:~$ docker run -d \
  --name nginx_web \
  -p 8080:80 \
  -v /home/frank/nginx_docker/webcontent:/usr/share/nginx/html \
  nginx

Quindi, modificando il file index.html direttamente sul sistema host il cambiamento è visibile in tempo reale all’interno del container.

Viene avviato un container nginx in background che espone la porta 80 del container sulla porta 8080 dell’host e monta la cartella sul PC host /home/frank/nginx_docker/webcontent dentro la cartella interna al container /usr/share/nginx/html cioè la directory da cui nginx serve i file web.

A questo punto puoi verificare il risultato via browser oppure da terminale con curl:
frank@debian:~$ curl http://localhost:8080
<h1>OK dal bind mount</h1>

Questo approccio è particolarmente utile in fase di sviluppo o di test quando si vuole lavorare direttamente sui file locali mantenendo il container leggero e temporaneo.


Volumi: persistenza e condivisione dei dati nei container

Il metodo preferito e consigliato per rendere persistenti i dati all’interno dei container sono i volumi. Un volume Docker non ha una dimensione fissa predefinita: la sua capacità cresce in base alla quantità di dati che vengono salvati al suo interno, fino a esaurire lo spazio disponibile sul filesystem dell’host, a meno che non vengano configurati esplicitamente dei limiti di quota.

I volumi offrono prestazioni paragonabili ai bind mounts ma sono molto più flessibili. Non richiedono che sul sistema host esista già una directory specifica da montare perché è Docker (o Podman) a gestirne direttamente la creazione e il ciclo di vita. Questo li rende più ordinati, più semplici da gestire e meno dipendenti dalla struttura del filesystem dell’host.

Un altro grande vantaggio dei volumi è che possono essere condivisi facilmente tra più container: lo stesso volume può essere montato su container diversi senza alcuna complicazione, rendendo possibile ad esempio, la condivisione di dati tra un’applicazione e un servizio di backup o tra più servizi che collaborano tra loro. Naturalmente, i dati contenuti nei volumi restano comunque accessibili anche dall’host.


Bind mounts vs Volumi

  • I bind mounts sono la scelta giusta quando serve uno scambio reciproco diretto tra una specifica directory dell’host e una directory del container.

  • I volumi sono ideali quando l’obiettivo è mantenere i dati persistenti in modo sicuro e possibilmente condivisibile tra più container:
    • persistenza dei dati: i dati sopravvivono alla distruzione del container.
    • disaccoppiamento dallo storage: i volumi sono gestiti da Docker tramite nomi univoci senza la necessità di conoscere il percorso (path) fisico sull'host.
    • condivisione: più container possono essere collegati contemporaneamente allo stesso volume per condividere informazioni.
    • sicurezza: solo i processi Docker possono modificare i volumi, proteggendoli da interferenze esterne.
    • flessibilità: possono essere facilmente agganciati (attach) o sganciati (detach) e supportano persino l'archiviazione in cloud.

Tutto quanto vale allo stesso modo anche per Podman che gestisce bind mounts e volumi seguendo gli stessi principi di Docker.


Comandi per la gestione dei Volumi

Docker fornisce il comando base docker volume per gestire l'intero ciclo di vita dello storage:
  • $ docker volume --help
  • $ docker volume create <nome_volume>: crea un nuovo volume
  • $ docker volume ls: elenca tutti i volumi presenti sulla macchina
  • $ docker volume inspect <nome_volume> oppure <hash del volume>: mostra i dettagli tecnici in formato JSON incluso il punto di montaggio fisico sull'host solitamente situato in /var/lib/docker/volumes/.../_data
  • $ docker volume rm <nome_volume>: rimuove un volume specifico
  • $ docker volume prune: elimina tutti i volumi locali anonimi non associati a un container
  • $ docker volume prune -a: elimina tutti i volumi locali anonimi non associati a un container compresi tutti i volumi con un nome
1. Creazione del volume
Il comando fondamentale per generare un nuovo volume è docker volume create seguito dal nome che si desidera assegnargli oppure anonimo senza nome:
$ docker volume create <nome_volume>
2. Verifica della creazione

Dopo aver creato il volume è possibile verificare che sia presente nell'elenco gestito da Docker utilizzando il comando ls.

$ docker volume ls

Questo comando mostrerà una lista dei volumi locali.

3. Creazione di un container con il volume associato

Una volta creato il volume deve essere agganciato a un container affinché possa essere utilizzato per la persistenza dei dati. Per farlo si utilizza l'opzione --mount all'interno del comando di creazione del container.

Utlizzare il comando docker create che crea il container con il volume associato ma non lo avvia e per farlo partire sarà necessario usare il comando docker start.
$ docker create -it --name <nome_container> --mount source=<nome_volume>,target=<percorso_nel_container> <immagine>
$ docker start -i <nome_container>

frank@debian:~$ docker create -it --name container0 --mount source=volume0,target=/app busybox
dccbed730145c9443a349cee14b29cf064bae9a3b7fe238188566e00704edbd1

frank@debian:~$ docker start -i container0
/ #
Premere la combinazione di tasti CTRL + P seguita da CTRL + Q per effettuare il detach dal container senza interromperne l’esecuzione.
frank@debian:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS          PORTS     NAMES
dccbed730145   busybox   "sh"      2 minutes ago   Up 46 seconds             container0
Oppure utilizzare semplicemente il comando docker run che crea il container e lo avvia immediatamente:
$ docker run --name <nome_container> -it --mount source=<nome_volume>,target=<percorso_nel_container> <immagine> sh

$ docker run --name container-1 -it --mount source=mio-volume,target=/app busybox sh
/ #

Premere la combinazione di tasti CTRL + P seguita da CTRL + Q per effettuare il detach dal container senza interromperne l’esecuzione.

frank@debian:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
f232d2a5b909   busybox   "sh"      5 minutes ago    Up 5 minutes              container-1
4. Opzione inspect
$ docker volume inspect <nome_volume> oppure <hash del volume>
L'output mostrerà un oggetto JSON contenente il mountpoint dove risiedono i file:
frank@debian:~$ docker volume inspect test_volume
[
    {
        "CreatedAt": "2026-02-08T21:25:51+01:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/test_volume/_data",
        "Name": "test_volume",
        "Options": null,
        "Scope": "local"
    }
]

Con Docker Volume Inspector non possiamo vedere quali container utilizzano il volume ma attraverso il nome del volume possiamo confrontare la corrispondenza nel docker inspect <nome_container> oppure <container_ID> sono presenti tutte le impostazioni del container compresi i volumi montati.


Come mappare lo stesso volume su due container

La caratteristica principale dei volumi è la condivisione.

Per collegare un volume a un container durante la sua creazione si utilizza l'opzione --mount dove sourceè il nome del volume e target è la cartella interna al container che è mappata sul volume:
frank@debian:~$ docker volume create mio-volume-condiviso

frank@debian:~$ docker run --name container-1 -it --mount source=mio-volume-condiviso,target=/app busybox sh 
/ # 
Premere la combinazione di tasti CTRL + P seguita da CTRL + Q per effettuare il detach dal container senza interromperne l’esecuzione.

frank@debian:~$ docker run --name container-2 -it --mount source=mio-volume-condiviso,target=/app busybox sh
/ # 
Premere la combinazione di tasti CTRL + P seguita da CTRL + Q per effettuare il detach dal container senza interromperne l’esecuzione.

Se due container mappano lo stesso volume le modifiche effettuate da uno sono immediatamente visibili all'altro.

Entriamo nel primo container container-1 già in esecuzione accedendo ad una shell interattiva entriamo nella directory /app che è il punto di mount del volume condiviso e creiamo una nuova cartella chiamata test:
frank@debian:~$ docker exec -it container-1 sh
/ # cd /app
/ # ls
/ # mkdir test
/ # cd test
/ # vi prova.txt --> editare il file inserendo del testo

Premere la combinazione di tasti CTRL + P seguita da CTRL + Q per effettuare il detach dal container senza interromperne l’esecuzione.
Successivamente ci colleghiamo al secondo container container-2, modifichiamo al suo interno il file prova.txt e modificando il contenuto del file stiamo in realtà agendo sui dati persistenti del volume e non su un filesystem temporaneo del singolo container:
frank@debian:~$ docker exec -it container-2 sh  
/ # ls
/ # cd /app/test
/ # ls
/ # vi prova.txt --> editare il file inserendo del testo

Premere la combinazione di tasti CTRL + P seguita da CTRL + Q per effettuare il detach dal container senza interromperne l’esecuzione.

All'interno della cartella di destinazione /app è possibile creare i file che rimarranno memorizzati nel volume anche dopo l'uscita o lo spegnimento dei container.


Rimozione volume e sicurezza

Docker impedisce la rimozione accidentale dei volumi. Se si tenta di eliminare un volume ancora collegato a un container anche se quest'ultimo è fermo, Docker restituirà un errore di volume in uso. Per eliminare definitivamente il volume e i dati è necessario prima rimuovere tutti i container associati.

Se provi a cancellare un volume ancora collegato a uno o più container, Docker ti blocca con un errore:
frank@debian:~$ docker volume rm mio-volume-condiviso 
Error response from daemon: remove mio-volume-condiviso: volume is in use - [3d0428e2f4fb9a95051df084bf40c4cfe51dbb7f7fa284f78a39914278b162ce, 84a7112a5017ef71d56ed609ef9b58a9a26bc2688861da2a344bd1c8de05f9a9]
Anche se fermi i container il volume risulta comunque agganciato perché i container esistono ancora (solo in stato stopped):
frank@debian:~$ docker stop container-1
frank@debian:~$ docker stop container-2

frank@debian:~$ docker volume rm mio-volume-condiviso 
Error response from daemon: remove mio-volume-condiviso: volume is in use - [3d0428e2f4fb9a95051df084bf40c4cfe51dbb7f7fa284f78a39914278b162ce, 84a7112a5017ef71d56ed609ef9b58a9a26bc2688861da2a344bd1c8de05f9a9]
A questo punto bisogna sganciare il volume rimuovendo i container che lo stanno utilizzando:
frank@debian:~$ docker rm container-1
frank@debian:~$ docker rm container-2
Solo quando il volume non è più associato ad alcun container può essere eliminato:
frank@debian:~$ docker volume rm mio-volume-condiviso
Ferrantino Francesco

Ferrantino Francesco

Cookie Policy

Leggi  informativa Cookie Policy
Il "Sito" utilizza i Cookie per rendere i propri servizi semplici e efficienti per l’utenza che visiona le pagine di franksoft.it

Disclaimer

L'autore degli articoli non si assume nessuna responsabilità per eventuali danni ai vostri dispositivi. Tutto ciò che viene spiegato è puramente a scopo dimostrativo.
Il presente sito non costituisce testata giornalistica in quanto non ha carattere periodico ed è aggiornato secondo la mia disponibilità e la reperibilità dei materiali ivi contenuti. Pertanto, non può essere considerato in alcun modo un prodotto editoriale ai sensi della Legge n. 62 del 7/03/2001.

Licenza

Tutte le immagini presenti nel sito appartengono ai rispettivi titolari e sono utilizzate senza alcuno scopo di lucro. Ogni eventuale violazione del copyright non è intenzionale.
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 4.0 Internazionale.  Licenza Creative Commons