Une image Docker est composée d'une série de couches (layers) en lecture seule.
Du démarrage d'une image résulte un conteneur en cours d'exécution sur lequel est ajouté une nouvelle couche inscriptible.
Lorsqu'un conteneur est supprimé, sa couche inscriptible est supprimée aussi, et l'image sous-jacente reste inchangée.
Le storage driver gère la façon dont ces couches interagissent les unes avec les autres en spécifiant le type d'Union File System utilisé, duquel découle un algorithme de copy-on-write :
$ docker info | grep -i "storage driver"
Storage Driver: overlay2
Ces techniques participent au concept d'infrastructure immuable.
Pour faire persister des données utilisées par des conteneurs au delà de leurs temps de vie, les volumes sont le mécanisme privilégié.
Un volume est un répertoire monté à l'intérieur d'un conteneur qui existe en dehors de l'Union File System.
Il peut être nommé ou bien basé sur un chemin d'accès.
Un volume nommé est géré automatiquement par Docker. Pour trouver son emplacement physique il est possible d'utiliser docker volume inspect
, puis d'inspecter la valeur de Mountpoint
.
Sous Linux ça serait quelque part dans /var/lib/docker/volumes
.
Or sous Mac, Docker tourne dans une VM et pour voir ce répertoire il faut d'abord s'y connecter.
Pour ce faire, Docker for Mac expose une session screen
que l'on peut utiliser pour voir le contenu des volumes nommés :
$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
linuxkit-025000000001:~# ls /var/lib/docker/volumes/
[CTRL]+[A] [K] y