Ricerca nel sito web

Come archiviare i dati del contenitore Docker nei volumi Docker


Un'opzione per automatizzare un contenitore con i dati consiste nell'archiviare i dati all'interno dell'immagine del contenitore. Tuttavia, ciò richiede che una copia dei dati si trovi in ogni contenitore eseguito, il che può comportare uno spreco di risorse se i contenitori vengono ridimensionati. Un'opzione migliore consiste nell'archiviare una copia dei dati in un volume Docker e quindi condividere tale volume tra i contenitori.

Puoi pensare a un volume Docker come a una cartella che esiste al di fuori del filesystem del contenitore ma è ancora accessibile dai contenitori in esecuzione sullo stesso host. Quando crei un nuovo contenitore, puoi montare un volume esistente o crearne uno nuovo. Se crei un nuovo volume, Docker creerà automaticamente un nuovo livello di archiviazione sul file system host sottostante e lo inizializzerà con i dati specificati.

Una volta creato un volume, è possibile utilizzarlo per archiviare qualsiasi tipo di dati, inclusi file statici, dati dell'applicazione o registri. Puoi anche utilizzare i volumi per condividere i dati tra i contenitori.

Ad esempio, se disponi di un'applicazione Web che viene eseguita in un contenitore, puoi utilizzare un volume per archiviare il codice sorgente delle applicazioni in modo che gli altri contenitori nella tua distribuzione possano accedervi. Ciò consente di mantenere il codice sorgente dell'applicazione separato dall'ambiente di runtime, semplificando l'aggiornamento e la ridistribuzione dell'applicazione.

Oltre a condividere i dati tra container, puoi anche utilizzare i volumi per rendere persistenti i dati quando interrompi e avvii i container. Questo è un ottimo modo per mantenere i tuoi dati al sicuro anche se i tuoi contenitori vengono eliminati o arrestati accidentalmente.

In questa guida imparerai come i volumi Docker interagiscono con i container. Lo farai creando nuovi contenitori e utilizzando i volumi per archiviare e condividere i dati tra di loro. Quindi, scoprirai come liberare lo spazio lasciato da volumi anonimi generati automaticamente dai contenitori. Infine, imparerai come eseguire il backup dei dati dei volumi Docker.

Iniziamo!

Prerequisiti

  • Per seguire questa guida, dovresti avere familiarità con le nozioni di base per lavorare con i container Docker.
  • Questa guida presuppone che tu stia utilizzando un host Linux. Questa guida utilizza CentOS, ma gli stessi passaggi dovrebbero funzionare su qualsiasi altra distribuzione Linux.
  • Devi avere Docker installato e in esecuzione sul tuo host. Se non l'hai ancora installato, segui le istruzioni nella nostra Guida all'installazione.
  • Un account utente con privilegi di root
  • Docker è installato sull'host Linux.

Alla scoperta di volumi Docker anonimi

Quando crei un nuovo contenitore Docker, per impostazione predefinita viene creato un nuovo volume anonimo nel file system host. Questo volume viene utilizzato per archiviare i dati richiesti dal contenitore.

1. Eseguire il seguente comando per verificare se docker è in esecuzione e attivo.

sudo systemctl status docker

2. Eseguire il seguente comando per aggiungere il proprio account utente al gruppo docker in modo da poter eseguire i comandi docker senza utilizzare sudo. Dopo aver aggiunto il tuo account utente al gruppo docker, disconnettiti e riconnettiti in modo che le modifiche abbiano effetto.

sudo usermod -aG docker $(whoami)

3. Esegui il seguente comando per eseguire il pull di alcune immagini dal registro Docker al tuo host. Utilizzerai queste immagini per esercitarti a creare e lavorare con i volumi Docker.

docker pull postgres:12.1
docker pull bash 
docker pull httpd:2.4

4. Esegui il seguente comando per elencare le immagini attualmente presenti sul tuo host per verificare che le immagini siano state estratte.

docker images

5. Esegui il seguente comando per vedere se sono presenti volumi attivi sul tuo host. Dovresti vedere un output simile al seguente.

docker volume ls

Dovresti vedere un output vuoto.

6. Eseguire il seguente comando per creare un nuovo contenitore e verificare che sia stato creato un nuovo volume anonimo sull'host. Utilizzare il flag -d per eseguire il contenitore in modalità dissociata in modo da poter continuare a lavorare nel terminale. Si utilizza il flag --name per assegnare un nome al contenitore in modo da poterlo identificare facilmente. Qui usi l'immagine postgres:12.1 poiché Postgres ha bisogno di volumi in background per archiviare i suoi dati. Dovresti eseguire due contenitori, uno per ciascuno dei tuoi database Postgres per buona misura e ulteriori informazioni da vedere.

docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1

7. Esegui il comando docker seguente per elencare i contenitori attualmente in esecuzione sul tuo host.

docker ps

Ora hai due contenitori attivi: db1 e db2, come mostrato di seguito.

8. Elenca ora i volumi che sono stati creati sull'host.

docker volume ls

Vedrai un output simile al seguente. Una volta avviato, Postgres ha bisogno di un posto dove archiviare i suoi dati. Postgres non vuole perdere i propri dati, quindi Postgres crea automaticamente volumi anonimi. I volumi sono denominati con una stringa casuale di caratteri esadecimali aggiunta (e9f338... e  ee3423...).

Diamo un'occhiata più da vicino ai volumi utilizzando il comando docker inspect.

9. Eseguire il comando seguente per ottenere maggiori informazioni sul contenitore db1 in un formato leggibile.

docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool

Come puoi vedere di seguito, la riga e9f338 Nome corrisponde all'output dell'output del comando docker volume ls sopra. Questa riga indica che questo volume è associato e montato con il contenitore db1.

10. Fai lo stesso per ispezionare il contenitore db2.

docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool

Vedrai che l'output è esattamente lo stesso del contenitore db1, ad eccezione del nome del volume che sarà diverso. Questo output conferma che Docker crea un nuovo volume anonimo per ogni contenitore creato.

11. Eseguire un altro contenitore. Ma questa volta useremo il flag --rm e vedremo cosa succede con i volumi. Abbiamo chiamato questo contenitore dbTmp. Scopriamolo!

docker run -d --rm --name dbTmp postgres:12.1

Ora abbiamo tre container: db1, db2, e dbTmp attivi e funzionanti

docker ps

12. Elenca nuovamente i volumi.

docker volume ls

Noterai che è stato creato un terzo volume per il dbTmp contenitore.

13. Ora, arresta db2 insieme al contenitore dbTmp con il comando seguente.

finestra mobile arresta db2 dbTmp

13. Elencare nuovamente i contenitori ei volumi.

docker ps

docker volume ls

Come mostrato di seguito, l'unico contenitore rimasto in esecuzione è il contenitore db1. Tuttavia, il volume per il contenitore dbTemp ora è sparito ma il volume per il contenitore db2 (ee3423...) è ancora presente.

Questo comportamento è previsto. Il flag --rm elimina il contenitore dopo che è stato arrestato, insieme a tutti i volumi associati. Il volume per il contenitore dbTmp è andato perché abbiamo arrestato il contenitore dbTemp. Poiché non abbiamo specificato il flag --rm quando abbiamo creato il contenitore db2, il contenitore db2 e il relativo volume associato rimangono sull'host anche se interrompiamo il contenitore. Il risultato di questo esempio è che devi stare attento con il flag --rm. Se arresti un contenitore a cui è associato un volume, il volume verrà eliminato.

Creazione di un volume Docker

Un volume Docker è un contenitore di archiviazione denominato creato utilizzando il comando docker volume create. Utilizzerai quindi il volume per archiviare i dati o per condividere i dati tra i contenitori.

1. Eseguire il seguente comando per creare un nuovo volume denominato website.

docker volume create website

2. Elenca i volumi, puoi vedere il nuovo volume che hai appena creato.

docker volume ls

3. Scarica questo codice del sito web da GitHub nella tua attuale directory di lavoro.

4.  Esegui il comando seguente per copiare il codice del sito web appena scaricato nel volume del sito web.

sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/

5. Eseguire il comando seguente per elencare i file nel volume del sito Web.

sudo ls -l /var/lib/docker/volumes/website/_data/ 

Puoi vedere che il codice del sito web è ora memorizzato nel volume del sito web.

6. Ora puoi avviare un nuovo contenitore e collegarvi il volume del sito web. Utilizzare il flag -v (volume) per montare il volume. Utilizzare il flag -p (port mapping) per mappare una porta sull'host a una porta nel container. In questo esempio, stiamo mappando la porta 80 sull'host alla porta 80 nel container. Web1 è il nome del contenitore.

docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4

7. Il sito Web verrà ora servito dal contenitore web1. Eseguire il comando docker ps per controllare lo stato del contenitore web1. Puoi vedere che il sito web viene servito dal contenitore web1. Puoi anche vedere la porta su cui viene servito il sito Web (80) come mostrato di seguito.

8. Puoi aprire l'indirizzo IP del computer host sul tuo browser web per vedere il sito web che hai appena copiato.

9. Ora esegui un altro contenitore chiamato webTmp questa volta con il flag --rm per vedere cosa succede al volume del sito web quando interrompi il contenitore webTmp.

docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4

10. Eseguire un comando docker ps show per verificare che il contenitore webTmp sia in esecuzione.

docker ps 

11. Ora arrestare il contenitore webTmp ed elencare i volumi.

docker stop webTmp

volume docker ls

Come ricorderai all'inizio di questo articolo, quando arresti un contenitore, vengono eliminati anche i volumi associati. Ma questa volta, come mostrato di seguito, puoi vedere che il volume del sito web è ancora lì. Allora, cos'è successo?

Il punto chiave in questo esempio è che quando si arresta un contenitore, i dati nei volumi associati a quel contenitore non vengono eliminati finché i volumi vengono utilizzati da un altro contenitore. In questo caso, il volume del sito web è ancora utilizzato dal contenitore web1. Questo è un punto molto importante da ricordare quando si lavora con i volumi Docker.

Sbarazzarsi dei volumi inutilizzati

Sebbene i volumi siano un ottimo modo per archiviare i dati e mantenerli organizzati, possono anche occupare molto spazio su disco se non vengono utilizzati. Se non stai usando un volume, è meglio rimuoverlo dal tuo sistema per liberare spazio su disco. Fortunatamente, Docker offre tutti gli strumenti necessari per rimuovere i volumi inutilizzati dal sistema.

1. Eseguire il comando docker volume prune per rimuovere le risorse penzolanti (immagini, reti, volumi e contenitori). Una risorsa pendente è un oggetto Docker attualmente non associato a un contenitore. Ma prima di rimuovere un volume, assicurati che nessun contenitore lo stia utilizzando. Ad esempio, è necessario rimuovere il contenitore db2 prima di poter rimuovere i volumi inutilizzati ad esso associati.

docker stop db2
docker rm db2
docker volume prune

2. Elenca i volumi e puoi vedere che il volume db2 ora è sparito.

docker volume ls

3. Esegui quanto segue per trovare la posizione dei dati del volume per il tuo sito Web in modo da poterne eseguire il backup.

docker volume inspect website

Vedrai il punto di montaggio per il tuo sito web. Il punto di montaggio è la directory nel sistema operativo host in cui è montato il volume docker. In questo esempio, il punto di montaggio è /var/lib/docker/volumes/website/_data, come mostrato di seguito.

4. È possibile utilizzare il comando tar per eseguire il backup del contenuto del volume del sito Web. È in circolazione da molto tempo ed è supportato sulla maggior parte delle piattaforme. Il comando tar può essere utilizzato per eseguire il backup di una directory, incluse tutte le sue sottodirectory e file.

Nota: DEVI eseguire questo comando come utente root, altrimenti non avrai il permesso di scrivere sul volume docker montato, come mostrato di seguito.

tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .

5. Eseguire il comando seguente per verificare che il file di backup tar sia stato creato correttamente.

ls -l /tmp/website_*.tgz

6. Eseguire il comando seguente per verificare che il file di backup contenga i dati corretti. Sostituisci YOUR_BACKUP_FILE_NAME con il nome effettivo del tuo file di backup.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

7. Ora eseguiamo un altro contenitore utilizzando il volume del sito web. Questa volta utilizzerai il flag -it per interagire con il contenitore per testare il backup.

docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .

8. Spostati nella directory del volume e rimuovi tutti i dati del sito web.

9. Elenca il contenuto della directory per verificare che i dati del sito web siano spariti.

ls -l

10. Esegui il comando seguente per ripristinare i dati del sito web. Sostituisci con il nome effettivo del tuo file di backup.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. Elencare il contenuto della directory per verificare che i dati del sito Web siano stati ripristinati.

ls -l

Conclusione

In questa guida, hai imparato come creare, eseguire il backup di un volume docker e ripristinare i dati. Hai anche imparato dove trovare il punto di montaggio per il tuo volume docker.

Docker ha guadagnato molta popolarità di recente perché semplifica la distribuzione delle applicazioni. Tuttavia, da un grande potere derivano grandi responsabilità. È importante eseguire il backup dei volumi docker per prevenire la perdita di dati in caso di emergenza.

C'è molto da imparare su Docker. Se vuoi dare uno sguardo più approfondito a Docker, ti suggeriamo di consultare la sua documentazione, dove troverai tutte le informazioni necessarie per iniziare a utilizzare docker.