Gestion des Volumes et Persistance des Données dans Docker

Fondamentaux du Stockage Éphémère et Persistant

Par défaut, les fichiers créés à l'intérieur d'un conteneur sont stockés dans la couche inscriptible (writable layer) du système de fichiers union. Cette couche est strictement liée au cycle de vie du conteneur. Lorsqu'un conteneur est supprimé, ses données sont perdues. Cependant, tant que le conteneur est simplement arrêté et redémarré, les données de cette couche temporaire sont conservées sur l'hôte.

# Démarrage d'un conteneur et création d'un fichier temporaire
docker run -d --name worker_node alpine sleep infinity
docker exec -it worker_node sh -c "echo 'etat_runtime' > /tmp/state.txt"

# Arrêt et redémarrage : le fichier est toujours présent
docker stop worker_node
docker start worker_node
docker exec -it worker_node cat /tmp/state.txt

# Suppression du conteneur : la couche inscriptible et le fichier sont détruits
docker rm -f worker_node

Pour garantir la persistance des données au-delà du cycle de vie du conteneur, Docker propose deux mécanismes principaux : les volumes gérés par le daemon et les montages liés (bind mounts) directs vers le système de fichiers de l'hôte.

Utilisation de l'Option -v

Création de Volumes Anonymes

Lorsque vous spécifiez uniquement un chemin dans le conteneur avec l'option -v, Docker crée automatiquement un volume anonyme. Ce volume est géré par Docker et survit à la suppression du conteneur, mais il est difficile à identifier car son nom est un hash aléatoire.

# Création d'un conteneur avec un volume anonyme pointant vers /var/cache/app
docker run -d --name cache_service -v /var/cache/app alpine sleep infinity

# Inspection des points de montage pour récupérer le chemin hôte
docker inspect cache_service --format '{{json .Mounts}}' | jq

# Les données écrites dans /var/cache/app sont physiquement stockées dans 
# /var/lib/docker/volumes/<hash_id>/_data sur l'hôte

Montages Liés (Bind Mounts) Explicites

En spécifiant à la fois le chemin de l'hôte et celui du conteneur, vous créez un montage lié. Cela permet de mapper directement un répertoire existant de la machine hôte vers le conteneur.

# Montage d'un répertoire hôte vers le conteneur
docker run -d --name web_server -v /srv/http:/usr/share/nginx/html nginx:alpine

# Inspection montrant le type "bind"
docker inspect web_server --format '{{range .Mounts}}{{.Type}}: {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'

Gestion des Volumes Nommés

Pour les données critiques, il est recommandé de créer des volumes nommés en amont. Cela permet de les gérer facilement via l'API Docker et de les sauvegarder.

# Création explicite d'un volume nommé
docker volume create postgres_data

# Association du volume nommé à un conteneur
docker run -d --name db_instance -v postgres_data:/var/lib/postgresql/data postgres:15

# Vérification du montage
docker inspect db_instance --format '{{range .Mounts}}{{.Name}}: {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}'

Le Flag --mount : Une Syntaxe Explicite

L'option --mount offre une syntaxe plus verbeuse mais plus explicite que -v. Elle permet de définir clairement le type, la source, la cible et les options avancées comme le mode lecture seule.

# Exemple combinant un montage lié en lecture seule et un volume nommé
docker run -d \
  --name app_runtime \
  --mount type=bind,source=/etc/app/config,target=/app/config,readonly \
  --mount type=volume,source=app_logs,target=/var/log/app \
  my_custom_image:latest

Règles de Résolution des Conflits de Données

Lors du montage d'un système de fichiers, le comportement d'initialisation diffère radicalement selon qu'il s'agit d'un montage lié ou d'un volume.

Comportement des Montages Liés (Bind Mounts)

Le répertoire de l'hôte dicte toujours l'état initial. Si le répertoire hôte contient des données, elles remplacent complètement le contenu du répertoire cible dans le conteneur. Si le répertoire hôte est vide, le conteneur verra un répertoire vide, masquant ainsi tout fichier préexistant dans l'image du conteneur à cet emplacement.

Comportement des Volumes Nommés et Anonymes

Les volumes gérés par Docker possèdent une logique d'initialisation intelligente :

  • Volume nouvellement créé (vide) : Si le répertoire cible dans l'image du conteneur contient des fichiers par défaut, Docker copie automatiquement ces fichiers dans le volume lors du premier montage.
  • Volume préexistant (avec données) : Si le volume contient déjà des données, le contenu du répertoire de l'image du conteneur est ignoré et masqué. Les données du volume sont montées telles quelles.

Cette logique garantit que les volumes nommés agissent comme un stockage persistant fiable, préservant les données des bases de données ou des configurations entre les redémarrages et les mises à jour d'images.

Étiquettes: Docker volumes bind-mounts data-persistence container-storage

Publié le 10 juillet à 23h52