104 votes

Comment Docker Swarm implémente-t-il le partage de volume?

Docker Essaim peut gérer deux types de stockage: volume et de la lier. Alors que bind est pas suggéré par le Panneau de Documentation puisque elle créer une liaison entre un répertoire local (sur chaque essaim Nœud) pour une tâche, le volume de la méthode de la mise en œuvre n'est pas mentionné, donc je ne comprends pas la façon dont les volumes sont partagés entre les tâches.

Comment Docker Essaim actions des volumes entre les nœuds? Où sont les volumes enregistrés (sur un manager? et si il y a plus d'un gère?)?

Il n'y a pas de problème entre les nœuds si il runnings sur des machines différentes dans les différents net? La création d'un VPN?

77voto

Bret Fisher Points 3076

Ce que vous demandez est une question commune. Les données de Volume et les caractéristiques de ce que ce volume sont gérés par un volume de pilote. Comme vous pouvez l'utiliser différents pilotes de réseau comme overlay, bridgeou host, vous pouvez utiliser différents volume des pilotes.

Docker et l'Essaim ne viennent avec la norme local conducteur hors de la boîte. Il n'a pas de prise de conscience de l'Essaim, et il va juste créer de nouveaux volumes de vos données sur n'importe quel nœud votre service les tâches sont planifiées sur. Ce n'est généralement pas ce que vous voulez.

Vous voulez un 3ème partie pilote plugin qui est de l'Essaim de conscience, et de s'assurer que le volume que vous avez créé pour une tâche de service est disponible sur la droite de nœud au bon moment. Les Options comprennent l'utilisation de "Docker pour AWS/Azure" et ses CloudStor pilote, ou l'open source les plus populaires REX-Ray solution.

Il y a beaucoup de 3ème partie du volume des pilotes, que vous pouvez trouver sur le Panneau de Magasin.

70voto

BMitch Points 3744

Essaim Mode lui-même ne pas faire quelque chose de différent avec les volumes, il fonctionne quel que soit le volume de la commande mount que vous fournissez sur le nœud où le conteneur est en cours d'exécution. Si votre montage de volume est locale pour ce nœud, vos données seront sauvegardées localement sur ce nœud. Il n'est pas construit dans la fonctionnalité de déplacer des données entre les nœuds automatiquement.

Il y a certains logiciels de distribution basé sur les solutions de stockage de GlusterFS et Docker a appelé Infinit qui n'est pas encore GA et de développement sur qui a pris une banquette arrière à la Kubernetes l'intégration de l'EE.

Le résultat typique de est, vous avez besoin pour gérer la réplication de stockage au sein de votre application (par exemple etcd et d'autres radeau de base des algorithmes) ou vous effectuez votre monte sur un système de stockage externe (je l'espère avec son propre HA). Montage d'un système de stockage externe a deux options, de les bloquer ou de fichier de base. Bloc en fonction de stockage (par exemple, l'EBS) vient généralement avec des performances supérieures, mais est limitée à être monté sur un nœud unique. Pour cela, vous aurez généralement besoin d'un 3ème partie du volume plugin pilote pour donner à votre panneau de nœud d'accès à ce bloc de stockage. Stockage de fichier de base (par exemple EFS) a une baisse de rendement, mais il est plus portable, et peuvent être simultanément monté sur plusieurs nœuds, ce qui est utile pour un service replié.

La plus fréquente des fichiers de stockage réseau est NFS (c'est le même protocole utilisé par le système EFS). Et vous pouvez monter sans aucune 3ème partie plugin pilotes. Malheureusement nommé "local" volume plugin pilote que le panneau est livré avec de vous donner la possibilité de passer toutes les valeurs que vous voulez à la commande mount avec les options de pilote, et sans option, la valeur par défaut pour le stockage de volumes dans le menu fixe répertoire /var/lib/docker/volumes. Avec les options, vous pouvez passer à l'NFS paramètres, et il va même jusqu'à effectuer une recherche DNS sur le NFS nom d'hôte (quelque chose que vous n'avez pas avec NFS normalement). Voici un exemple des différentes façons de monter un système de fichiers NFS en utilisant le volume de pilote:

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

  # or from the docker run command
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or to create a service
  $ docker service create \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
  ...

10voto

super_p Points 172

Ma solution pour AWS EFS, qui fonctionne:

  1. Créer EFS (ne pas oublier d'ouvrir le port 2049 NFS au groupe de sécurité)
  2. Installer le paquet nfs-common:

    sudo apt-get install -y nfs-common

  3. Vérifiez si votre système de fichiers efs:

    mkdir efs-test-point
    sudo chmod go+rw efs-test-point
    sudo mount-t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,dur,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
    touch efs-test-point/1.txt
    sudo umount efs-test-point/
    ls-la efs-test-point/

    le répertoire doit être vide

    sudo mount-t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,dur,timeo=600,retrans=2,noresvport [YOUR_EFS_DNS]:/ efs-test-point

    ls -la efs-test-point/

    fichier 1.txt doit existe

  4. Configurer docker-composer.fichier yml:

    services:
    sidekiq:
    volumes:
     - uploads_tmp_efs:/home/application/public/uploads/tmp
    ...
    volumes:
    uploads_tmp_efs:
     pilote: local
    driver_opts:
     type: nfs
     o: addr=[YOUR_EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,dur,timeo=600,retrans=2
     appareil: [YOUR_EFS_DNS]:/

-1voto

the hand of NOD Points 322

Après une recherche dans la documentation et dans le menu fixe les discussions que j'ai été en mesure de trouver les informations suivantes concernant ce problème:

  • lier le montage d'un hôte-répertoire dans un récipient (docker run -v /some/host/dir/:/container/path/) utilise les fichiers qui sont présents sur l'hôte. Si l'hôte-répertoire n'existe pas, un nouveau répertoire vide est créé sur l'ordinateur hôte et monté dans le conteneur (cela va changer à l'avenir, et un message d'erreur est affiché à la place)
  • à l'aide d'un "nameless" volume (docker run -v /container/path) va créer un nouveau volume, et de copier le contenu de /conteneur/chemin dans ce volume
  • à l'aide d'un "nommé" volume (docker run -v somename:/container/path) va créer un nouveau volume, nommé "abc", ou de l'utilisation de l'existant "abc" volume", et utiliser les fichiers qui sont présents à l'intérieur qu' le volume. Si le volume est nouvellement créé, il sera vide.

Source: Discussion sur Github

La raison de tout cela est:

Ce n'est pas un bug, il a agi comme cela parce qu'il faut le faire. Pour l' anonyme volume, menu fixe sait que les volumes sont entièrement contrôlés par lui-même, de sorte que le panneau peut faire anythings il pense que correct(Ici est la copie les fichiers dans l'image pour le volume). Mais le nom de volume est conçu pour le volume de plugin, de sorte que le panneau ne sais pas ce qu'il devrait faire, et ne rien.

Source: discussion sur Github

Donc, vous avez à utiliser un Volume pilote qui prend en charge ce qui en effet peut être trouvé à l'docker magasin

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X