Volumes

Par défaut, tous les fichiers créés dans un container sont stockés dans le container, ce qui a plusieurs conséquences:

Pour résoudre ces problèmes, on peut utiliser un volume, bind ou tmpfs.


Volume

Un volume fonctionne un peu sur le même principe qu’un fichier/dossier partagé entre l’hôte et le container. Il peut être utilisé pour stocker et partager des données entre différents containers. Il s’agit de la manière recommandée pour persister des données, qui doivent exister au-delà de la durée de vie d’un container.

Les volumes sont indépendants des images. Le contenu des volumes ne sera pas inclus lorsque vous téléchargez une image, et le contenu des volumes ne sera pas exporté si vous créez une image à partir du container.
Par défaut, le contenu des volumes est sauvegardé dans /var/lib/docker/volumes sur la machine hôte.


Volume éphémère

Il est possible de partager un volume entre containers, qui n’existera que tant que des containers l’utilise. Lorsqu’il n’y a plus aucun container pour utiliser le dossier (situé en mémoire), alors le volume est supprimé. On parle de volume éphémère.


bind mount

Une autre option pour le stockage de données est de monter un répertoire de la machine hôte vers le container, ce qui peut être utile lorsqu’on développe une application — les modifications de code effectuées sur la machine hôte sont directement apportées dans le container et inversemment.

Pour ce faire, monter un volume de type bind:

docker run -ti -v /home/docker/example:/shared-folder ubuntu bash
--mount type=bind,source="$(pwd)"/target,target=app

tmpfs mount

Sous Linux, on peut utiliser une partition tmpfs. Contrairement aux volumes et bind mounts, utiliser tmpfs est temporaire, les données ne subsistent que dans la mémoire de l’hôte et non sur le disque dur. Lorsque le container s’arrête, la partition tmpfs est supprimée et les fichiers qui y sont écrits sont perdus. Une partition tmpfs ne peut pas non plus être partagée entre containers. C’est utile pour stocker temporairement des fichiers sensibles, que vous ne souhaitez pas conserver dans le container ni sur l’hôte.

docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app \
  nginx:latest
docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

Volume driver

On peut ajouter de nouveaux drivers de volume, sous forme de plugins. Ils peuvent permettent de stocker les volumes sur des hôtes distants ou des fournisseurs de cloud, et/ou d’encrypter le contenu.

Pour spécifier le driver à utiliser:

docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume
docker run -d \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest
docker service create -d \
  --name nfs-service \
  --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o=addr=10.0.0.10' \
  nginx:latest

Volume plugins
Managing persistence for Docker containers


Backup & restore


Permissions

Les permissions à l’extérieur du container — rwx, UID et GUID — sont conservées à l’intérieur du container.
Pour contrôler les permissions à l’intérieur du container, il faut donc contrôler à quel utilisateur/groupe appartient l’UID/GUID propriétaire du fichier. Par exemple:

# Permissions du fichier /var/run/docker.sock côté hôte
host$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 juin  15 02:45 /var/run/docker.sock

# GUID du groupe "docker"
host$ getent group docker
docker:x:999:bob

# Démarre un container qui utilise ce fichier comme volume
host$ docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  ubuntu:18.04 bash
# Permissions du fichier /var/run/docker.sock côté container
/# ls -l /var/run/docker.sock
srw-rw---- 1 root 999 0 Jun 15 00:45 /var/run/docker.sock

# Ajoute un groupe avec le GUID 999
/# groupadd ping -g 999

# Vérifie que "ping" est maintenant le groupe propriétaire du fichier côté container
/# ls -l /var/run/docker.sock
srw-rw---- 1 root ping 0 Jun 15 00:45 /var/run/docker.sock

# Ajoute l'utilisateur "www-data" au groupe "ping"
# Lui donne donc l'autorisation de lire et écrire (rw) le fichier
/# usermod -aG ping www-data