Aller au contenu

Docker : les volumes

Les données d’un conteneur sont perdues à sa suppression, sauf si elles sont stockées dans un volume ou un dossier de l’hôte. Les exemples utilisent des noms génériques (pgdata).

Fenêtre de terminal
docker volume create pgdata # crée un volume
docker volume ls # liste les volumes
docker volume inspect pgdata # détail (dont l'emplacement sur l'hôte)
docker volume rm pgdata # supprime (aucun conteneur ne doit l'utiliser)
docker volume prune # supprime les volumes non utilisés

Sur Linux, les volumes sont stockés dans /var/lib/docker/volumes/. Les modifier directement n’est pas recommandé.

Fenêtre de terminal
docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:16
docker run -d --name db --mount type=volume,source=pgdata,target=/var/lib/postgresql/data postgres:16

-v est la forme courte ; --mount est plus explicite et signale une erreur si le chemin source n’existe pas.

Type Source Usage
Volume nommé géré par Docker (pgdata) Données d’application (bases de données), portabilité
Bind mount dossier de l’hôte (/srv/site) Fichiers de configuration, code en développement
tmpfs mémoire vive Données temporaires, jamais écrites sur disque
Fenêtre de terminal
docker run -d -v /srv/site:/usr/share/nginx/html:ro nginx:alpine # bind mount en lecture seule
docker run -d --tmpfs /tmp:rw,size=64m monapp:1.0 # tmpfs

Le suffixe :ro monte en lecture seule : à privilégier pour la configuration.

Archive du contenu d’un volume, via un conteneur temporaire :

Fenêtre de terminal
# Sauvegarde
docker run --rm \
-v pgdata:/donnees:ro \
-v "$PWD":/sauvegarde \
alpine tar czf /sauvegarde/pgdata.tar.gz -C /donnees .
# Restauration dans un volume
docker run --rm \
-v pgdata:/donnees \
-v "$PWD":/sauvegarde \
alpine tar xzf /sauvegarde/pgdata.tar.gz -C /donnees

Pour une base de données, arrêter le conteneur avant une sauvegarde de fichiers, ou utiliser l’outil de dump de la base (pg_dump, mysqldump).

Les fichiers créés dans un volume appartiennent à l’utilisateur du processus du conteneur. En cas d’erreur permission denied :

  • aligner l’utilisateur du conteneur sur le propriétaire des fichiers : --user 1000:1000 ;
  • ou corriger les droits depuis un conteneur temporaire : docker run --rm -v pgdata:/d alpine chown -R 1000:1000 /d.
Fenêtre de terminal
docker volume ls -f dangling=true # volumes non utilisés
docker volume prune