Se i container sono isolati, come possono comunicare con la macchina host, magari per memorizzare i dati? Perché quando creiamo un contenitore da un'immagine, tutti i dati generati vengono persi quando il contenitore viene rimosso.
Quindi abbiamo bisogno di un modo per avere una memoria permanente.
Possiamo farlo usando Bind Mounts e Volumi .
Non c'è molta differenza tra i due, tranne che Bind Mounts può puntare a qualsiasi cartella sul computer host e non sono gestiti direttamente da Docker.
Cominciamo con loro. Un classico esempio sono i log. Supponiamo che la tua app crei un file di registro, all'interno del contenitore, in /usr/src/app/logs . Puoi mapparlo su una cartella sulla macchina host, usando il -v (come --volume ) flag quando esegui il contenitore con docker run , in questo modo:-v ~/logs:/usr/src/app/logs
Questo mapperà quella cartella alla sottocartella dei registri nella directory home dell'utente.
Nodo:il -m o --mount flag funziona in modo molto simile
Questo è il flag utilizzato con il examplenode immagine che abbiamo creato in precedenza:
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode Quindi ora possiamo eseguire la nostra app Node e qualsiasi registro verrà archiviato nel computer host, anziché all'interno del contenitore Docker.
Nota che il examplenode l'app non genera alcun accesso in /usr/src/app/logs , è solo un esempio e dovresti prima impostare la registrazione.
I dettagli sul volume verranno elencati quando esegui docker inspect sul nome del contenitore, in "Supporti":
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Riesci a vedere "Type": "bind" ? Ciò significa che abbiamo creato un bind mount .
Ora parliamo di Volumi .
La differenza tra Bind Mounts e Volumi è che creando volumi, Docker memorizzerà i dati in una cartella che gestisce, il che significa che si occuperà delle autorizzazioni e della proprietà dei file e ti fornirà gli strumenti per gestire quei volumi. Sebbene i mount bind siano basati sui percorsi del filesystem e Docker non può fornire gli strumenti che li circondano.
Ad esempio, Docker ti consente di rimuovere tutti i volumi inutilizzati eseguendo docker volume prune o docker system prune --volumes .
Per creare un volume, dobbiamo prima eseguire docker volume create :
docker volume create logs
Ora puoi usare docker volume ls e docker volume inspect per ottenere più dati sui volumi di sistema:

Ora esegui docker run con l'opzione -v logs:/usr/src/app/logs (comunica il nome del volume invece di una cartella)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
Ora è in esecuzione docker inspect sull'immagine mostrerà il volume montato:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
Vedere? Ora i log verranno archiviati in /var/lib/docker/volumes/logs/_data cartella.
I volumi saranno essenziali quando, ad esempio, sarà il momento di distribuire un container su un servizio cloud.
È possibile rimuovere un volume che esegue docker volume rm <name> .