Le Problème : Les Conteneurs Sont Éphémères

Avant de parler des volumes, vous devez comprendre un concept fondamental : les conteneurs Docker sont Ă©phĂ©mères. Qu’est-ce que cela signifie ?

Imaginez que vous avez un conteneur avec une base de donnĂ©es. Vous insĂ©rez des donnĂ©es, tout fonctionne parfaitement. Puis vous arrĂŞtez le conteneur, vous le redĂ©marrez et… les donnĂ©es ont disparu. Pouf, volatilisĂ©es.

Cela se produit parce que chaque conteneur a son propre système de fichiers isolĂ© qui vit et meurt avec le conteneur lui-mĂŞme. C’est comme Ă©crire sur le sable : dès que la vague arrive, tout disparaĂ®t.

Qu’est-ce qu’un Volume Docker ?

Un volume Docker est un mĂ©canisme pour sauvegarder les donnĂ©es en dehors du conteneur, de sorte qu’elles persistent mĂŞme lorsque le conteneur est arrĂŞtĂ©, redĂ©marrĂ© ou supprimĂ©.

Pensez aux volumes comme Ă  un disque dur externe que vous connectez Ă  votre conteneur. Les donnĂ©es sont Ă©crites sur ce “disque externe” et restent en sĂ©curitĂ© indĂ©pendamment de ce qui arrive au conteneur.

Pourquoi Utiliser les Volumes ?

  • Persistance : les donnĂ©es survivent au cycle de vie du conteneur
  • Partage : plusieurs conteneurs peuvent accĂ©der aux mĂŞmes donnĂ©es
  • Sauvegarde : il est plus facile de faire des sauvegardes des donnĂ©es
  • Performance : les volumes sont optimisĂ©s pour les opĂ©rations I/O
  • PortabilitĂ© : vous pouvez dĂ©placer les donnĂ©es entre diffĂ©rents hĂ´tes

Les Trois Façons de Gérer les Données dans Docker

Docker offre trois approches pour la gestion des données. Voyons-les du plus recommandé au moins.

1. Volumes (Volumes) - Le Choix Recommandé

Les volumes sont entièrement gĂ©rĂ©s par Docker et sauvegardĂ©s dans un rĂ©pertoire spĂ©cial sur l’hĂ´te (/var/lib/docker/volumes/ sur Linux).

1
2
3
4
5
# Créer un volume
docker volume create mon-volume

# Utiliser le volume dans un conteneur
docker run -v mon-volume:/app/data mon-image

Avantages :

  • GĂ©rĂ©s par Docker (faciles Ă  crĂ©er, supprimer, inspecter)
  • Fonctionnent sur Linux, Windows et Mac
  • Peuvent ĂŞtre partagĂ©s entre plusieurs conteneurs
  • Supportent des drivers pour le stockage distant (cloud, NFS, etc.)

2. Bind Mounts - Connexion Directe

Les bind mounts connectent un dossier spécifique de votre ordinateur directement au conteneur.

1
2
# Connecter un dossier local au conteneur
docker run -v /chemin/sur/votre/pc:/app/data mon-image

Quand les utiliser :

  • Pendant le dĂ©veloppement, pour voir les modifications du code en temps rĂ©el
  • Quand vous avez besoin d’accĂ©der Ă  des fichiers spĂ©cifiques du système hĂ´te
  • Pour partager des configurations entre l’hĂ´te et le conteneur

Attention : les bind mounts dĂ©pendent de la structure du système de fichiers de l’hĂ´te, ils sont donc moins portables.

3. tmpfs Mounts - Données Temporaires en Mémoire

Les tmpfs mounts sauvegardent les donnĂ©es dans la RAM de l’hĂ´te, pas sur le disque.

1
docker run --tmpfs /app/temp mon-image

Quand les utiliser :

  • Pour des donnĂ©es sensibles qui ne doivent pas ĂŞtre Ă©crites sur le disque
  • Pour des caches temporaires Ă  hautes performances
  • Les donnĂ©es sont perdues quand le conteneur s’arrĂŞte (et c’est exactement ce que vous voulez)

Commandes Essentielles pour les Volumes

Créer un Volume

1
docker volume create nom-volume

Lister les Volumes

1
docker volume ls

Inspecter un Volume

1
docker volume inspect nom-volume

Cette commande montre oĂą le volume est physiquement sauvegardĂ© et d’autres informations utiles.

Supprimer un Volume

1
2
3
4
5
# Supprimer un volume spécifique
docker volume rm nom-volume

# Supprimer tous les volumes non utilisés
docker volume prune

Attention : supprimer un volume signifie perdre toutes les donnĂ©es contenues. Il n’y a pas de corbeille ni de rĂ©cupĂ©ration.

Exemples Pratiques

Exemple 1 : Base de Données MySQL avec Données Persistantes

Sans volume, chaque fois que vous redémarrez le conteneur MySQL, vous perdez toutes les données. Voici comment résoudre ce problème :

1
2
3
4
5
6
7
8
9
# Créer un volume pour les données MySQL
docker volume create mysql-data

# Démarrer MySQL en utilisant le volume
docker run -d \
  --name mon-mysql \
  -e MYSQL_ROOT_PASSWORD=password123 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

Maintenant, vous pouvez arrêter, redémarrer ou même supprimer et recréer le conteneur : les données de la base de données resteront intactes dans le volume mysql-data.

Exemple 2 : Développement Web avec Bind Mount

Pendant le développement, vous voulez que les modifications du code soient immédiatement visibles dans le conteneur :

1
2
3
4
5
docker run -d \
  --name mon-site \
  -p 8080:80 \
  -v $(pwd)/src:/var/www/html \
  php:apache

Chaque modification des fichiers dans le dossier src sera immédiatement disponible dans le conteneur.

Exemple 3 : Partager des Données entre Conteneurs

Deux conteneurs qui doivent accéder aux mêmes fichiers :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Créer le volume partagé
docker volume create donnees-partagees

# Conteneur qui écrit
docker run -d --name ecrivain -v donnees-partagees:/data alpine \
  sh -c "while true; do date >> /data/log.txt; sleep 5; done"

# Conteneur qui lit
docker run -it --name lecteur -v donnees-partagees:/data alpine \
  tail -f /data/log.txt

Volumes dans Docker Compose

Quand vous utilisez Docker Compose, définir les volumes est encore plus simple :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
  database:
    image: postgres:15
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

  app:
    image: mon-app
    volumes:
      - ./code:/app              # Bind mount pour le développement
      - logs:/app/logs           # Volume pour les logs

volumes:
  postgres-data:    # Volume géré par Docker
  logs:             # Volume géré par Docker

Avec un simple docker-compose up, Docker crée automatiquement les volumes nécessaires.

Sauvegarde et Restauration des Volumes

Faire une Sauvegarde d’un Volume

1
2
3
4
docker run --rm \
  -v nom-volume:/source:ro \
  -v $(pwd):/backup \
  alpine tar czf /backup/backup.tar.gz -C /source .

Cette commande :

  1. Monte le volume en lecture seule (ro)
  2. Crée une archive compressée dans le répertoire actuel

Restaurer une Sauvegarde

1
2
3
4
docker run --rm \
  -v nom-volume:/target \
  -v $(pwd):/backup \
  alpine tar xzf /backup/backup.tar.gz -C /target

Erreurs Courantes à Éviter

1. Oublier d’Utiliser les Volumes pour les Bases de DonnĂ©es

Si vous utilisez une base de données dans Docker sans volume, vous perdrez toutes les données. Toujours.

2. Utiliser les Bind Mounts en Production

Les bind mounts sont excellents pour le développement, mais en production, utilisez les volumes Docker pour plus de portabilité et de sécurité.

3. Ne Pas Faire de Sauvegarde des Volumes

Les volumes ne sont pas automatiquement inclus dans les sauvegardes du système. Planifiez des sauvegardes régulières.

4. Accumuler des Volumes Orphelins

Quand vous supprimez des conteneurs, les volumes restent. Utilisez périodiquement :

1
docker volume prune

Pour supprimer les volumes qui ne sont plus connectés à aucun conteneur.

Quand Utiliser Quoi : Résumé

ScénarioSolution
Base de données en productionVolume Docker
Développement localBind mount
Données sensibles temporairestmpfs
Partage entre conteneursVolume Docker
Fichiers de configurationBind mount ou Volume
Logs d’applicationVolume Docker

Conclusions

Les volumes Docker rĂ©solvent l’un des problèmes fondamentaux des conteneurs : la persistance des donnĂ©es. Sans volumes, les conteneurs ne seraient utiles que pour les applications stateless.

Rappelez-vous les règles d’or :

  • Utilisez toujours des volumes pour les bases de donnĂ©es
  • Utilisez des bind mounts pour le dĂ©veloppement local
  • Faites des sauvegardes rĂ©gulières des volumes importants
  • Nettoyez pĂ©riodiquement les volumes orphelins

Une fois le concept compris, les volumes deviennent aussi naturels que sauvegarder un fichier sur le disque. Et vos données seront enfin en sécurité, indépendamment de ce qui arrive aux conteneurs.