web-dev-qa-db-fra.com

Docker - Volumes VS Montage Lié. Quels sont les cas d'utilisation?

Après avoir lu et joué avec Docker pendant un court instant, je envisage de l'utiliser dans mon environnement de production. Cependant, j'essaie toujours de comprendre la différence entre les liaisons de montage et les volumes.

Selon Dockers Documentation sur le montage BINDS ( https://docs.docker.com/storage/bind-mounts/ ):

Les supports de liaison ont été autour depuis les premiers jours de Docker. Les supports de liaison ont une fonctionnalité limitée par rapport aux volumes. Lorsque vous utilisez une monture de liaison, un fichier ou un répertoire de la machine hôte est monté dans un conteneur. Le fichier ou le répertoire est référencé par son chemin complet ou relatif de la machine hôte. En revanche, lorsque vous utilisez un volume, un nouveau répertoire est créé dans le répertoire de stockage de Docker sur la machine hôte et Docker gère ce contenu de répertoire.

À partir de ceci (et de jouer autour), il me semble que les liaisons de montage et les volumes sont la même chose, la seule différence étant l'emplacement des données. (Volumes stockés dans la zone de stockage "Private" de Docker, tandis que le mont Liéts peut être stocké n'importe où). Oui, la liaison de montage doit exister avant de démarrer le conteneur Docker, tandis que les volumes peuvent être créés par le moteur Docker lorsque le conteneur commence - mais cette différence est une performance irrévérencée ou une maintenance sage.

Je n'ai pas pu comprendre les avantages soi-disant des volumes énoncés par la documentation ( https://docs.docker.com/storage/volumes/ ) Comme tous semblent s'appliquer à la liaison de montage juste le même.

Quelqu'un peut-il expliquer les principales différences entre les volumes et les montagnes (performances et entretien sage) et surtout leurs cas d'utilisation?

merci pour l'aide.

12
GKman

Par défaut, un volume nommé local est exactement comme vous le décrivez, une monture de liaison à un répertoire Docker spécial. Les différences que je vois:

  • Premièrement, le Big One est une différence de comportement entre les volumes nommés et les volumes d'hôte (alias Bind Supports). Docker initialisera un volume nommé à partir du contenu de l'image. Cela inclut les propriétaires de fichiers et les autorisations. Cela signifie que vous pouvez éviter de vous soucier des problèmes d'autorisation couramment rencontrés avec des volumes d'hôte.

  • Deuxièmement, la portabilité. Les volumes nommés peuvent être utilisés à partir de différents hôtes Docker sans se soucier des chemins de fichier de fichiers locaux ou de l'utilisateur exécutant les commandes. Que ce soit sur un ordinateur portable MacOS ou un serveur Linux en production, vous pouvez simplement nommer un volume et supposer qu'il fonctionnera dans le cadre de l'installation de Docker par défaut.

  • Troisièmement, comment ils sont gérés. Les volumes d'hôte sont généralement gérés en dehors de Docker, où les problèmes d'autorisation entrent souvent en jeu (puisque UID/GID sur l'hôte ne correspondent généralement pas à l'UID/GID à l'intérieur du conteneur). Avec les volumes nommés, vous les géreriez dans un autre conteneur Docker où vous pouvez contrôler les outils installés, les utilisateurs créés, etc.

Il y a aussi une autre grande différence avec les volumes nommés. C'est parce que j'ai dit "par défaut" ci-dessus et qu'un volume nommé peut être configuré de différentes manières. Le pilote de volume peut être changé en un autre qui est au courant des nuages. Ou vous pouvez passer des options sur le pilote de volume local pour passer de la montée de liaison locale à un répertoire spécifique à tout ce que vous pouvez faire avec le mont Syscall. Cela inclut l'exécution d'une montagne de liaison à un répertoire différent, un montage NFS, et vous pouvez même créer votre propre système de fichiers superposé en tant que volume pour permettre aux conteneurs d'accéder et de modifier certaines données à l'intérieur du conteneur sans modifier les fichiers sous-jacents dans une couche de base.

En utilisant des volumes nommés, vous pouvez également séparer la gestion du stockage de la gestion des conteneurs. Vous indiquez simplement le nom et un outil externe pourrait créer ce volume pour pointer vers l'emplacement approprié dans cet environnement.

Quelques exemples de volumes nommés que j'ai utilisés avec le pilote de volume local incluent:

# named bind mount
$ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

# nfs
$ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=nfs.example.com,rw \
      --opt device=:/path/to/dir \
      foo

# overlay
$ docker volume create --driver local --opt type=overlay \
    --opt o=lowerdir=${PWD}/ro-data,upperdir=${PWD}/upper1,workdir=${PWD}/work1 \
    --opt device=overlay overlay1
6
BMitch