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>
.