saverioriotto.it

Cosa sono i volumi Docker e come utilizzarli

Per impostazione predefinita, i container Docker sono completamente senza stato. I dati archiviati nel container sono effimeri e verranno cancellati alla chiusura dello stesso. Questo ovviamente non è l'ideale per molte applicazioni, quindi vediamo come Docker fornisce degli strumenti per ovviare questa situazione.

Cosa sono i volumi Docker e come utilizzarli

Cosa sono i volumi?

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

I volumi sono come i dischi rigidi virtuali gestiti da Docker. Docker gestisce la memorizzazione su disco (di solito in /var/lib/docker/volumes/) e fornisce loro un nome singolo facilmente reperibile anziché il percorso di una directory. Sono semplici da creare e rimuoverli utilizzando la Docker CLI.

Questi hanno alcuni altri vantaggi oltre ad essere gestiti da Docker. Possono essere condivisi in modo più sicuro tra più container e i driver del volume consentono ai provider cloud di fornire un hosting remoto per i dati sottostanti. Nel complesso, i volumi sono più facili da usare rispetto ai montaggi ad associazione e sono consigliati da Docker.

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 senza vincolarli al server di frontend.

Come vengono applicati

Puoi creare un nuovo volume con il seguente comando:

volume docker create nginx-config

E poi, quando vai a eseguire il tuo container Docker, collegalo alla destinazione nel container con il --mount flag:

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

Se esegui docker inspect, vedrai il volume elencato nella sezione di Mounts.

Se stai utilizzando Docker Compose, anche la configurazione è semplice. Aggiungi semplicemente una voce volumes per ogni container che hai, quindi mappa un nome di volume a una posizione nel guest. Potrai anche fornire un elenco di volumi in una volumes chiave di primo livello per il provisioning di Compose.

versione:  "3.0"
services:
  web:
    image: nginx:latest
    port:
      - "80:80"
    volumes:
      - nginx-config:/etc/nginx/
volumes:
  nginx-config:

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

volumes:
  cms-content:
    external: true

Se invece desideri semplicemente eseguire 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"
services:
  web:
    image: nginx:latest
    port:
      - "80:80"
    volumes:
      - /docker/nginx-config/:/etc/nginx/

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 diretto di questi volumi.

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

Il modo per farlo è un po' un trucco: dovrai eseguire un comando in un nuovo container Docker, associare il montaggio della directory della shell corrente, montare il volume su quel container, quindi tar della directory in backup. Finirai 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 se desideri puoi anche automatizzarlo.




Commenti
* Obbligatorio