⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Utiliser les montages de liaison

Dans la partie 4, vous avez utilisé un montage de volume pour persister les données dans votre base de données. Un montage de volume est un excellent choix quand vous avez besoin d'un endroit persistant pour stocker les données de votre application.

Un montage de liaison est un autre type de montage, qui vous permet de partager un répertoire du système de fichiers de l'hôte dans le conteneur. Quand vous travaillez sur une application, vous pouvez utiliser un montage de liaison pour monter le code source dans le conteneur. Le conteneur voit les changements que vous apportez au code immédiatement, dès que vous sauvegardez un fichier. Cela signifie que vous pouvez exécuter des processus dans le conteneur qui surveillent les changements du système de fichiers et y répondent.

Dans ce chapitre, vous verrez comment vous pouvez utiliser les montages de liaison et un outil appelé nodemon pour surveiller les changements de fichiers, puis redémarrer l'application automatiquement. Il existe des outils équivalents dans la plupart des autres langages et frameworks.

Comparaisons rapides des types de volumes

Voici des exemples d'un volume nommé et d'un montage de liaison utilisant --mount :

  • Volume nommé : type=volume,src=my-volume,target=/usr/local/data
  • Montage de liaison : type=bind,src=/path/to/data,target=/usr/local/data

Le tableau suivant décrit les principales différences entre les montages de volume et les montages de liaison.

Volumes nommés Montages de liaison
Emplacement hôte Docker choisit Vous décidez
Remplit le nouveau volume avec le contenu du conteneur Oui Non
Supporte les pilotes de volume Oui Non

Essayer les montages de liaison

Avant de voir comment vous pouvez utiliser les montages de liaison pour développer votre application, vous pouvez faire une expérience rapide pour obtenir une compréhension pratique du fonctionnement des montages de liaison.

  1. Vérifiez que votre répertoire getting-started-app est dans un répertoire défini dans le paramètre de partage de fichiers de Docker Desktop. Ce paramètre définit quelles parties de votre système de fichiers vous pouvez partager avec les conteneurs. Pour plus de détails sur l'accès au paramètre, voir Partage de fichiers.

    Note

    L'onglet Partage de fichiers n'est disponible qu'en mode Hyper-V, car les fichiers sont automatiquement partagés en mode WSL 2 et en mode conteneur Windows.

  2. Ouvrez un terminal et changez de répertoire vers le répertoire getting-started-app.

  3. Exécutez la commande suivante pour démarrer bash dans un conteneur ubuntu avec un montage de liaison.

    $ docker run -it --mount type=bind,src="$(pwd)",target=/src ubuntu bash
    
    $ docker run -it --mount "type=bind,src=%cd%,target=/src" ubuntu bash
    
    $ docker run -it --mount type=bind,src="/$(pwd)",target=/src ubuntu bash
    
    $ docker run -it --mount "type=bind,src=$($pwd),target=/src" ubuntu bash
    

    L'option --mount type=bind indique à Docker de créer un montage de liaison, où src est le répertoire de travail actuel sur votre machine hôte (getting-started-app), et target est l'endroit où ce répertoire devrait apparaître à l'intérieur du conteneur (/src).

  4. Après avoir exécuté la commande, Docker démarre une session bash interactive dans le répertoire racine du système de fichiers du conteneur.

    root@ac1237fad8db:/# pwd
    /
    root@ac1237fad8db:/# ls
    bin   dev  home  media  opt   root  sbin  srv  tmp  var
    boot  etc  lib   mnt    proc  run   src   sys  usr
    
  5. Changez de répertoire vers le répertoire src.

    C'est le répertoire que vous avez monté lors du démarrage du conteneur. Lister le contenu de ce répertoire affiche les mêmes fichiers que dans le répertoire getting-started-app sur votre machine hôte.

    root@ac1237fad8db:/# cd src
    root@ac1237fad8db:/src# ls
    Dockerfile  node_modules  package.json  spec  src  yarn.lock
    
  6. Créez un nouveau fichier nommé myfile.txt.

    root@ac1237fad8db:/src# touch myfile.txt
    root@ac1237fad8db:/src# ls
    Dockerfile  myfile.txt  node_modules  package.json  spec  src  yarn.lock
    
  7. Ouvrez le répertoire getting-started-app sur l'hôte et observez que le fichier myfile.txt est dans le répertoire.

    ├── getting-started-app/
    │ ├── Dockerfile
    │ ├── myfile.txt
    │ ├── node_modules/
    │ ├── package.json
    │ ├── spec/
    │ ├── src/
    │ └── yarn.lock
  8. Depuis l'hôte, supprimez le fichier myfile.txt.

  9. Dans le conteneur, listez le contenu du répertoire app une fois de plus. Observez que le fichier a maintenant disparu.

    root@ac1237fad8db:/src# ls
    Dockerfile  node_modules  package.json  spec  src  yarn.lock
    
  10. Arrêtez la session de conteneur interactive avec Ctrl + D.

C'est tout pour une brève introduction aux montages de liaison. Cette procédure a démontré comment les fichiers sont partagés entre l'hôte et le conteneur, et comment les changements sont immédiatement reflétés des deux côtés. Maintenant vous pouvez utiliser les montages de liaison pour développer des logiciels.

Conteneurs de développement

L'utilisation de montages de liaison est courante pour les configurations de développement local. L'avantage est que la machine de développement n'a pas besoin d'avoir tous les outils de construction et environnements installés. Avec une seule commande docker run, Docker tire les dépendances et outils.

Exécuter votre application dans un conteneur de développement

Les étapes suivantes décrivent comment exécuter un conteneur de développement avec un montage de liaison qui fait ce qui suit :

  • Monte votre code source dans le conteneur
  • Installe toutes les dépendances
  • Démarre nodemon pour surveiller les changements du système de fichiers

Vous pouvez utiliser la CLI ou Docker Desktop pour exécuter votre conteneur avec un montage de liaison.

  1. Assurez-vous de ne pas avoir de conteneurs getting-started en cours d'exécution actuellement.

  2. Exécutez la commande suivante depuis le répertoire getting-started-app.

    $ docker run -dp 127.0.0.1:3000:3000 \
        -w /app --mount type=bind,src="$(pwd)",target=/app \
        node:18-alpine \
        sh -c "yarn install && yarn run dev"
    

    Voici une décomposition de la commande :

    • -dp 127.0.0.1:3000:3000 - comme avant. Exécuter en mode détaché (arrière-plan) et créer un mappage de port
    • -w /app - définit le "répertoire de travail" ou le répertoire courant depuis lequel la commande s'exécutera
    • --mount type=bind,src="$(pwd)",target=/app - monte par liaison le répertoire courant depuis l'hôte dans le répertoire /app du conteneur
    • node:18-alpine - l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfile
    • sh -c "yarn install && yarn run dev" - la commande. Vous démarrez un shell en utilisant sh (alpine n'a pas bash) et exécutez yarn install pour installer les packages puis exécutez yarn run dev pour démarrer le serveur de développement. Si vous regardez dans le package.json, vous verrez que le script dev démarre nodemon.
  3. Vous pouvez regarder les journaux en utilisant docker logs <container-id>. Vous saurez que vous êtes prêt quand vous verrez ceci :

    $ docker logs -f <container-id>
    nodemon -L src/index.js
    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): *.*
    [nodemon] watching extensions: js,mjs,json
    [nodemon] starting `node src/index.js`
    Using sqlite database at /etc/todos/todo.db
    Listening on port 3000
    

    Quand vous avez fini de regarder les journaux, sortez en appuyant sur Ctrl+C.

  1. Assurez-vous de ne pas avoir de conteneurs getting-started en cours d'exécution actuellement.

  2. Exécutez la commande suivante depuis le répertoire getting-started-app.

    $ docker run -dp 127.0.0.1:3000:3000 `
        -w /app --mount "type=bind,src=$pwd,target=/app" `
        node:18-alpine `
        sh -c "yarn install && yarn run dev"

    Voici une décomposition de la commande :

    • -dp 127.0.0.1:3000:3000 - comme avant. Exécuter en mode détaché (arrière-plan) et créer un mappage de port
    • -w /app - définit le "répertoire de travail" ou le répertoire courant depuis lequel la commande s'exécutera
    • --mount "type=bind,src=$pwd,target=/app" - monte par liaison le répertoire courant depuis l'hôte dans le répertoire /app du conteneur
    • node:18-alpine - l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfile
    • sh -c "yarn install && yarn run dev" - la commande. Vous démarrez un shell en utilisant sh (alpine n'a pas bash) et exécutez yarn install pour installer les packages puis exécutez yarn run dev pour démarrer le serveur de développement. Si vous regardez dans le package.json, vous verrez que le script dev démarre nodemon.
  3. Vous pouvez regarder les journaux en utilisant docker logs <container-id>. Vous saurez que vous êtes prêt quand vous verrez ceci :

    $ docker logs -f <container-id>
    nodemon -L src/index.js
    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): *.*
    [nodemon] watching extensions: js,mjs,json
    [nodemon] starting `node src/index.js`
    Using sqlite database at /etc/todos/todo.db
    Listening on port 3000
    

    Quand vous avez fini de regarder les journaux, sortez en appuyant sur Ctrl+C.

  1. Assurez-vous de ne pas avoir de conteneurs getting-started en cours d'exécution actuellement.

  2. Exécutez la commande suivante depuis le répertoire getting-started-app.

    $ docker run -dp 127.0.0.1:3000:3000 ^
        -w /app --mount "type=bind,src=%cd%,target=/app" ^
        node:18-alpine ^
        sh -c "yarn install && yarn run dev"
    

    Voici une décomposition de la commande :

    • -dp 127.0.0.1:3000:3000 - comme avant. Exécuter en mode détaché (arrière-plan) et créer un mappage de port
    • -w /app - définit le "répertoire de travail" ou le répertoire courant depuis lequel la commande s'exécutera
    • --mount "type=bind,src=%cd%,target=/app" - monte par liaison le répertoire courant depuis l'hôte dans le répertoire /app du conteneur
    • node:18-alpine - l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfile
    • sh -c "yarn install && yarn run dev" - la commande. Vous démarrez un shell en utilisant sh (alpine n'a pas bash) et exécutez yarn install pour installer les packages puis exécutez yarn run dev pour démarrer le serveur de développement. Si vous regardez dans le package.json, vous verrez que le script dev démarre nodemon.
  3. Vous pouvez regarder les journaux en utilisant docker logs <container-id>. Vous saurez que vous êtes prêt quand vous verrez ceci :

    $ docker logs -f <container-id>
    nodemon -L src/index.js
    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): *.*
    [nodemon] watching extensions: js,mjs,json
    [nodemon] starting `node src/index.js`
    Using sqlite database at /etc/todos/todo.db
    Listening on port 3000
    

    Quand vous avez fini de regarder les journaux, sortez en appuyant sur Ctrl+C.

  1. Assurez-vous de ne pas avoir de conteneurs getting-started en cours d'exécution actuellement.

  2. Exécutez la commande suivante depuis le répertoire getting-started-app.

    $ docker run -dp 127.0.0.1:3000:3000 \
        -w //app --mount type=bind,src="/$(pwd)",target=/app \
        node:18-alpine \
        sh -c "yarn install && yarn run dev"
    

    Voici une décomposition de la commande :

    • -dp 127.0.0.1:3000:3000 - comme avant. Exécuter en mode détaché (arrière-plan) et créer un mappage de port
    • -w //app - définit le "répertoire de travail" ou le répertoire courant depuis lequel la commande s'exécutera
    • --mount type=bind,src="/$(pwd)",target=/app - monte par liaison le répertoire courant depuis l'hôte dans le répertoire /app du conteneur
    • node:18-alpine - l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfile
    • sh -c "yarn install && yarn run dev" - la commande. Vous démarrez un shell en utilisant sh (alpine n'a pas bash) et exécutez yarn install pour installer les packages puis exécutez yarn run dev pour démarrer le serveur de développement. Si vous regardez dans le package.json, vous verrez que le script dev démarre nodemon.
  3. Vous pouvez regarder les journaux en utilisant docker logs <container-id>. Vous saurez que vous êtes prêt quand vous verrez ceci :

    $ docker logs -f <container-id>
    nodemon -L src/index.js
    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): *.*
    [nodemon] watching extensions: js,mjs,json
    [nodemon] starting `node src/index.js`
    Using sqlite database at /etc/todos/todo.db
    Listening on port 3000
    

    Quand vous avez fini de regarder les journaux, sortez en appuyant sur Ctrl+C.

Assurez-vous de ne pas avoir de conteneurs getting-started en cours d'exécution actuellement.

Exécutez l'image avec un montage de liaison.

  1. Sélectionnez la boîte de recherche en haut de Docker Desktop.

  2. Dans la fenêtre de recherche, sélectionnez l'onglet Images.

  3. Dans la boîte de recherche, spécifiez le nom du conteneur, getting-started.

    Tip

    Utilisez le filtre de recherche pour filtrer les images et montrer seulement les Images locales.

  4. Sélectionnez votre image puis sélectionnez Exécuter.

  5. Sélectionnez Paramètres optionnels.

  6. Dans Chemin hôte, spécifiez le chemin vers le répertoire getting-started-app sur votre machine hôte.

  7. Dans Chemin conteneur, spécifiez /app.

  8. Sélectionnez Exécuter.

Vous pouvez regarder les journaux du conteneur en utilisant Docker Desktop.

  1. Sélectionnez Conteneurs dans Docker Desktop.
  2. Sélectionnez le nom de votre conteneur.

Vous saurez que vous êtes prêt quand vous verrez ceci :

nodemon -L src/index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

Développer votre application avec le conteneur de développement

Mettez à jour votre application sur votre machine hôte et voyez les changements reflétés dans le conteneur.

  1. Dans le fichier src/static/js/app.js, à la ligne 109, changez le bouton "Add Item" pour dire simplement "Add" :

    - {submitting ? 'Adding...' : 'Add Item'}
    + {submitting ? 'Adding...' : 'Add'}
    

    Sauvegardez le fichier.

  2. Actualisez la page dans votre navigateur web, et vous devriez voir le changement reflété presque immédiatement grâce au montage de liaison. Nodemon détecte le changement et redémarre le serveur. Cela peut prendre quelques secondes pour que le serveur Node redémarre. Si vous obtenez une erreur, essayez d'actualiser après quelques secondes.

    Capture d'écran du libellé mis à jour pour le bouton Add
  3. N'hésitez pas à faire d'autres changements que vous aimeriez faire. Chaque fois que vous faites un changement et sauvegardez un fichier, le changement est reflété dans le conteneur grâce au montage de liaison. Quand Nodemon détecte un changement, il redémarre l'application à l'intérieur du conteneur automatiquement. Quand vous avez terminé, arrêtez le conteneur et construisez votre nouvelle image en utilisant :

    $ docker build -t getting-started .
    

Résumé

À ce stade, vous pouvez persister votre base de données et voir les changements dans votre application pendant que vous développez sans reconstruire l'image.

En plus des montages de volume et des montages de liaison, Docker supporte aussi d'autres types de montage et pilotes de stockage pour gérer des cas d'usage plus complexes et spécialisés.

Informations connexes :

Étapes suivantes

Afin de préparer votre application pour la production, vous devez migrer votre base de données de SQLite vers quelque chose qui peut mieux s'adapter à l'échelle. Pour la simplicité, vous continuerez à utiliser une base de données relationnelle et basculerez votre application pour utiliser MySQL. Mais, comment devriez-vous exécuter MySQL ? Comment permettez-vous aux conteneurs de se parler ? Vous apprendrez cela dans la section suivante.