web-dev-qa-db-fra.com

Monter les partages NFS dans le conteneur Docker

Est-ce que quelqu'un sait comment monter un partage nfs dans un conteneur Docker avec une image de base centos? J'ai essayé cette commande:

mount server:/dir /mount/point

et a l'erreur suivante:

mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified

lorsque j'essaie de l'utiliser avec l'option - o nolock, l'erreur est la suivante:

mount.nfs: Operation not permitted
23
Anatoly

Pour utiliser mount, vous aurez besoin du CAP_SYS_ADMIN capacité, supprimée par Docker lors de la création du conteneur.

Il y a plusieurs solutions pour cela:

  1. Démarrer le conteneur avec le --cap-add sys_admin drapeau. Cela force Docker à conserver le CAP_SYS_ADMIN capacité, qui devrait vous permettre de monter un partage NFS à partir du conteneur. Cela pourrait être un problème de sécurité; ne le faites pas dans des conteneurs non fiables. [Une version précédente de cette réponse suggérait d'utiliser le --privileged=true pour conserver toutes les capacités , grâce à @earcam pour la suggestion d’utiliser --cap-add au lieu].
  2. Montez le partage NFS sur l'hôte et transmettez-le au conteneur en tant que volume hôte:

    you@Host > mount server:/dir /path/to/mount/point
    you@Host > docker run -v /path/to/mount/point:/path/to/mount/point
    
  3. Utilisez un plugin de volume Docker (comme le plugin Netshare ) pour monter directement le partage NFS en tant que volume conteneur:

    you@Host > docker run \
      --volume-driver=nfs \
      -v server/dir:/path/to/mount/point \
      centos
    
35
helmbert

À partir du menu 17.06, vous pouvez monter des partages NFS sur le conteneur directement lorsque vous l'exécutez, sans nécessiter de fonctionnalités supplémentaires.

export NFS_VOL_NAME=mynfs NFS_LOCAL_MNT=/mnt/mynfs NFS_SERVER=my.nfs.server.com NFS_SHARE=/my/server/path NFS_OPTS=vers=4,soft

docker run --mount \
  "src=$NFS_VOL_NAME,dst=$NFS_LOCAL_MNT,volume-opt=device=:$NFS_SHARE,\"volume-opt=o=addr=$NFS_SERVER,$NFS_OPTS\",type=volume,volume-driver=local,volume-opt=type=nfs" \
  busybox ls $NFS_LOCAL_MNT

Vous pouvez également créer le volume avant le conteneur:

docker volume create --driver local \
  --opt type=nfs --opt o=addr=$NFS_SERVER,$NFS_OPTS \
  --opt device=:$NFS_SHARE $NFS_VOL_NAME

docker run --rm -v $NFS_VOL_NAME:$NFS_LOCAL_MNT busybox ls $NFS_LOCAL_MNT

Vous avez la suggestion de https://github.com/moby/moby/issues/28809

42
ThiagoAlves

En ce qui concerne la deuxième option répertoriée dans la réponse acceptée, je ne sais pas si vous avez réellement essayé d’utiliser le "docker run -v" commande pour transmettre un partage NFS sur le conteneur Host to docker en tant que volume. J'ai récemment essayé de le faire, voici l'information sur le partage nfs sur l'hôte:

nfs-server:/path_to_mount on /path_dest type nfs

et alors:

docker run -it -v /path_dest:/path_in_docker docker_name bash

Mais le démon docker rapporte toujours l'erreur ci-dessous:

docker: Error response from daemon: stat /path_dest: permission denied.

Après de nombreuses recherches, j'ai constaté que l'erreur venait en réalité du démon docker, qui s'exécute en tant que "racine" . Lorsque docker exécute un conteneur avec un volume à monter, il demande au démon de docker de le monter. Le problème est que le serveur NFS gérera "root" différemment. Par défaut, le serveur NFS mappera la "racine" sur "personne" , provoquant le message d'erreur: référence

10
Jing Qiu

Je monte le nfs sur le conteneur Docker, merci pour @helmbert.

  1. Exécutez un conteneur Docker avec le --privileged=true drapeau.

    $ docker run -it --privileged=true centos:7 bash
    [root@f7915ae635aa /]# yum install -y nfs-utils
    
  2. Installez le package d’outils nfs et montez nfs sur CentOS.

    [root@f7915ae635aa /]# yum install -y nfs-utils
    [root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
    
  3. Afficher le montage du serveur nfs.

    [root@f7915ae635aa /]# showmount example.tw
    Hosts on example.tw:
    10.10.10.1
    10.10.10.2
    
1
Chu-Siang Lai

En ajoutant --cap-add sys_admin signaler au conteneur client ne me suffisait pas. J'avais une erreur:

mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 1.2.3.4:/exports

Après des heures de recherche, j’ai trouvé que cela ressemblait à un privilège complet --privileged est nécessaire pour monter correctement à l'intérieur du conteneur docker.

N'oubliez pas non plus d'installer les packages du client nfs nécessaires dans votre conteneur Docker. Sur les conteneurs basés sur Debian:

apt-get install -y nfs-common
0
Shinebayar G