Contactez-nous

Les volumes Docker

Découvrez les volumes Docker, la méthode privilégiée pour assurer la persistance des données de vos conteneurs. Apprenez à les créer, gérer et utiliser efficacement.

Introduction aux volumes Docker : persistance maîtrisée

Comme nous l'avons évoqué précédemment, le système de fichiers d'un conteneur est éphémère par défaut. Toutes les données écrites à l'intérieur sont perdues lorsque le conteneur est supprimé. Pour pallier ce problème et conserver les données importantes générées ou utilisées par vos applications (bases de données, fichiers de configuration, logs, uploads utilisateur, etc.), Docker propose une solution robuste et gérée : les volumes.

Un volume Docker est un mécanisme permettant de découpler le stockage des données du cycle de vie du conteneur. Il s'agit d'un répertoire spécial, géré directement par Docker, qui est monté à l'intérieur d'un ou plusieurs conteneurs. Contrairement aux bind mounts qui dépendent d'un chemin spécifique sur l'hôte, les volumes sont entièrement administrés par Docker, offrant ainsi une meilleure portabilité et une gestion simplifiée.

Physiquement, les données d'un volume sont stockées dans une partie du système de fichiers de l'hôte gérée par Docker (généralement sous `/var/lib/docker/volumes/` sur Linux). L'emplacement exact est une abstraction dont vous n'avez normalement pas à vous soucier. L'avantage majeur est que le volume persiste même si aucun conteneur ne l'utilise. Vous pouvez supprimer, recréer ou mettre à jour un conteneur sans perdre les données stockées dans le volume qui lui était associé.

Création et gestion des volumes via la CLI Docker

Docker fournit une série de commandes spécifiques pour gérer le cycle de vie des volumes, regroupées sous `docker volume`. Ces commandes permettent de créer, lister, inspecter et supprimer des volumes indépendamment des conteneurs.

Pour créer un volume explicitement, on utilise la commande `docker volume create`. Il est fortement recommandé de donner un nom significatif à vos volumes pour faciliter leur identification et leur gestion. Par exemple, pour créer un volume destiné à stocker les données d'une base de données PostgreSQL :

docker volume create pgdata

Cette commande crée un volume nommé `pgdata`. Vous pouvez vérifier sa création et lister tous les volumes présents sur votre système avec `docker volume ls` :

docker volume ls

DRIVER    VOLUME NAME
local     pgdata
...       ...

Pour obtenir des informations détaillées sur un volume spécifique, comme son point de montage réel sur l'hôte (utile pour des opérations de bas niveau ou de débogage), utilisez `docker volume inspect` suivi du nom du volume :

docker volume inspect pgdata

[
    {
        "CreatedAt": "2023-10-27T10:30:00Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

Enfin, pour supprimer un volume qui n'est plus nécessaire, utilisez `docker volume rm`. Attention, cette opération est destructive pour les données contenues dans le volume. Docker vous empêchera de supprimer un volume s'il est actuellement utilisé par un conteneur (même arrêté).

# Supprimer le volume 'pgdata' (seulement s'il n'est pas utilisé)
docker volume rm pgdata

# Tenter de supprimer plusieurs volumes
docker volume rm volume1 volume2

# Supprimer tous les volumes locaux non utilisés (dangereux !)
docker volume prune

La commande `docker volume prune` est pratique pour nettoyer les volumes orphelins, mais utilisez-la avec précaution.

Attacher des volumes aux conteneurs Docker

L'intérêt principal des volumes réside dans leur utilisation par les conteneurs. Pour attacher un volume à un conteneur, vous pouvez utiliser l'option `-v` ou `--mount` lors de l'exécution de la commande `docker run`. Ces options permettent de spécifier quel volume (ou quel type de montage) doit être accessible à quel endroit dans le système de fichiers du conteneur.

La syntaxe la plus concise utilise l'option `-v`. Pour monter un volume nommé, la syntaxe est `-v :`. Par exemple, pour lancer un conteneur PostgreSQL en utilisant le volume `pgdata` que nous avons créé précédemment pour stocker ses données dans `/var/lib/postgresql/data` :

docker run -d \
  --name some-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -v pgdata:/var/lib/postgresql/data \
  postgres:latest

Ici, le contenu du répertoire `/var/lib/postgresql/data` à l'intérieur du conteneur sera stocké dans le volume `pgdata` sur l'hôte.

Une syntaxe alternative, plus verbeuse mais aussi plus explicite, est l'option `--mount`. Elle permet de spécifier plus de détails sur le montage. La syntaxe équivalente pour monter notre volume `pgdata` est `--mount type=volume,source=pgdata,target=/var/lib/postgresql/data` :

docker run -d \
  --name some-postgres-mount \
  -e POSTGRES_PASSWORD=mysecretpassword \
  --mount type=volume,source=pgdata,target=/var/lib/postgresql/data \
  postgres:latest

Bien que plus longue, la syntaxe `--mount` est souvent préférée dans les scripts et les configurations (comme Docker Compose) pour sa clarté, notamment lorsqu'on utilise d'autres options de montage (comme les bind mounts ou les tmpfs).

Il est également possible de créer et monter un volume en une seule étape. Si vous spécifiez un chemin dans le conteneur avec `-v` mais sans fournir de nom de volume existant ni de chemin sur l'hôte, Docker créera automatiquement un volume dit "anonyme". Par exemple, `-v /var/lib/mysql` créera un volume avec un nom aléatoire (un long hash) et le montera sur `/var/lib/mysql` dans le conteneur. Bien que fonctionnels, ces volumes anonymes sont plus difficiles à gérer et à référencer par la suite. Il est donc fortement conseillé d'utiliser des volumes nommés pour toute donnée que vous souhaitez explicitement persister et gérer.

Avantages clés et scénarios d'utilisation des volumes

L'utilisation des volumes Docker présente plusieurs avantages significatifs par rapport à la gestion manuelle des données ou même aux bind mounts dans certains contextes. D'abord, ils sont entièrement gérés par l'API et la CLI Docker, ce qui simplifie les opérations de sauvegarde, de restauration ou de migration des données entre différents environnements ou hôtes Docker. Ensuite, les volumes sont indépendants du système d'exploitation hôte ; leur fonctionnement est cohérent que vous utilisiez Docker sous Linux, macOS ou Windows.

Comparés aux bind mounts, les volumes offrent une meilleure isolation par rapport au système de fichiers de l'hôte. Vous n'avez pas besoin de connaître la structure exacte des répertoires de l'hôte pour les utiliser. De plus, sur certains systèmes (comme Docker Desktop pour macOS et Windows), les volumes peuvent offrir de meilleures performances pour les opérations intensives en lecture/écriture, car Docker peut optimiser la manière dont les données sont gérées.

Les cas d'usage typiques des volumes incluent le stockage des données pour les bases de données (comme MySQL, PostgreSQL, MongoDB), la persistance des fichiers uploadés par les utilisateurs dans une application web, la conservation des fichiers de configuration modifiés par une application, ou encore le partage de données entre plusieurs conteneurs (par exemple, un conteneur qui génère des données et un autre qui les consomme peuvent monter le même volume).

En résumé, les volumes sont la méthode recommandée par Docker pour gérer la persistance des données des applications conteneurisées. Ils offrent une solution portable, gérable et performante. Privilégiez toujours les volumes nommés pour une meilleure organisation et une gestion simplifiée de vos données critiques.