Cosa sono i volumi Docker e come li usi?

0
602

Per impostazione predefinita, i container Docker sono completamente senza stato. I dati archiviati nel contenitore sono effimeri e verranno cancellati alla chiusura del contenitore. Questo ovviamente non è l'ideale per molte applicazioni, quindi Docker fornisce alcuni modi per gestire lo stato.

Cosa sono i volumi?

Il modo più semplice per rendere persistenti i dati Docker è bind mount, che legano letteralmente una posizione sul disco dell'host a una posizione sul disco del contenitore. Questi sono semplici da creare e utilizzare, ma sono un po' stravaganti in quanto è necessario impostare le directory e gestirli da soli.

I volumi sono come dischi rigidi virtuali gestiti da Docker. Docker gestisce l'archiviazione su disco (di solito in /var/lib/docker/volumes/) e fornisce loro un nome singolo facilmente memorabile anziché un percorso di directory. È facile crearli e rimuoverli utilizzando la Docker CLI.

Questi hanno alcuni altri vantaggi oltre ad essere gestiti da Docker. Funzionano sia su container Linux che Windows, possono essere condivisi in modo più sicuro tra più container e i driver di volume consentono ai provider cloud di fornire hosting remoto per i dati sottostanti. Nel complesso, i volumi sono più facili da usare rispetto ai montaggi di associazione e sono consigliati da Docker per la gestione dello stato.

Ovviamente, dovresti considerare se hai davvero bisogno che i dati Docker vengano archiviati sul server. Per molte applicazioni, l'utilizzo di un datastore remoto esterno come Amazon S3 o di un database esterno è sufficiente per archiviare i dati che utilizzano senza vincolarli al server frontend.

Come li usi?

Puoi creare un nuovo volume dalla riga di comando con il seguente comando:

docker volume create nginx-config Advertisement

E poi , quando esegui il tuo container Docker, collegalo alla destinazione nel container con il flag –mount:

docker run -d –name devtest –mount source=nginx-config,target=/etc/nginx nginx:latest

Se esegui docker inspect <name>, vedrai il volume elencati nella sezione Montaggi.

Se utilizzi Docker Compose, anche la configurazione è semplice. Aggiungi semplicemente una voce volume per ogni servizio container di cui disponi, quindi mappa un nome di volume a una posizione nel guest. Dovrai anche fornire un elenco di volumi in una chiave dei volumi di primo livello per consentire a Compose di eseguire il provisioning.

versione: “3.0” servizi: web: immagine: nginx:latest porte: – “80:80” volumi: – nginx-config:/etc/nginx/volumi: nginx-config:

Questo creerà automaticamente il volume per questo Componi. Se desideri utilizzare un volume predefinito dall'esterno di Compose, specifica external: true nella configurazione del volume:

volumes: cms-content: external: true

Se preferisci invece fai semplicemente un bind mount e non preoccuparti dei volumi, inserisci semplicemente un nome di percorso al posto del nome del volume e rinuncia a definire i nomi del volume.

versione: “3.0” servizi: web: immagine: nginx:latest porte: – “80:80” volumi: – /docker/nginx-config/:/etc/nginx/Advertisement

Puoi leggere Docker's La documentazione completa di 8217 sull'utilizzo dei volumi con Compose se il tuo caso d'uso richiede qualcosa di più specifico di questo.

Trasferimento di volumi Docker

I volumi Docker sono solo cartelle create automaticamente e archiviate in /var/lib/docker/volumes/, con ogni volume archiviato in ./volumename/_data/. Per eseguire il backup e il ripristino, puoi semplicemente eseguire il backup di questi volumi direttamente.

Se invece desideri utilizzare Docker CLI, purtroppo non forniscono un modo semplice per farlo. Per eseguire il backup dei volumi di un contenitore, avrai bisogno del nome del contenitore e della posizione di montaggio in cui sono archiviati i dati.

Il modo per farlo è un po' di un hack—dovrai eseguire un comando in un nuovo contenitore Docker, associare il montaggio della directory della shell corrente, montare il volume su quel contenitore, quindi tar la directory in un backup. Ti ritroverai con un backup.tar del volume:

docker run –rm –volumes-from containername -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar/mountlocation

Quindi, allo stesso modo, puoi estrarre l'archivio nella directory di destinazione:

docker run –rm –volumes-from containername -v $(pwd):/backup ubuntu bash -c “cd /mountlocation && tar xvf /backup/backup.tar –strip 1”

Questo è comunque meglio che dover conoscere la posizione dell'host, quindi puoi automatizzarlo se lo desideri.