Polarys
Docker & conteneurs/Conteneurs et stockage

Conteneurs et stockage

Volumes et persistance des données

Volumes et persistance des données

Par défaut, les données dans un conteneur sont éphémères. Les volumes et bind mounts permettent de persister les données au-delà du cycle de vie d'un conteneur.

Trois mécanismes de stockage

graph TD
    C[Conteneur]
    V[Volume Docker
/var/lib/docker/volumes/]
    B[Bind Mount
Dossier hôte]
    T[tmpfs Mount
RAM uniquement]
    C -->|volume| V
    C -->|bind| B
    C -->|tmpfs| T

Volumes Docker (recommandé en production)

# Créer un volume
docker volume create mes-donnees

# Lister les volumes
docker volume ls

# Inspecter un volume
docker volume inspect mes-donnees

# Utiliser un volume dans un conteneur
docker run -d -v mes-donnees:/var/lib/mysql mysql:8

# Supprimer un volume (données perdues !)
docker volume rm mes-donnees

# Nettoyer les volumes inutilisés
docker volume prune

Avantages : géré par Docker, portable, permissions correctes, sauvegardable.

Bind mounts (développement)

# Monter un dossier local dans le conteneur
# Syntaxe -v : chemin-absolu-hôte:chemin-conteneur
docker run -d -v /home/user/monapp:/app -p 8080:8000 mon-app

# Syntaxe --mount (plus explicite)
docker run -d --mount type=bind,source=/home/user/monapp,target=/app mon-app

Usage typique : développement : les modifications du code local sont immédiatement visibles dans le conteneur sans rebuild.

Cas concret : base de données persistante

# Volume pour les données MySQL
docker volume create mysql-data

# Lancer MySQL avec persistance
docker run -d   --name mysql-prod   -e MYSQL_ROOT_PASSWORD=secret   -e MYSQL_DATABASE=appdb   -v mysql-data:/var/lib/mysql   -p 3306:3306   mysql:8.0

# Arrêter et relancer → données toujours là
docker stop mysql-prod
docker rm mysql-prod
docker run -d --name mysql-prod -v mysql-data:/var/lib/mysql -p 3306:3306 mysql:8.0
# Les données appdb sont intactes

Sauvegarder et restaurer un volume

# Sauvegarder un volume dans une archive tar
docker run --rm   -v mysql-data:/data   -v $(pwd):/backup   ubuntu tar czf /backup/mysql-backup.tar.gz /data

# Restaurer
docker run --rm   -v mysql-data:/data   -v $(pwd):/backup   ubuntu tar xzf /backup/mysql-backup.tar.gz -C /

Erreurs fréquentes

  • Bind mount avec chemin relatif : -v ./data:/app/data ne fonctionne pas sur toutes les plateformes. Utiliser un chemin absolu ou $(pwd)/data.
  • Permissions sur les bind mounts : le conteneur peut tourner avec un UID différent de l'hôte. Les fichiers créés par le conteneur peuvent appartenir à root sur l'hôte.
  • Supprimer un conteneur avec ses données : docker rm ne supprime pas les volumes nommés. Mais les données anonymes (créées par -v /chemin sans nom) sont supprimées avec docker rm -v.

À retenir

  • Volumes Docker → production (géré par Docker, portable).
  • Bind mounts → développement (code local reflété dans le conteneur).
  • docker volume prune → nettoyer les volumes orphelins.
  • Sauvegarder les volumes avant docker rm sur une base de données.

Quiz de validation

Quiz - 2 questions

1. Quelle est la différence principale entre un volume Docker et un bind mount ?

2. Que se passe-t-il aux données d'un volume nommé quand on fait docker rm sur le conteneur ?

Suis ta progression

Crée un compte gratuit pour suivre ta progression et accéder à toutes les leçons.