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).

Décrire comment fonctionne la commande pour mapper un dossier dans Docker