GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment stocker les données du conteneur Docker dans les volumes Docker

Une option pour automatiser un conteneur avec des données consiste à stocker les données dans l'image du conteneur. Cependant, cela nécessite une copie des données dans chaque conteneur que vous exécutez, ce qui peut entraîner un gaspillage de ressources si les conteneurs sont mis à l'échelle. Une meilleure option consiste à stocker une copie des données dans un volume Docker, puis à partager ce volume entre les conteneurs.

Vous pouvez considérer un volume Docker comme un dossier qui existe en dehors du système de fichiers du conteneur mais qui est toujours accessible par les conteneurs exécutés sur le même hôte. Lorsque vous créez un nouveau conteneur, vous pouvez soit monter un volume existant, soit en créer un nouveau. Si vous créez un nouveau volume, Docker créera automatiquement une nouvelle couche de stockage sur le système de fichiers hôte sous-jacent et l'initialisera avec les données que vous spécifiez.

Une fois que vous avez créé un volume, vous pouvez l'utiliser pour stocker tout type de données, y compris des fichiers statiques, des données d'application ou des journaux. Vous pouvez également utiliser des volumes pour partager des données entre conteneurs.

Par exemple, si vous avez une application Web qui s'exécute dans un conteneur, vous pouvez utiliser un volume pour stocker le code source de l'application afin que les autres conteneurs de votre déploiement puissent y accéder. Cela vous permet de séparer le code source de votre application de l'environnement d'exécution, ce qui facilite la mise à jour et le redéploiement de votre application.

En plus de partager des données entre conteneurs, vous pouvez également utiliser des volumes pour conserver des données lorsque vous arrêtez et démarrez vos conteneurs. C'est un excellent moyen de protéger vos données même si vos conteneurs sont accidentellement supprimés ou arrêtés.

Dans ce guide, vous apprendrez comment les volumes Docker interagissent avec les conteneurs. Pour ce faire, vous créerez de nouveaux conteneurs et utiliserez des volumes pour stocker et partager des données entre eux. Ensuite, vous découvrirez comment libérer de l'espace laissé par les volumes anonymes générés automatiquement par les conteneurs. Enfin, vous apprendrez à sauvegarder les données de vos volumes Docker.

Commençons !

Prérequis

  • Pour suivre ce guide, vous devez connaître les bases de l'utilisation des conteneurs Docker.
  • Ce guide suppose que vous utilisez un hôte Linux. Ce guide utilise CentOS, mais les mêmes étapes devraient fonctionner sur toute autre distribution Linux.
  • Docker doit être installé et exécuté sur votre hôte. Si vous ne l'avez pas encore installé, suivez les instructions de notre guide d'installation.
  • Un compte utilisateur avec des privilèges root
  • Docker est installé sur l'hôte Linux.

Découvrir des volumes Docker anonymes

Lorsque vous créez un nouveau conteneur Docker, un nouveau volume anonyme est créé par défaut sur le système de fichiers hôte. Ce volume est utilisé pour stocker les données requises par le conteneur.

1. Exécutez la commande suivante pour vérifier si docker est en cours d'exécution et actif.

sudo systemctl status docker

2. Exécutez la commande suivante pour ajouter votre compte d'utilisateur au groupe docker afin de pouvoir exécuter les commandes docker sans utiliser sudo. Une fois que vous avez ajouté votre compte d'utilisateur au groupe docker, déconnectez-vous et reconnectez-vous pour que vos modifications prennent effet.

sudo usermod -aG docker $(whoami)

3. Exécutez la commande suivante pour extraire certaines images du registre Docker vers votre hôte. Vous utiliserez ces images pour vous entraîner à créer et à travailler avec des volumes Docker.

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

4. Exécutez la commande suivante pour répertorier les images qui se trouvent actuellement sur votre hôte afin de vérifier que les images ont été extraites.

docker images

5. Exécutez la commande suivante pour voir s'il existe des volumes actifs sur votre hôte. Vous devriez voir une sortie semblable à la suivante.

docker volume ls

Vous devriez voir une sortie vide.

6. Exécutez la commande suivante pour créer un nouveau conteneur et vérifiez qu'un nouveau volume anonyme a été créé sur l'hôte. Vous utilisez l'indicateur -d pour exécuter le conteneur en mode détaché afin de pouvoir continuer à travailler dans le terminal. Vous utilisez l'indicateur --name pour donner un nom au conteneur afin de pouvoir l'identifier facilement. Vous utilisez l'image postgres:12.1 ici car Postgres a besoin de volumes d'arrière-plan pour stocker ses données. Vous devez exécuter deux conteneurs, un pour chacune de vos bases de données Postgres pour une bonne mesure et plus d'informations à voir.

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

7. Exécutez la commande docker ci-dessous pour répertorier les conteneurs en cours d'exécution sur votre hôte.

docker ps

Vous disposez maintenant de deux conteneurs : db1 et db2, comme indiqué ci-dessous.

8. Maintenant, répertoriez les volumes qui ont été créés sur l'hôte.

docker volume ls

Vous verrez une sortie similaire à la suivante. Une fois que Postgres démarre, il a besoin d'un endroit pour stocker ses données. Postgres ne veut pas perdre ses données, c'est pourquoi Postgres crée automatiquement des volumes anonymes. Les volumes sont nommés avec une chaîne aléatoire de caractères hexadécimaux ajoutés (e9f338... et  ee3423... ).

Regardons de plus près les volumes en utilisant la commande docker inspect.

9. Exécutez la commande ci-dessous pour obtenir plus d'informations sur le conteneur db1 dans un format lisible par l'homme.

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

Comme vous pouvez le voir ci-dessous, le e9f338 Nom correspond à la sortie de la sortie de la commande docker volume ls ci-dessus. Cette ligne vous indique que ce volume est associé et monté avec le db1 conteneur.

10. Faites de même pour inspecter la db2 conteneur.

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

Vous verrez que la sortie est exactement la même que celle de db1 conteneur, sauf pour le nom du volume qui sera différent. Cette sortie confirme que Docker crée un nouveau volume anonyme pour chaque conteneur créé.

11. Exécutez un autre conteneur. Mais cette fois, nous allons utiliser l'indicateur --rm et voir ce qui se passe avec les volumes. Nous avons nommé ce conteneur dbTmp. Découvrons !

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

Nous avons maintenant trois conteneurs :db1 , db2, et dbTmp opérationnel

docker ps

12. Répertoriez les volumes.

docker volume ls

Vous remarquerez qu'un troisième volume a été créé pour le dbTmp conteneur.

13. Maintenant, arrêtez db2 avec le conteneur dbTmp avec la commande ci-dessous.

docker stop db2 dbTmp

13. Listez à nouveau les conteneurs et les volumes.

docker ps

docker volume ls

Comme indiqué ci-dessous, le seul conteneur qui reste en cours d'exécution est le conteneur db1. Cependant, le volume du conteneur dbTemp a maintenant disparu, mais le volume du conteneur db2 (ee3423... ) est toujours là.

Ce comportement est attendu. L'indicateur --rm supprime le conteneur après son arrêt, ainsi que tous les volumes associés. Le volume du conteneur dbTmp a disparu, car nous avons arrêté le conteneur dbTemp. Comme nous n'avons pas spécifié l'indicateur --rm lors de la création du conteneur db2, le conteneur db2 et son volume associé restent sur l'hôte même si nous arrêtons le conteneur. Le point à retenir de cet exemple est que vous devez être prudent avec l'indicateur --rm. Si vous arrêtez un conteneur auquel est associé un volume, le volume sera supprimé.

Création d'un volume Docker

Un volume Docker est un conteneur de stockage nommé que vous créez à l'aide de la commande docker volume create. Vous utiliserez ensuite le volume pour stocker des données ou pour partager des données entre conteneurs.

1. Exécutez la commande suivante pour créer un nouveau volume nommé site Web.

docker volume create website

2. Listez les volumes, vous pouvez voir le nouveau volume que vous venez de créer.

docker volume ls

3. Téléchargez ce code de site Web depuis GitHub dans votre répertoire de travail actuel.

4. Exécutez la commande ci-dessous pour copier le code du site Web que vous venez de télécharger sur le volume du site Web.

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

5. Exécutez la commande ci-dessous pour répertorier les fichiers dans le volume du site Web.

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

Vous pouvez voir que le code du site Web est maintenant stocké dans le volume du site Web.

6. Vous pouvez maintenant démarrer un nouveau conteneur et y attacher le volume du site Web. Vous utilisez l'indicateur -v (volume) pour monter le volume. Vous utilisez l'indicateur -p (mappage de port) pour mapper un port sur l'hôte à un port dans le conteneur. Dans cet exemple, nous mappons le port 80 sur l'hôte au port 80 dans le conteneur. Web1 est le nom du conteneur.

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

7. Le site Web sera désormais servi à partir du conteneur web1. Exécutez la commande docker ps pour vérifier l'état du conteneur web1. Vous pouvez voir que le site Web est servi à partir du conteneur web1. Vous pouvez également voir le port sur lequel le site Web est servi (80), comme indiqué ci-dessous.

8. Vous pouvez ouvrir l'adresse IP de la machine hôte sur votre navigateur Web pour voir le site Web que vous venez de copier.

9. Maintenant, exécutez un autre conteneur nommé webTmp cette fois avec l'indicateur --rm pour voir ce qui arrive au volume du site Web lorsque vous arrêtez le conteneur webTmp.

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

10. Exécutez une commande docker ps show pour vérifier que le conteneur webTmp est en cours d'exécution.

docker ps 

11. Arrêtez maintenant le conteneur webTmp et répertoriez les volumes.

docker stop webTmp

volume docker ls

Comme vous vous en souvenez au début de cet article, lorsque vous arrêtez un conteneur, les volumes associés sont également supprimés. Mais cette fois, comme indiqué ci-dessous, vous pouvez voir que le volume du site Web est toujours là. Alors que s'est-il passé ?

La principale conclusion de cet exemple est que lorsque vous arrêtez un conteneur, les données des volumes associés à ce conteneur ne sont pas supprimées tant que les volumes sont utilisés par un autre conteneur. Dans ce cas, le volume du site Web est toujours utilisé par le conteneur web1. C'est un point très important à retenir lorsque vous travaillez avec des volumes Docker.

Se débarrasser des volumes inutilisés

Bien que les volumes soient un excellent moyen de stocker des données et de les organiser, ils peuvent également occuper beaucoup d'espace disque s'ils ne sont pas utilisés. Si vous n'utilisez pas de volume, il est préférable de le supprimer de votre système pour libérer de l'espace disque. Heureusement, Docker offre tous les outils dont vous avez besoin pour supprimer les volumes inutilisés de votre système.

1. Exécutez la commande docker volume prune pour supprimer les ressources pendantes (images, réseaux, volumes et conteneurs). Une ressource pendante est un objet Docker qui n'est actuellement pas associé à un conteneur. Mais avant de supprimer un volume, assurez-vous qu'aucun conteneur ne l'utilise. Par exemple, vous devez supprimer le conteneur db2 avant de pouvoir supprimer les volumes inutilisés qui lui sont associés.

docker stop db2
docker rm db2
docker volume prune

2. Répertoriez les volumes et vous pouvez voir que le volume db2 a maintenant disparu.

docker volume ls

3. Exécutez ci-dessous pour trouver l'emplacement de vos données de volume pour votre site Web afin de pouvoir les sauvegarder.

docker volume inspect website

Vous verrez le point de montage de votre site Web. Le point de montage est le répertoire de votre système d'exploitation hôte où le volume docker est monté. Dans cet exemple, le point de montage est /var/lib/docker/volumes/website/_data , comme indiqué ci-dessous.

4. Vous pouvez utiliser la commande tar pour sauvegarder le contenu du volume de votre site Web. Il existe depuis longtemps et est pris en charge sur la plupart des plates-formes. La commande tar peut être utilisée pour sauvegarder un répertoire, y compris tous ses sous-répertoires et fichiers.

Remarque  :vous DEVEZ exécuter cette commande en tant qu'utilisateur root, sinon vous ne serez pas autorisé à écrire sur le volume docker monté, comme indiqué ci-dessous.

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

5. Exécutez la commande ci-dessous pour vérifier que le fichier de sauvegarde tar a été créé avec succès.

ls -l /tmp/website_*.tgz

6. Exécutez la commande ci-dessous pour vérifier que le fichier de sauvegarde contient les données correctes. Remplacez YOUR_BACKUP_FILE_NAME par le nom réel de votre fichier de sauvegarde.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

7. Exécutons maintenant un autre conteneur en utilisant le volume du site Web. Cette fois, vous utiliserez l'indicateur -it pour interagir avec le conteneur afin de tester la sauvegarde.

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. Déplacez-vous dans le répertoire du volume et supprimez toutes les données du site Web.

9. Répertoriez le contenu du répertoire pour voir que les données du site Web ont disparu.

ls -l

10. Exécutez la commande ci-dessous pour restaurer les données du site Web. Remplacez par le nom réel de votre fichier de sauvegarde.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. Répertoriez le contenu du répertoire pour vérifier que les données du site Web ont été restaurées.

ls -l

Conclusion

Dans ce guide, vous avez appris à créer, sauvegarder un volume docker et restaurer les données. Vous avez également appris où trouver le point de montage de votre volume docker.

Docker a récemment gagné en popularité car il facilite le déploiement d'applications. Cependant, un grand pouvoir s'accompagne d'une grande responsabilité. Il est important de sauvegarder vos volumes Docker pour éviter la perte de données en cas de sinistre.

Il y a beaucoup à apprendre sur Docker. Si vous souhaitez avoir un aperçu plus approfondi de Docker, nous vous suggérons de consulter sa documentation, où vous trouverez toutes les informations dont vous avez besoin pour être opérationnel avec Docker.


Docker
  1. Comment installer WordPress avec Docker

  2. Comment exécuter une commande sur un conteneur Docker en cours d'exécution

  3. Comment attribuer une adresse IP statique à un conteneur Docker

  4. Comment partager des données entre des conteneurs Docker

  5. Comment répertorier les conteneurs Docker

Qu'est-ce que Docker ? Comment ça marche?

Comment exécuter PHPMyAdmin dans un conteneur Docker

Comment exécuter Grafana dans un conteneur Docker

Comment créer des volumes Docker sous Windows en toute simplicité

Comment configurer un conteneur Apache Docker

Comment exécuter des conteneurs Docker