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

Partage de fichiers locaux avec les conteneurs

Explication

Chaque conteneur a tout ce dont il a besoin pour fonctionner sans dépendre de dépendances pré-installées sur la machine hôte. Comme les conteneurs s'exécutent de manière isolée, ils ont une influence minimale sur l'hôte et les autres conteneurs. Cette isolation présente un avantage majeur : les conteneurs minimisent les conflits avec le système hôte et les autres conteneurs. Cependant, cette isolation signifie également que les conteneurs ne peuvent pas accéder directement aux données sur la machine hôte par défaut.

Imaginez un scénario où vous avez un conteneur d'application web qui nécessite un accès aux paramètres de configuration stockés dans un fichier sur votre système hôte. Ce fichier peut contenir des données sensibles telles que des informations d'identification de base de données ou des clés API. Le stockage de telles informations sensibles directement dans l'image du conteneur présente des risques de sécurité, en particulier lors du partage d'images. Pour relever ce défi, Docker propose des options de stockage qui comblent le fossé entre l'isolation des conteneurs et les données de votre machine hôte.

Docker propose deux options de stockage principales pour la persistance des données et le partage de fichiers entre la machine hôte et les conteneurs : les volumes et les montages de liaison.

Volume versus montages de liaison

Si vous voulez vous assurer que les données générées ou modifiées à l'intérieur du conteneur persistent même après l'arrêt du conteneur, vous opteriez pour un volume. Voir Persistance des données du conteneur pour en savoir plus sur les volumes et leurs cas d'utilisation.

Si vous avez des fichiers ou des répertoires spécifiques sur votre système hôte que vous souhaitez partager directement avec votre conteneur, comme des fichiers de configuration ou du code de développement, vous utiliseriez un montage de liaison. C'est comme ouvrir un portail direct entre votre hôte et votre conteneur pour le partage. Les montages de liaison sont idéaux pour les environnements de développement où l'accès et le partage de fichiers en temps réel entre l'hôte et le conteneur sont cruciaux.

Partage de fichiers entre un hôte et un conteneur

Les indicateurs -v (ou --volume) et --mount utilisés avec la commande docker run vous permettent de partager des fichiers ou des répertoires entre votre machine locale (hôte) et un conteneur Docker. Cependant, il existe des différences clés dans leur comportement et leur utilisation.

L'indicateur -v est plus simple et plus pratique pour les opérations de base de volume ou de montage de liaison. Si l'emplacement de l'hôte n'existe pas lors de l'utilisation de -v ou --volume, un répertoire sera automatiquement créé.

Imaginez que vous êtes un développeur travaillant sur un projet. Vous avez un répertoire source sur votre machine de développement où réside votre code. Lorsque vous compilez ou construisez votre code, les artefacts générés (code compilé, exécutables, images, etc.) sont enregistrés dans un sous-répertoire distinct de votre répertoire source. Dans les exemples suivants, ce sous-répertoire est /HOST/PATH. Vous souhaitez maintenant que ces artefacts de construction soient accessibles à l'intérieur d'un conteneur Docker exécutant votre application. De plus, vous souhaitez que le conteneur accède automatiquement aux derniers artefacts de construction chaque fois que vous reconstruisez votre code.

Voici une façon d'utiliser docker run pour démarrer un conteneur à l'aide d'un montage de liaison et le mapper à l'emplacement du fichier du conteneur.

$ docker run -v /HOST/PATH:/CONTAINER/PATH -it nginx

L'indicateur --mount offre des fonctionnalités plus avancées et un contrôle plus granulaire, ce qui le rend adapté aux scénarios de montage complexes ou aux déploiements de production. Si vous utilisez --mount pour monter par liaison un fichier ou un répertoire qui n'existe pas encore sur l'hôte Docker, la commande docker run ne le crée pas automatiquement pour vous mais génère une erreur.

$ docker run --mount type=bind,source=/HOST/PATH,target=/CONTAINER/PATH,readonly nginx
Note

Docker recommande d'utiliser la syntaxe --mount au lieu de -v. Elle offre un meilleur contrôle sur le processus de montage et évite les problèmes potentiels liés aux répertoires manquants.

Permissions de fichiers pour l'accès de Docker aux fichiers de l'hôte

Lorsque vous utilisez des montages de liaison, il est crucial de s'assurer que Docker dispose des autorisations nécessaires pour accéder au répertoire de l'hôte. Pour accorder un accès en lecture/écriture, vous pouvez utiliser l'indicateur :ro (lecture seule) ou :rw (lecture-écriture) avec l'indicateur -v ou --mount lors de la création du conteneur. Par exemple, la commande suivante accorde une autorisation d'accès en lecture-écriture.

$ docker run -v HOST-DIRECTORY:/CONTAINER-DIRECTORY:rw nginx

Les montages de liaison en lecture seule permettent au conteneur d'accéder aux fichiers montés sur l'hôte en lecture, mais il ne peut pas les modifier ou les supprimer. Avec les montages de liaison en lecture-écriture, les conteneurs peuvent modifier ou supprimer les fichiers montés, et ces modifications ou suppressions seront également répercutées sur le système hôte. Les montages de liaison en lecture seule garantissent que les fichiers sur l'hôte ne peuvent pas être modifiés ou supprimés accidentellement par un conteneur.

Partage de fichiers synchronisé

À mesure que votre base de code s'agrandit, les méthodes traditionnelles de partage de fichiers comme les montages de liaison peuvent devenir inefficaces ou lentes, en particulier dans les environnements de développement où un accès fréquent aux fichiers est nécessaire. Les partages de fichiers synchronisés améliorent les performances des montages de liaison en tirant parti des caches de système de fichiers synchronisés. Cette optimisation garantit que l'accès aux fichiers entre l'hôte et la machine virtuelle (VM) est rapide et efficace.

Essayez-le

Dans ce guide pratique, vous vous entraînerez à créer et à utiliser un montage de liaison pour partager des fichiers entre un hôte et un conteneur.

Exécuter un conteneur

  1. Téléchargez et installez Docker Desktop.

  2. Démarrez un conteneur à l'aide de l'image httpd avec la commande suivante :

    $ docker run -d -p 8080:80 --name my_site httpd:2.4
    

    Cela démarrera le service httpd en arrière-plan et publiera la page Web sur le port 8080 de l'hôte.

  3. Ouvrez le navigateur et accédez à http://localhost:8080 ou utilisez la commande curl pour vérifier si cela fonctionne correctement ou non.

    $ curl localhost:8080
    

Utiliser un montage de liaison

À l'aide d'un montage de liaison, vous pouvez mapper le fichier de configuration de votre ordinateur hôte à un emplacement spécifique dans le conteneur. Dans cet exemple, vous verrez comment modifier l'apparence de la page Web en utilisant un montage de liaison :

  1. Supprimez le conteneur existant à l'aide du tableau de bord de Docker Desktop :

    Une capture d'écran du tableau de bord de Docker Desktop montrant comment supprimer le conteneur httpd
  2. Créez un nouveau répertoire appelé public_html sur votre système hôte.

    $ mkdir public_html
    
  3. Naviguez dans le répertoire public_html nouvellement créé et créez un fichier appelé index.html avec le contenu suivant. Il s'agit d'un document HTML de base qui crée une page Web simple qui vous accueille avec une baleine amicale.

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title> Mon site Web avec une baleine et Docker !</title>
    </head>
    <body>
    <h1>Bienvenue !!</h1>
    <p>Regardez ! Il y a une baleine amicale qui vous salue !</p>
    <pre id="docker-art">
       ##         .
      ## ## ##        ==
     ## ## ## ## ##    ===
     /"""""""""""""""""\___/ ===

{ / ===- ______ O / \ \ / _______/

Bonjour de Docker !
</pre>
</body>
</html>
```
  1. Il est temps d'exécuter le conteneur. Les exemples --mount et -v produisent le même résultat. Vous ne pouvez pas les exécuter tous les deux à moins de supprimer le conteneur my_site après avoir exécuté le premier.

    ```console
    $ docker run -d --name my_site -p 8080:80 -v .:/usr/local/apache2/htdocs/ httpd:2.4
    ```
    
    ```console
    $ docker run -d --name my_site -p 8080:80 --mount type=bind,source=./,target=/usr/local/apache2/htdocs/ httpd:2.4
    ```
    
    Tip

    Lorsque vous utilisez l'indicateur -v ou --mount dans Windows PowerShell, vous devez fournir le chemin absolu de votre répertoire au lieu de simplement ./. C'est parce que PowerShell gère les chemins relatifs différemment de bash (couramment utilisé dans les environnements Mac et Linux).

    Avec tout maintenant en place et en cours d'exécution, vous devriez pouvoir accéder au site via http://localhost:8080 et trouver une nouvelle page Web qui vous accueille avec une baleine amicale.

Accéder au fichier sur le tableau de bord de Docker Desktop

  1. Vous pouvez afficher les fichiers montés à l'intérieur d'un conteneur en sélectionnant l'onglet Fichiers du conteneur, puis en sélectionnant un fichier dans le répertoire /usr/local/apache2/htdocs/. Ensuite, sélectionnez Ouvrir l'éditeur de fichiers.

    Une capture d'écran du tableau de bord de Docker Desktop montrant les fichiers montés à l'intérieur d'un conteneur
  2. Supprimez le fichier sur l'hôte et vérifiez que le fichier est également supprimé dans le conteneur. Vous constaterez que les fichiers n'existent plus sous Fichiers dans le tableau de bord de Docker Desktop.

    Une capture d'écran du tableau de bord de Docker Desktop montrant les fichiers supprimés à l'intérieur d'un conteneur
  3. Recréez le fichier HTML sur le système hôte et voyez que le fichier réapparaît sous l'onglet Fichiers sous Conteneurs sur le tableau de bord de Docker Desktop. À présent, vous devriez également pouvoir accéder au site.

Arrêtez votre conteneur

Le conteneur continue de s'exécuter jusqu'à ce que vous l'arrêtiez.

  1. Allez à la vue Conteneurs dans le tableau de bord de Docker Desktop.

  2. Localisez le conteneur que vous souhaitez arrêter.

  3. Sélectionnez l'action Supprimer dans la colonne Actions.

Une capture d'écran du tableau de bord de Docker Desktop montrant comment supprimer le conteneur

Ressources supplémentaires

Les ressources suivantes vous aideront à en savoir plus sur les montages de liaison :

Prochaines étapes

Maintenant que vous avez appris à partager des fichiers locaux avec des conteneurs, il est temps d'en apprendre davantage sur les applications multi-conteneurs.