# Les volumes

### Utilisation des volumes

Les volumes sont des répertoires accessibles depuis le conteneur et l'hôte.  
**Les volumes sont persistants**, contrairement aux fichiers des conteneurs docker.

Les volumes sont très utiles avec Docker, ils peuvent servir à stocker, par exemple :

- Les données d'une base de données : il existe des images Docker pour la plupart des SGBD
- Les fichiers de configuration d'une application
- Les fichiers utilisateurs d'une application web (uploads)
- etc.

Une application dockerisée correctement configurée doit stocker ses données dans des volumes.

<p class="callout success">L'avantage des volumes est la sauvegarde : seules les données **utiles** s'y trouvent et il est possible de dupliquer une application à partir d'une image docker et des volumes associés.</p>

Un volume est accessible depuis le container à partir de son point de montage. Exemple :

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/f6T663ampOYaXDFW-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/f6T663ampOYaXDFW-image.png)

Le dossier `/home/debian/test` de l'hôte est monté dans `/toto` au sein du conteneur avec le paramètre `-v`. L'hôte et le conteneur ont accès au répertoire.

```bash
-v /home/debian/test:/toto
```

Généralement, les images Docker d'applications indiquent les répertoires dans lesquels elles stockent leurs données utiles, par exemple :

- **MariaDB** stocke les fichiers de bases de données dans `/var/lib/mysql` ([documentation](https://hub.docker.com/_/mariadb#where-to-store-data)).
- **Odoo** stocke des données dans `/var/lib/odoo` ([documentation](https://hub.docker.com/_/odoo#use-named-volumes-to-preserve-data)).
- **Redmine** stocke les fichiers uploadés dans `/usr/src/redmine/files` ([documentation](https://hub.docker.com/_/redmine#where-to-store-data)).

### Volumes mappés vs. Volumes managés

Il existe deux types de volumes Docker : mappés et managés. Ils diffèrent par leur mode de gestion et leur usage :

- **Les volumes mappés** relient un dossier de l'hôte à un dossier du conteneur, ce qui permet un accès direct aux fichiers et facilite le développement.  
    Les fichiers dépendent du système de fichiers de l'hôte, ce qui réduit la portabilité et peut poser des problèmes en production.
- **Les volumes managés** sont créés et gérés par Docker. Ils sont stockés dans un emplacement interne et peuvent être utilisés par plusieurs conteneurs. Ils offrent une meilleure isolation et une meilleure portabilité.  
    Leur usage est idéal pour la persistance des données (bases de données, application, etc.), mais ils nécessitent des commandes Docker pour y accéder.

<p class="callout info">L'exemple ci-dessus est un volume mappé.</p>

### Gestion des volumes managés

Les volumes managés docker sont gérés avec la commande `docker volume`.

```bash
docker volume create mon_volume # créer un volume
docker volume ls # lister les volumes
docker volume rm mon_volume # supprimer un volume
```

Lors de l'exécution d'un conteneur, il faut aussi utiliser `-v` pour monter un volume managé. À l'inverse d'un volume mappé, il faut indiquer le nom du volume plutôt que son chemin.

```bash
docker run -v mon_volume:/home/thibaud/volume ubuntu
# Le contenu du volume mon_volume sera monté dans /home/thibaud/volume au sein du conteneur
```

Le volume est indépendant du conteneur auquel il est attaché :

[![image.png](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/scaled-1680-/g8ehUdRUkjnCiHhw-image.png)](https://formation.tfrichet.fr/uploads/images/gallery/2025-08/g8ehUdRUkjnCiHhw-image.png)

- Le volume `mon_volume` est attaché à un conteneur `ubuntu` dans `/home/toto` et le fichier `contenu.txt` y est créé.
- Lorsque le conteneur est arrêté, il est automatiquement supprimé puisqu'il a été lancé avec `--rm`.
- Le volume `mon_volume` persiste et son contenu est préservé.
- Un nouveau conteneur `debian` est lancé et le volume `mon_volume` y est attaché dans `/var/test` : le fichier `contenu.txt` est disponible.

Une subtilité des volumes managés est **la priorité des données** si l'un des deux répertoires est vide lors du lancement d'un conteneur :

<table border="1" id="bkmrk-contenu-du-volume-co" style="border-collapse: collapse; width: 100%; height: 199.766px;"><colgroup><col style="width: 17.2825%;"></col><col style="width: 31.7129%;"></col><col style="width: 51.0046%;"></col></colgroup><thead><tr style="height: 55.2188px;"><td style="height: 55.2188px;">**Volume**</td><td style="height: 55.2188px;">**Point de montage (conteneur)**</td><td style="height: 55.2188px;">**Action**</td></tr></thead><tbody><tr style="height: 76.3281px;"><td style="height: 76.3281px;">Si vide</td><td style="height: 76.3281px;">Si non vide</td><td style="height: 76.3281px;">Les données initialement dans le conteneur sont copiées dans le volume.</td></tr><tr style="height: 34.1094px;"><td style="height: 34.1094px;">Si non vide</td><td style="height: 34.1094px;">Si vide</td><td style="height: 34.1094px;">Le contenu du volume est monté dans le conteneur, comme dans l'exemple ci-dessus.</td></tr><tr style="height: 34.1094px;"><td style="height: 34.1094px;">Si non vide</td><td style="height: 34.1094px;">Si non vide</td><td style="height: 34.1094px;">Le contenu du répertoire dans le conteneur est écrasé par celui du volume.</td></tr></tbody></table>