Docker volume

docker volume

Si tu es ici c’est que tu as les bases en Docker sinon tu peux lire ce cours.

Par défaut les conteneurs de Docker sont volatile, à la suppression du conteneur les données du conteneur disparaissent.

Ça c’est si on n’utilise pas de docker volume, justement dans cet article on t’explique comment fonctionnent les volumes docker et comment s’en servir.

Donc comme je le disais, par défaut quand on lance un conteneur comme ceci :

docker run -tid --name debian debian

Aucun volume ne lui est affecté, on peut le voir avec la commande docker inspect :

docker inspect -f {{.Mounts}} debian
[]

Cette commande affiche les volumes associés au conteneur.

Ici on à rien, nada, 0 volumes.

Les commandes docker volume

On va donc voir comment gérer nos volume docker puis comment les affecter à nos conteneurs.

Pour créer notre premier volume :

docker volume create mon_premier_volume

Pour afficher nos volumes :

docker volume create mon_premier_volume
DRIVER              VOLUME NAME
local               mon_premier_volume

Notre volume « mon_premier_volume » a bien été créé.

Si on souhaite en savoir plus sur notre volume on peut faire un inspect :

docker volume inspect mon_premier_volume
[
    {
        "CreatedAt": "2021-03-05T20:59:50+01:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/mon_premier_volume/_data",
        "Name": "mon_premier_volume",
        "Options": {},
        "Scope": "local"
    }
]

On s’aperçoit ici que notre volume est présent sur notre système hôte dans « /var/lib/docker/volumes/mon_premier_volume/_data« .

Les volumes docker sont toujours placé dans « /var/lib/docker/volumes/« .

Pour supprimer un volume :

docker volume rm nom_de_mon_volume

Pour supprimer tous les volumes qui ne sont pas utilisé :

docker volume prune

Affecter des volumes à nos conteneurs

Lorsque l’on run un conteneur on a 2 possibilités pour lui affecter un volume :

Première méthode, utiliser l’option –mount :

--mount source=le_volume,target=/chemin_dans_le_conteneur
docker run -tid --mount source=mon_premier_volume,target=/etc alpine

Ici j’ai donc crée un conteneur alpine avec le volume « mon_premier_volume » qui est mappé sur /etc du conteneur.

Seconde méthode :

-v nom_du_volume:/chemin_sur_le_conteneur 
docker run -tid -v mon_premier_volume:/etc debian

Maintenant si on fait un :

sudo ls /var/lib/docker/volumes/mon_premier_volume/_data

On remarque que le dossier contient bien les fichiers présent dans le /etc du conteneur :

adduser.conf		fstab	   kernel	  nsswitch.conf  rc3.d	      shells
alternatives		gai.conf   ld.so.cache	  opt		 rc4.d	      skel
apt			group	   ld.so.conf	  os-release	 rc5.d	      subgid
bash.bashrc		group-	   ld.so.conf.d   pam.conf	 rc6.d	      subuid
bindresvport.blacklist	gshadow    libaudit.conf  pam.d		 rcS.d	      systemd
cron.daily		host.conf  localtime	  passwd	 resolv.conf  terminfo
debconf.conf		hostname   login.defs	  passwd-	 rmt	      timezone
debian_version		hosts	   logrotate.d	  profile	 securetty    update-motd.d
default			init.d	   machine-id	  profile.d	 security     xattr.conf
deluser.conf		iproute2   mke2fs.conf	  rc0.d		 selinux
dpkg			issue	   motd		  rc1.d		 shadow
environment		issue.net  mtab		  rc2.d		 shadow-

Tu peux aussi utiliser des volumes en lecture seule avec cette option :

--mount source=nom_du_volume,target=/etc, readonly 

Ou :

-v mon_premier_volume:/etc,readonly

Avec cette option le conteneur pourra écrire dans /etc mais les modifications n’affecterons pas le volume.

Enfin voici un option très utile lorsque l’on veut utiliser le même volume qu’un autre conteneur :

--volumes-from nom_conteneur 

Avec toutes ces commandes et options tu devrais maintenant savoir utilisé des conteneur avec des volumes structuré.

Si tu veux en savoir plus voici la documentation officielle de docker volume.

Ah oui, voici une petite astuce en plus pour afficher les volumes liés à un conteneur :

docker inspect alpine -f {{.Mounts}} 
[{volume monvolume /var/lib/docker/volumes/monvolume/_data /etc local z true }]

Laisser un commentaire