Cas Pratique : Stockage Docker

Dans ce cas pratique, nous allons explorer comment Docker gère le stockage persistant en utilisant deux techniques courantes : les volumes Docker et les bind mounts. Nous allons créer un conteneur qui persiste ses données, même après son arrêt ou sa suppression.

Objectif

  1. Utiliser un volume Docker pour persister les données d’un conteneur.
  2. Utiliser un bind mount pour partager des fichiers entre l’hôte et le conteneur.
  3. Vérifier la persistance des données après la suppression du conteneur.

Utiliser un Volume Docker

Les volumes Docker sont gérés par Docker lui-même et sont stockés dans un répertoire dédié sur l’hôte. Ils permettent de persister des données de manière simple et efficace, tout en étant indépendants du cycle de vie des conteneurs.

Nous allons commencer par lancer un conteneur MySQL en utilisant un volume Docker pour persister les données.

docker run -d \
  --name mysql-volume \
  -e MYSQL_ROOT_PASSWORD=rootpassword \
  -v mysql-data:/var/lib/mysql \
  mysql:latest

Explications :

  • -d : Exécute le conteneur en mode détaché.
  • --name mysql-volume : Donne un nom au conteneur (facilite les interactions).
  • -e MYSQL_ROOT_PASSWORD=rootpassword : Définit une variable d’environnement pour le mot de passe root.
  • -v mysql-data:/var/lib/mysql : Monte un volume nommé mysql-data dans le répertoire /var/lib/mysql, où MySQL stocke ses données.

Docker va créer automatiquement le volume mysql-data. Pour vérifier que le volume a été créé, exécutez la commande suivante :

docker volume ls

Vous devriez voir mysql-data dans la liste des volumes.

Vérifier la Persistance des Données avec le Volume

Nous allons maintenant arrêter et supprimer le conteneur MySQL, puis le relancer pour vérifier que les données sont bien persistées.

  1. Arrêter et supprimer le conteneur :
docker stop mysql-volume
docker rm mysql-volume
  1. Relancer un conteneur avec le même volume :
docker run -d \
  --name mysql-volume \
  -e MYSQL_ROOT_PASSWORD=rootpassword \
  -v mysql-data:/var/lib/mysql \
  mysql:latest

Le conteneur MySQL va redémarrer en utilisant les mêmes données que précédemment, prouvant que le volume a bien persisté les informations de la base de données.

Utiliser un Bind Mount

Un bind mount permet de lier un répertoire spécifique de la machine hôte à un répertoire du conteneur. Cela peut être utile pour partager des fichiers de configuration, du code source ou d’autres données entre l’hôte et le conteneur.

Nous allons maintenant monter un répertoire de notre machine locale dans un conteneur Nginx.

  1. Créer un fichier sur la machine hôte :

Créez un répertoire sur votre machine hôte contenant une page HTML simple.

mkdir ~/nginx-html
echo "<h1>Hello from Docker Bind Mount</h1>" > ~/nginx-html/index.html
  1. Lancer un conteneur Nginx avec un bind mount :
docker run -d \
  --name nginx-bind \
  -p 8080:80 \
  -v ~/nginx-html:/usr/share/nginx/html \
  nginx

Explications :

  • -p 8080:80 : Redirige le port 8080 de la machine hôte vers le port 80 du conteneur.
  • -v ~/nginx-html:/usr/share/nginx/html : Lie le répertoire local ~/nginx-html au répertoire où Nginx sert les fichiers HTML dans le conteneur (/usr/share/nginx/html).
  1. Accéder à la page web :

Ouvrez votre navigateur et accédez à http://localhost:8080. Vous devriez voir la page HTML que vous avez créée sur votre machine hôte, prouvant que le bind mount fonctionne.

Vérifier le Fonctionnement du Bind Mount

Modifiez le fichier index.html sur votre machine locale :

echo "<h1>Updated from Host</h1>" > ~/nginx-html/index.html

Rafraîchissez votre navigateur. Vous verrez immédiatement la mise à jour, car le conteneur utilise directement le fichier stocké sur votre machine.

Nettoyage

Une fois terminé, vous pouvez arrêter et supprimer les conteneurs et volumes avec ces commandes :

docker stop mysql-volume nginx-bind
docker rm mysql-volume nginx-bind
docker volume rm mysql-data

Conclusion

Dans ce cas pratique, nous avons exploré deux mécanismes de stockage Docker : les volumes, qui permettent de garantir la persistance des données indépendamment du cycle de vie des conteneurs, et les bind mounts, qui facilitent le partage direct de fichiers entre l’hôte et les conteneurs. Ces techniques sont essentielles pour développer des applications nécessitant la persistance des données et l’intégration continue avec les systèmes de fichiers locaux.