Les volumes dans le compose.yml
Nous avons déjà étudié les volumes. Cette fois-ci nous les utiliserons dans le fichier docker-compose.yml.
Il est possible d'utiliser des volumes mappés et/ou managés.
Volume mappé
Partons de notre docker-compose.yml initial.
version: '3'
services:
my_ubuntu:
image: celtak/ubuntu-ping-ip
container_name: celtak_ubuntu
stdin_open: true
tty: true
Ajoutons des instructions correspondant au volume mappé.
version: '3'
services:
my_ubuntu:
image: celtak/ubuntu-ping-ip
container_name: celtak_ubuntu
stdin_open: true
tty: true
volumes:
- ./data:/data-dans-le-conteneur
Expliquons ce que nous avons ajouté. C'est-à-dire volumes et - ./data:/data-dans-le-conteneur.
L'indication ./data correspond au nom du dossier local et /data-dans-le-conteneur au nom dossier dans le conteneur. Ces deux seront liés.
Le : est un séparateur. Pour plus d'information revoir la leçon sur les volumes mappés.
💡 Notez que dans notre docker-compose.yml, ./data est précédé d'un ./ alors que /data-dans-le-conteneur juste d'un /. Cela signifie que data se trouvera dans le même dossier que docker-compose.yml dans notre machine locale et /data-dans-le-conteneur sera placé à la racine du conteneur. Bien entendu, si nous le désirons, nous pouvons changer l'emplacement et le nom des dossiers. Il faudra juste adapter notre docker-compose.yml.
Avant de lancer notre docker-compose.yml, nous allons créer le dossier data dans notre machine locale. Il faudra le placer dans le même dossier ou adapté le chemin.
mkdir data
Nous allons ensuite exécuter le docker-compose.yml.
docker compose up -d
Pour entrer dans le conteneur créé grâce à la commande docker exec -it <id du conteneur> bash. Vous pouvez trouver cet id grâce au docker ps.
Maintenant que nous sommes dans notre conteneur, nous allons vérifier le conteneur de celui-ci.
ls
bin data-dans-le-conteneur etc lib media opt root sbin sys usr
boot dev home lib64 mnt proc run srv tmp var
Beaucoup de dossiers apparaissent, mais celui qui nous intéresse est data-dans-le-conteneur. Celui-ci est normalement lié au dossier data. Nous allons vérifier 🧐.
On va entrer dans le dossier data-dans-le-conteneur et créer un fichier que l'on va appeler hello.js.
cd data-dans-le-conteneur
touch hello.js
Si nous faisons un ls, nous tomberons sur notre fichier créé.
À présent, ouvrons une autre fenêtre de notre terminal. Cette fois-ci nous n'entrerons pas dans le conteneur, mais nous resterons dans notre machine locale. Via la commande cd, allons dans le dossier contenant notre dossier data.
Avec la commande ls, vérifions le contenu de data.
hello.js
Le fichier créé dans notre conteneur apparaît bien. C'est le cas parce que nous avons configuré notre docker-compose.yml de telle sorte que le dossier data en local soit lié avec le dossier data-dans-le-conteneur de notre conteneur.
D'ailleurs l'inverse est également vrai 😏. Si je crée un fichier dans data, il sera automatiquement créé dans data-dans-le-conteneur.
C'est le même principe que la synchronisation de dossiers et de fichiers.
Volume managé
Il est possible d'utiliser les volumes d'une autre façon 😎.
C'est-à-dire adopter les volumes managés. Pour leur fonctionnement, c'est le même principe que lorsque nous les avons pratiqués avec des commandes.
Mais cette fois-ci, nous nous servirons d'un docker-compose.yml.
Pour partir de zéro, nous allons supprimer le conteneur précédemment créé.
Mettons-nous dans le dossier qui contient notre docker-compose.yml et tapons la commande suivante.
docker compose rm
Ensuite nous allons nous occuper du docker-compose.yml et supprimer le volume créé précédemment. Après, nous allons ajouter le volume managé. ℹ️ Les choses se feront un peu différemment.
version: '3'
services:
my_ubuntu:
image: celtak/ubuntu-ping-ip
container_name: celtak_ubuntu
stdin_open: true
tty: true
volumes:
test_volume:
Cette fois-ci il faut utiliser le mot clé volumes: et ensuite créer un volume. Par exemple test_volume: comme indiqué ci-dessus. Mais vous pouvez choisir un autre nom.
Quoi faire ensuite ?
Eh bien, tout simplement, la procédure qui suit est la même que pour les volumes mappés. Nous allons juste changer le nom du dossier dans le conteneur.
version: '3'
services:
my_ubuntu:
image: celtak/ubuntu-ping-ip
container_name: celtak_ubuntu
stdin_open: true
tty: true
volumes:
- test_volume:/test-volume-dans-le-conteneur
volumes:
test_volume:
Tester le fonctionnement
Pour tester, nous allons relancer notre conteneur.
docker compose up -d
Puis nous allons entrer dans le conteneur nouvellement créé, via docker exec -it <id du conteneur> bash.
Pour a fortiori y vérifier le contenu.
ls
bin etc lib64 opt run sys usr
boot home media proc sbin test-volume-dans-le-conteneur var
dev lib mnt root srv tmp
Nous voyons bien le dossier test-volume-dans-le-conteneur
Sortons du conteneur avec la commande exit.
Puisque c'est un volume managé, normalement celui-ci devrait apparaître ci nous tapons la commande qui suit.
docker volume ls
DRIVER VOLUME NAME
local exercice-docker-compose_test_volume
Et c'est effectivement vrai. Mais peut-être que vous vous demandez d'où sort ce nom à rallonge 🤨 : exercice-docker-compose_test_volume.
Pourquoi un nom à rallonge ?
C'est très simple à comprendre. Il faut diviser le nom en deux parties. La première partie correspond au nom du dossier qui contient le docker-compose.yml (exercice-docker-compose). Et la deuxième partie au nom du volume choisi (test_volume).

