Monter le répertoire hôte dans un conteneur Docker

Isaac Tony 30 janvier 2023
  1. Utiliser les montages de liaison pour monter le répertoire hôte dans un conteneur Docker
  2. Conclusion
Monter le répertoire hôte dans un conteneur Docker

Outre d’autres fonctionnalités, Docker fournit des outils pour travailler avec le système d’exploitation hôte et le système de fichiers conteneur. Parmi ces fonctionnalités, il y a la possibilité de conserver des données dans des conteneurs et de partager des données entre conteneurs en montant des répertoires sur des conteneurs Docker.

Le montage de répertoires sur des conteneurs Docker est utile dans un environnement de développement et de production. Outre la création de services qui dépendent des répertoires du système hôte, cela garantit que l’ensemble du système de fichiers n’est pas détruit si un conteneur Docker est détruit.

Supposons que nous souhaitions créer une nouvelle version du conteneur. Dans ce cas, le montage direct d’un répertoire sur un conteneur Docker permet le rechargement à chaud.

Cet article nécessite que Docker soit correctement configuré et dispose d’une image et d’un conteneur Docker. Cela fonctionnera indépendamment du fait que nous exécutons Docker sur wsl ou Linux.

Utiliser les montages de liaison pour monter le répertoire hôte dans un conteneur Docker

Les montages de liaison sont l’une des premières solutions qui nous permettent de conserver les données en montant nos conteneurs Docker dans des répertoires sur notre système hôte. Ceux-ci nous permettront de référencer un répertoire en se référant au chemin de fichier absolu du répertoire cible.

Dans ce cas, Docker ne contrôle pas ce répertoire, contrairement au cas des volumes Docker. Les volumes Docker créent un répertoire dans le système de stockage Docker géré par Docker.

De plus, contrairement aux volumes Docker, nous ne pouvons pas gérer directement les répertoires montés sur nos conteneurs via la CLI Docker ou l’API Docker. Cependant, les montages Docker sont très performants sur des hôtes tels que MAC ou Windows, où les volumes Docker sont légèrement performants.

Nous devons également noter que l’utilisation de montages liés pour monter un conteneur dans un répertoire gonflera sûrement la taille du conteneur.

Nous pouvons utiliser deux drapeaux pour monter un répertoire sur un conteneur lors du lancement du conteneur. Ceux-ci incluent les drapeaux -v et --mount.

Monter le répertoire hôte dans un conteneur Docker à l’aide de l’indicateur -v ou --volume

Il se compose de trois champs qui doivent toujours être dans le bon ordre et séparés par deux-points. Ceux-ci inclus:

  • Le chemin d’accès au répertoire sur la machine hôte que nous voulons monter.
  • Le chemin d’accès au répertoire dans le conteneur où nous devons monter ce répertoire.
  • D’autres options facultatives telles que ro spécifient le mode lecture seule.
docker run -t -i -v <host_dir>:<container_dir

Une fois que nous avons identifié le répertoire hôte et conteneur que nous voulons monter ensemble, nous pouvons implémenter la commande ci-dessus. Cependant, nous ne devons pas apporter de modifications aux fichiers sensibles.

En effet, les montages nous donnent accès à des fichiers sensibles qui, s’ils sont altérés, peuvent entraîner une défaillance fatale de notre système.

Dans ce cas, nous utiliserons les images ruby ​​officielles pour créer un conteneur et monter un répertoire. Nous avons nommé les scripts avec un nom de répertoire, de même avec le conteneur Docker.

isaac@DESKTOP-HV44HT6:~/isaac$ docker run -it --rm -v$HOME/Desktop/scripts:/scripts --name scripts ruby bash
Unable to find image 'ruby:latest' locally
latest: Pulling from library/ruby
e4d61adff207: Pull complete
4ff1945c672b: Pull complete
ff5b10aec998: Pull complete
12de8c754e45: Pull complete
ada1762e7602: Pull complete
f8f0dec0b2ef: Pull complete
7109f2ab3080: Pull complete
fe1e1dda18a5: Pull complete
Digest: sha256:a1ebc64daa170324dde5b668829de85487575eaa2bdea5216b4c983b1822f9df
Status: Downloaded newer image for ruby:latest

Si nous n’avons pas l’image localement, Docker la téléchargera automatiquement. Une fois le processus de construction du conteneur terminé, Docker ouvrira le conteneur pour nous.

root@9d057cf9e33d:/#
root@9d057cf9e33d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  scripts  srv  sys  tmp  usr  var
root@9d057cf9e33d:/# cd scripts
root@9d057cf9e33d:/scripts# ls

Nous pouvons voir que le répertoire des scripts dans le conteneur est vide.

Maintenant, allons dans le répertoire des scripts de notre machine hôte et créons un nouveau fichier dans ce répertoire. Cela se reflétera automatiquement dans les scripts du répertoire du conteneur Docker.

isaac@DESKTOP-HV44HT6:~/Desktop$ cd scripts
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ touch new_file.txt
touch: cannot touch 'new_file.txt': Permission denied
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ ls
new_file.txt
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$

Une fois que nous avons créé un fichier dans le répertoire local, il sera affiché dans le répertoire conteneur ci-dessous.

root@913609933be2:/scripts# ls
new_file.txt

Monter le répertoire hôte dans un conteneur Docker à l’aide de l’indicateur --mount

Il s’agit d’une méthode plus simple que la balise -v et consiste en plusieurs paires clé-valeur, séparées par des virgules. Pour ces balises, l’ordre des champs n’a pas d’importance.

Cependant, il est plus verbeux par rapport à la balise -v.

Ces méthodes consistent en les commandes suivantes :

  • Le type de montage tel que Bind, volume, ou tmpfs.
  • La source, c’est-à-dire le chemin vers le répertoire sur l’hôte que nous voulons monter, est généralement notée src.
  • La destination, c’est-à-dire le chemin d’accès au répertoire sur le conteneur où nous voulons monter le répertoire.
  • Nous avons également d’autres options telles que l’option de lecture seule et la propagation de liaison qui peuvent spécifier ce répertoire comme privé ou partagé.

Une fois que nous avons pris note de tous les champs nécessaires, en particulier la source et la destination, nous pouvons exécuter la commande comme indiqué ci-dessous.

Dans ce cas, nous utilisons l’image officielle de Nginx pour construire le conteneur et mappons le nom du répertoire local new_scripts vers un répertoire situé dans etc/nginx.

$ docker run -d \
> -it \
> --mount type=bind,source=$HOME/Desktop/scripts/new_scripts,target=/etc/nginx \
> nginx \
> bash
e079e3254970e290ae68473239e101c6aa8ba4ba56482c75cd21f9bb9f49600b

Maintenant que nous avons correctement mappé les deux répertoires, toute modification apportée au répertoire sur l’hôte se répercutera automatiquement sur le répertoire du conteneur.

isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ ls
new_file.txt

Ce fichier sera reflété dans le répertoire docker mappé à ce répertoire, montrant que nous avons correctement mappé les deux répertoires.

root@e079e3254970:/etc# cd nginx
root@e079e3254970:/etc/nginx# ls
new_file.txt

Conclusion

Nous avons démontré avec succès comment monter des répertoires à l’aide des balises Docker -v et -mount.

Cependant, il faut également noter que lors de l’utilisation des balises -v pour monter un répertoire inexistant, Docker le créera automatiquement ; ce n’est pas le même cas lors de l’utilisation de la balise Docker --mount.

Nous devrions plutôt envisager d’utiliser des volumes Docker lors du développement d’une nouvelle application.

Auteur: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Article connexe - Docker Container