Exploiter les volumes dans le docker-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).