web-dev-qa-db-fra.com

Comment monter directement un partage/volume NFS dans un conteneur à l'aide de docker compose v3

J'ai un fichier de composition avec v3 où il y a 3 services partageant/utilisant le même volume. Lors de l'utilisation du mode swarm, nous devons créer des conteneurs et des volumes supplémentaires pour gérer nos services sur l'ensemble du cluster. 

Je prévois d'utiliser un serveur NFS afin qu'un seul partage NFS soit monté directement sur tous les hôtes du cluster. 

J'ai trouvé ci-dessous deux façons de le faire, mais des étapes supplémentaires sont nécessaires pour le docker Host -

Existe-t-il un moyen standard d'utiliser directement/monter le partage NFS à l'aide de docker compose v3 en effectuant seulement quelques étapes/aucune étape (je comprends que le package "nfs-common" est requis de toute façon) sur l'hôte docker?

10
vivekyad4v

Après avoir découvert qu'il s'agit d'une masse non documentée, voici la bonne façon de monter un volume NFS à l'aide de la pile et de la composition de menu fixe.

La chose la plus importante est que vous devez utiliser version: "3.2" ou supérieur. Si vous ne le faites pas, vous aurez des erreurs étranges et non évidentes.

Le deuxième problème est que les volumes sont not automatiquement mis à jour lorsque leur définition change. Cela peut vous amener à penser que vos modifications ne sont pas correctes, alors qu'elles ne sont tout simplement pas appliquées. Assurez-vous que vous avez docker rm VOLUMENAME partout où il pourrait être, car si le volume existe, il ne sera pas validé.

Le troisième problème est davantage un problème NFS - Le dossier NFS ne sera ne sera pas créé sur le serveur s'il n'existe pas. C’est ainsi que fonctionne NFS. Vous devez vous assurer qu'il existe avant de faire quoi que ce soit.

(Ne supprimez pas 'soft' et 'nolock' à moins d'être sûr de savoir ce que vous faites - cela empêche le docker de geler si votre serveur NFS s'en va.)

Voici un exemple complet:

[root@docker docker-mirror]# cat nfs-compose.yml
version: "3.2"

services:
  rsyslog:
    image: jumanjiman/rsyslog
    ports:
      - "514:514"
      - "514:514/udp"
    volumes:
      - type: volume
        source: example
        target: /nfs
        volume:
          nocopy: true
volumes:
  example:
    driver_opts:
      type: "nfs"
      o: "addr=10.40.0.199,nolock,soft,rw"
      device: ":/docker/example"



[root@docker docker-mirror]# docker stack deploy --with-registry-auth -c nfs-compose.yml rsyslog
Creating network rsyslog_default
Creating service rsyslog_rsyslog
[root@docker docker-mirror]# docker stack ps rsyslog
ID                  NAME                IMAGE                       NODE                DESIRED STATE       CURRENT STATE                     ERROR               PORTS
tb1dod43fe4c        rsyslog_rsyslog.1   jumanjiman/rsyslog:latest   swarm-4             Running             Starting less than a second ago
[root@docker docker-mirror]#

Maintenant, sur essaim-4:

root@swarm-4:~# docker ps
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS               NAMES
d883e0f14d3f        jumanjiman/rsyslog:latest   "rsyslogd -n -f /e..."   6 seconds ago       Up 5 seconds        514/tcp, 514/udp    rsyslog_rsyslog.1.tb1dod43fe4cy3j5vzsy7pgv5
root@swarm-4:~# docker exec -it d883e0f14d3f df -h /nfs
Filesystem                Size      Used Available Use% Mounted on
:/docker/example          7.2T      5.5T      1.7T  77% /nfs
root@swarm-4:~#

Ce volume sera créé (mais pas détruit) sur n’importe quel nœud en essaim sur lequel la pile est en cours d’exécution.

root@swarm-4:~# docker volume inspect rsyslog_example
[
    {
        "CreatedAt": "2017-09-29T13:53:59+10:00",
        "Driver": "local",
        "Labels": {
            "com.docker.stack.namespace": "rsyslog"
        },
        "Mountpoint": "/var/lib/docker/volumes/rsyslog_example/_data",
        "Name": "rsyslog_example",
        "Options": {
            "device": ":/docker/example",
            "o": "addr=10.40.0.199,nolock,soft,rw",
            "type": "nfs"
        },
        "Scope": "local"
    }
]
root@swarm-4:~#
25
xrobau

Oui, vous pouvez directement référencer un NFS à partir du fichier de composition: 

volumes:
   db-data:
      driver: local
      driver_opts:
        type: nfs
        o: addr=$SOMEIP,rw
        device: ":$PathOnServer"

Et de manière analogue, vous pouvez créer un volume nfs sur chaque hôte.

docker volume create --driver local --opt type=nfs --opt o=addr=$SomeIP,rw --opt device=:$DevicePath --name nfs-docker
5
herm

Ma solution pour AWS EFS, qui fonctionne:

  1. Créer EFS (n'oubliez pas d'ouvrir le port NFS 2049 sur le groupe de sécurité)
  2. Installez le paquet nfs-common:

    Sudo apt-get install -y nfs-common

  3. Vérifiez si votre efs fonctionne:

    mkdir efs-test-point 
     Sudo chmod go + rw efs-test-point
    Sudo mount -t nfs -o nfsvers = 4.1, rsize = 1048576, wsize = 1048576, difficile, temps = 600, retrans = 2, noresvport [YOUR_EFS_DNS]:/efs-test-point
    touchez 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, difficile, temps = 600, retrans = 2, noresvport [YOUR_EFS_DNS]:/efs-test-point

    ls -la efs-test-point/

    le fichier 1.txt doit exister

  4. Configurez le fichier docker-compose.yml:

    prestations de service:
     sidekiq: 
     volumes: 
     - uploads_tmp_efs:/home/application/public/uploads/tmp 
     ...
     volumes: 
     uploads_tmp_efs: 
     pilote: local 
     driver_opts: 
     tapez: nfs 
     o: addr = [YOUR_EFS_DNS], nfsvers = 4.1, taille = 1048576, taille = 1048576, difficile, temps = 600, retransversions = 2 
     périphérique: [YOUR_EFS_DNS]: /

0
super_p