GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come archiviare i dati del contenitore Docker nei volumi Docker

Un'opzione per automatizzare un contenitore con i dati è 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 aumentati. Un'opzione migliore è archiviare una copia dei dati in un volume Docker e quindi condividere quel volume tra i contenitori.

Puoi pensare a un volume Docker come a una cartella che esiste al di fuori del file system del contenitore ma è comunque 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 filesystem host sottostante e lo inizializzerà con i dati specificati.

Dopo aver 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 contenitori.

Ad esempio, se si dispone di un'applicazione Web eseguita in un container, è possibile utilizzare un volume per archiviare il codice sorgente dell'applicazione in modo che gli altri container della distribuzione possano accedervi. Ciò ti 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 contenitori, puoi anche utilizzare i volumi per rendere persistenti i dati quando interrompi e avvii i contenitori. Questo è un ottimo modo per proteggere i tuoi dati anche se i tuoi contenitori vengono eliminati o interrotti 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. Successivamente, 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 basi dell'utilizzo dei contenitori 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
  • Hai Docker installato sull'host Linux.

Scoperta di volumi Docker anonimi

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

1. Esegui il comando seguente per verificare se la finestra mobile è in esecuzione e attiva.

sudo systemctl status docker

2. Esegui il comando seguente per aggiungere il tuo 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 comando seguente per trasferire 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 comando seguente 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à scollegata 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. Usa l'immagine postgres:12.1 qui poiché Postgres ha bisogno di volumi di sfondo per memorizzare i suoi dati. Dovresti eseguire due container, uno per ciascuno dei tuoi database Postgres per una buona misura e più informazioni da vedere.

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

7. Esegui il comando Docker sottostante per elencare i contenitori attualmente in esecuzione sul tuo host.

docker ps

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

8. Ora, elenca 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 suoi dati, quindi Postgres crea automaticamente volumi anonimi. I volumi sono denominati con una stringa casuale di caratteri esadecimali aggiunti (e9f338... e  ee3423... ).

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

9. Esegui il comando seguente per ottenere maggiori informazioni sul contenitore db1 in un formato leggibile dall'uomo.

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

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

10. Fai lo stesso per ispezionare il db2 contenitore.

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

Vedrai che l'output è esattamente lo stesso di db1 container, 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 contenitori:db1 , db2, e dbTmp attivo e funzionante

docker ps

12. Elenca di nuovo i volumi.

docker volume ls

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

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

docker stop db2 dbTmp

13. Elenca 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 è scomparso ma il volume per il contenitore db2(ee3423... ) è ancora lì.

Questo comportamento è previsto. Il flag --rm elimina il contenitore dopo che è stato interrotto, insieme a tutti i volumi associati. Il volume per il contenitore dbTmp è scomparso perché abbiamo interrotto il contenitore dbTemp. Poiché non abbiamo specificato il flag --rm quando abbiamo creato il contenitore db2, il contenitore db2 e il volume associato rimangono sull'host anche se fermiamo il contenitore. Il risultato di questo esempio è che devi stare attento con il flag --rm. Se interrompi 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 di creazione volume Docker. Utilizzerai quindi il volume per archiviare dati o per condividere dati tra contenitori.

1. Esegui il comando seguente 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 il codice del sito Web da GitHub nella directory di lavoro corrente.

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. Esegui 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 allegare ad esso il volume del sito web. Utilizzare il flag -v (volume) per montare il volume. Utilizzare il flag -p (mappatura porta) per mappare una porta sull'host a una porta nel contenitore. 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. Esegui 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 della macchina 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 ferma il contenitore webTmp ed elenca i volumi.

docker stop webTmp

volume della finestra mobile ls

Come ricorderete all'inizio di questo articolo, quando si arresta 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 cosa è successo?

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

Come 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 utilizzando un volume, è meglio rimuoverlo dal sistema per liberare spazio su disco. Fortunatamente, Docker offre tutti gli strumenti necessari per rimuovere i volumi inutilizzati dal tuo sistema.

1. Eseguire il comando docker volume prune per rimuovere le risorse sospese (immagini, reti, volumi e contenitori). Una risorsa pendente è un oggetto Docker non attualmente associato a un contenitore. Ma prima di rimuovere un volume, assicurati che nessun contenitore lo stia utilizzando. Ad esempio, devi 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 vedrai che il volume db2 è sparito.

docker volume ls

3. Esegui quanto segue per trovare la posizione dei dati sul 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 sul 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. Puoi utilizzare il comando tar per eseguire il backup dei contenuti del volume del tuo 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 l'autorizzazione per 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. Esegui 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. Spostarsi nella directory del volume e rimuovere tutti i dati del sito Web.

9. Elenca il contenuto della directory per vedere che i dati del sito web sono spariti.

ls -l

10. Eseguire 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. Elenca 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 volume della finestra mobile.

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 della finestra mobile per evitare la perdita di dati in caso di emergenza.

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


Docker
  1. Come installare WordPress utilizzando Docker

  2. Come costruire il contenitore Docker Anaconda Python Data Science

  3. Come eseguire MySQL in un contenitore Docker

  4. Come SSH in un contenitore Docker

  5. Come elencare i contenitori Docker

Cos'è Docker? Come funziona?

Come eseguire PHPMyAdmin in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come creare volumi Docker su Windows in modo semplice

Come configurare un container Docker Apache

Come eseguire i contenitori Docker