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.
-
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.NoteL'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.
-
Ouvrez un terminal et changez de répertoire vers le répertoire
getting-started-app
. -
Exécutez la commande suivante pour démarrer
bash
dans un conteneurubuntu
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
), ettarget
est l'endroit où ce répertoire devrait apparaître à l'intérieur du conteneur (/src
). -
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
-
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
-
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
-
Ouvrez le répertoire
getting-started-app
sur l'hôte et observez que le fichiermyfile.txt
est dans le répertoire.├── getting-started-app/ │ ├── Dockerfile │ ├── myfile.txt │ ├── node_modules/ │ ├── package.json │ ├── spec/ │ ├── src/ │ └── yarn.lock
-
Depuis l'hôte, supprimez le fichier
myfile.txt
. -
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
-
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.
-
Assurez-vous de ne pas avoir de conteneurs
getting-started
en cours d'exécution actuellement. -
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 conteneurnode:18-alpine
- l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfilesh -c "yarn install && yarn run dev"
- la commande. Vous démarrez un shell en utilisantsh
(alpine n'a pasbash
) et exécutezyarn install
pour installer les packages puis exécutezyarn run dev
pour démarrer le serveur de développement. Si vous regardez dans lepackage.json
, vous verrez que le scriptdev
démarrenodemon
.
-
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 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 conteneurnode:18-alpine
- l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfilesh -c "yarn install && yarn run dev"
- la commande. Vous démarrez un shell en utilisantsh
(alpine n'a pasbash
) et exécutezyarn install
pour installer les packages puis exécutezyarn run dev
pour démarrer le serveur de développement. Si vous regardez dans lepackage.json
, vous verrez que le scriptdev
démarrenodemon
.
-
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 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 conteneurnode:18-alpine
- l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfilesh -c "yarn install && yarn run dev"
- la commande. Vous démarrez un shell en utilisantsh
(alpine n'a pasbash
) et exécutezyarn install
pour installer les packages puis exécutezyarn run dev
pour démarrer le serveur de développement. Si vous regardez dans lepackage.json
, vous verrez que le scriptdev
démarrenodemon
.
-
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 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 conteneurnode:18-alpine
- l'image à utiliser. Notez que c'est l'image de base pour votre application depuis le Dockerfilesh -c "yarn install && yarn run dev"
- la commande. Vous démarrez un shell en utilisantsh
(alpine n'a pasbash
) et exécutezyarn install
pour installer les packages puis exécutezyarn run dev
pour démarrer le serveur de développement. Si vous regardez dans lepackage.json
, vous verrez que le scriptdev
démarrenodemon
.
-
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.
-
Sélectionnez la boîte de recherche en haut de Docker Desktop.
-
Dans la fenêtre de recherche, sélectionnez l'onglet Images.
-
Dans la boîte de recherche, spécifiez le nom du conteneur,
getting-started
.TipUtilisez le filtre de recherche pour filtrer les images et montrer seulement les Images locales.
-
Sélectionnez votre image puis sélectionnez Exécuter.
-
Sélectionnez Paramètres optionnels.
-
Dans Chemin hôte, spécifiez le chemin vers le répertoire
getting-started-app
sur votre machine hôte. -
Dans Chemin conteneur, spécifiez
/app
. -
Sélectionnez Exécuter.
Vous pouvez regarder les journaux du conteneur en utilisant Docker Desktop.
- Sélectionnez Conteneurs dans Docker Desktop.
- 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.
-
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.
-
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.
-
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.