Travailler avec les volumes Docker

DockerBeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous apprendrez à gérer les données au sein des conteneurs Docker à l'aide des volumes. Les volumes Docker constituent le mécanisme privilégié pour assurer la persistance des données générées et utilisées par les conteneurs. Ce laboratoire vous guidera à travers les différents aspects des volumes Docker, notamment leur création, leur gestion, le partage de données, ainsi que les procédures de sauvegarde et de restauration. À l'issue de cet atelier, vous disposerez d'une compréhension solide pour gérer efficacement les données dans vos environnements Docker.

Comprendre les options de stockage Docker

Avant de plonger dans l'utilisation des volumes, il est essentiel de comprendre les différentes options de stockage proposées par Docker. Docker offre trois solutions principales pour stocker vos données :

  1. Les volumes : Le mécanisme recommandé pour la persistance des données.
  2. Les montages liés (bind mounts) : Ils connectent un chemin spécifique de la machine hôte à un conteneur.
  3. Les montages tmpfs : Ils stockent les données temporairement dans la mémoire vive (RAM) de l'hôte.

Dans cet atelier, nous nous concentrerons principalement sur les volumes, car ils représentent l'option la plus flexible et la plus conseillée pour la gestion des données sous Docker.

Commençons par lister les volumes actuellement présents sur votre système :

docker volume ls

Vous verrez un résultat semblable à celui-ci :

DRIVER    VOLUME NAME
local     jenkins-data

Cette commande affiche tous les volumes Docker de votre système. Le résultat indique le pilote du volume (généralement "local") et son nom. Il est possible que vous voyiez des volumes existants ou que la liste soit vide si vous n'en avez pas encore créé.

Ne vous inquiétez pas si les noms diffèrent ou si la liste est vide. C'est tout à fait normal et cela dépend de vos activités précédentes avec Docker sur cette machine.

Création et gestion de volumes nommés

À présent, créons un nouveau volume nommé. Un volume nommé est un volume que vous créez explicitement en lui attribuant un nom spécifique, ce qui facilite sa gestion et son utilisation ultérieure.

Exécutez cette commande pour créer un nouveau volume :

docker volume create my_data

Cette commande génère un volume intitulé my_data. Docker s'occupe de tous les détails techniques concernant l'emplacement et la méthode de stockage de ce volume sur votre système hôte.

Vérifions que le volume a bien été créé :

docker volume ls

Vous devriez maintenant voir my_data apparaître dans la liste.

Pour obtenir des informations plus détaillées sur ce volume, nous pouvons utiliser la commande d'inspection :

docker volume inspect my_data

Le résultat ressemblera à ceci :

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

Ce compte-rendu nous apporte plusieurs précisions :

  • La date de création.
  • Le pilote utilisé (ici, "local").
  • Le point de montage (l'endroit réel où les données sont stockées sur votre machine hôte).
  • Le nom que nous lui avons donné.

Il n'est pas nécessaire de comprendre tous ces détails immédiatement. Les éléments les plus importants pour nous sont le nom (Name) et le point de montage (Mountpoint).

Utilisation des volumes avec les conteneurs

Maintenant que nous avons un volume, utilisons-le avec un conteneur. Nous allons lancer un nouveau conteneur et y monter notre volume.

Exécutez la commande suivante :

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

Analysons cette commande :

  • docker run : Indique à Docker de lancer un nouveau conteneur.
  • -d : Lance le conteneur en mode détaché (en arrière-plan).
  • --name my_container : Attribue un nom à notre conteneur pour le manipuler plus facilement.
  • -v my_data:/app/data : Monte notre volume my_data dans le répertoire /app/data à l'intérieur du conteneur.
  • ubuntu:latest : L'image utilisée pour le conteneur.
  • sleep infinity : La commande exécutée par le conteneur pour qu'il reste actif indéfiniment.

Notre conteneur tourne désormais avec le volume monté. Créons quelques données à l'intérieur de ce volume :

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

Cette commande effectue les actions suivantes :

  • docker exec : Permet d'exécuter une commande dans un conteneur en cours d'exécution.
  • my_container : Le nom de notre conteneur cible.
  • sh -c "..." : Exécute une commande shell à l'intérieur du conteneur.
  • La commande réelle crée un fichier test.txt dans notre volume avec le texte "Hello from Docker volume".

Pour vérifier que les données ont bien été écrites, nous pouvons lire le fichier :

docker exec my_container cat /app/data/test.txt

Le message "Hello from Docker volume" devrait s'afficher dans votre console.

Partage de données entre conteneurs

L'un des grands avantages des volumes Docker est la possibilité de partager des données entre plusieurs conteneurs. Créons un second conteneur utilisant le même volume :

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

Cette commande est très proche de la précédente, mais nous donnons au conteneur un nom différent et nous montons le volume sur un chemin interne différent.

Vérifions maintenant que ce nouveau conteneur peut accéder aux données créées précédemment :

docker exec another_container cat /app/shared_data/test.txt

Vous devriez voir le même message "Hello from Docker volume". Cela prouve que les deux conteneurs accèdent bien à la même source de données.

Ajoutons de nouvelles données depuis ce second conteneur :

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

Cette commande ajoute une ligne supplémentaire à notre fichier test.txt.

Désormais, si nous vérifions le contenu du fichier depuis n'importe lequel des deux conteneurs, nous devrions voir les deux lignes :

docker exec my_container cat /app/data/test.txt

Le résultat affichera à la fois "Hello from Docker volume" et "Data from another container".

Cela démontre comment les volumes Docker facilitent le partage d'informations entre conteneurs, une fonctionnalité indispensable pour de nombreuses applications.

Sauvegarde et restauration de volumes

Savoir sauvegarder et restaurer des volumes Docker est crucial pour la sécurité de vos données. Voici comment procéder :

Tout d'abord, nous devons arrêter et supprimer les conteneurs qui utilisent le volume, car il est impossible de manipuler ou supprimer un volume en cours d'utilisation :

docker stop my_container another_container
docker rm my_container another_container

Créons maintenant une sauvegarde de notre volume :

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source .

Cette commande peut paraître complexe, détaillons-la :

  • docker run --rm : Lance un conteneur temporaire qui sera supprimé après exécution.
  • -v my_data:/source:ro : Monte notre volume en mode lecture seule (ro) dans le conteneur.
  • -v $(pwd):/backup : Monte le répertoire actuel de l'hôte dans /backup dans le conteneur.
  • ubuntu : Utilise l'image Ubuntu.
  • tar cvf /backup/my_data_backup.tar -C /source . : Crée une archive compressée (tar) des données du volume.

Maintenant, supprimons notre volume d'origine :

docker volume rm my_data

Pour restaurer les données, nous allons créer un nouveau volume et y extraire le contenu de notre sauvegarde :

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

Ceci crée un nouveau volume et y décompresse notre archive.

Vérifions enfin que les données ont bien été restaurées :

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

Vous devriez retrouver le contenu du fichier que nous avions créé au début.

Résumé

Dans cet atelier, vous avez appris à manipuler les volumes Docker. Vous avez créé et géré des volumes nommés, utilisé ces volumes avec des conteneurs, partagé des données entre plusieurs instances et effectué des opérations de sauvegarde et de restauration. Ces compétences sont fondamentales pour une gestion efficace des données dans les environnements Docker.

Points clés à retenir :

  • Les volumes Docker offrent une méthode flexible et performante pour gérer la persistance des données.
  • Les volumes peuvent être facilement créés, inspectés et supprimés via l'interface de ligne de commande (CLI) Docker.
  • Les données stockées dans les volumes peuvent être partagées entre plusieurs conteneurs simultanément.
  • La sauvegarde et la restauration des volumes sont essentielles pour la pérennité des données et peuvent être réalisées à l'aide de commandes Linux standards.

Tout au long de votre progression avec Docker, gardez à l'esprit que la persistance et la gestion des données sont des aspects critiques de vos applications conteneurisées. Prévoyez toujours des plans de sauvegarde et de récupération, en particulier pour vos environnements de production.