6. Les volumes - Docker

Maintenant que vous savez exploiter de manière plus poussée les conteneurs en y accédant via leur port interne et en effectuant une redirection de ports, regardons comment persister les données de notre conteneur avec les volumes Docker.

Les données d'un conteneur

Pour rappel, un conteneur est éphémère. En effet, lorsqu'il est détruit, tout ce qui était contenu dans le conteneur disparaît et ne laisse aucune trace, même sur l'hôte.

Afin d'avoir la possibilité de persister les données d'un conteneur sur la machine hôte, Docker a mis en place les volumes.

Comme il peut arriver qu'un conteneur soit redémarré assez fréquemment, le besoin de stocker de manière persistante est très important, d'autant plus si le conteneur est une base de données par exemple.

Il faut voir les volumes comme une sorte de montage entre le Filesystem du conteneur et celui de la machine hôte.

Créer un volume

Dans le cours précédent, nous avions vu l'argument -p qui permet d'exposer le port d'un conteneur sur sa machine hôte. Pour les volumes Docker, la syntaxe utilise le même principe que pour les ports.

Partons du principe que vous avez un script nommé main.py se trouvant dans le répertoire /home/user/scripts.

Toujours avec notre conteneur Python, ajoutons l'argument pour la création d'un volume pour le répertoire à la commande docker run pour son lancement comme ceci :

docker run -td --name mon-conteneur-python -v /home/user/scripts:/opt/scripts python

Vous l'avez compris, avec l'argument -v, la partie à gauche du séparateur : correspond au répertoire de la machine hôte, et à droite, le répertoire du conteneur.

Plutôt que de se connecter à notre conteneur comme on a l'habitude de le faire, exécutons directement une commande qui liste les fichiers se trouvant dans le répertoire où nous venons de monter le volume comme ceci :

docker exec -t mon-conteneur-python ls -l /opt/scripts

Vous retrouver votre script main.py qui se trouve aussi sur votre machine hôte !

Maintenant si vous quittez votre conteneur et que vous éditez votre script Python, son contenu sera aussi mis à jour dans le conteneur !

Aussi, si vous supprimer votre conteneur, et que vous le recréez avec le même volume, les données contenues dans le volume sont conservées.

Les volumes managés

Il existe un autre type de volume Docker : Les volumes managés.
Le principe est le même, persister les données d'un conteneur, mais cette fois-ci, en déléguant le répertoire du volume de la machine hôte à Docker.

Pour créer notre volume Docker managé nommé mon-script, nous allons utiliser la commande docker volume comme ceci :

docker volume create mon-script

Inspectons ce volume afin de voir ce que nous venons de créer avec la commande suivante :

docker volume inspect mon-script
Retour :
[
    {
        "CreatedAt": "2023-03-11T16:59:40+01:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mon-script/_data",
        "Name": "mon-script",
        "Options": null,
        "Scope": "local"
    }
]

Nous pouvons voir que le Mountpoint, c'est-à-dire le point de montage du volume managé se situe dans /var/lib/docker/volumes/mon-script/_data.

Nous allons maintenant copier notre script Python main.py dans /var/lib/docker/volumes/mon-script/_data et lançons de nouveau notre conteneur python comme ceci :

docker run -td --name mon-conteneur-python -v mon-script:/opt/scripts python

Le résultat est le même que toute à l'heure sauf que cette fois-ci, le répertoire du volume Docker de la machine hôte se trouve dans /var/lib/docker/volumes...

Avec ce cours, vous savez maintenant lancer des conteneurs et persister les données de celui-ci sur votre machine hôte. Voilà une brique essentielle si l'on souhaite avoir une architecture trois-tiers avec un serveur de base de données et un serveur Web avec Docker.

Dans le cours suivant, nous comprendrons de quoi est composée une image Docker, nous verrons comment son build s'effectue pour enfin créer notre propre image Docker.