在docker容器中挂载nfs共享

Ana*_*oly 26 mount nfs centos docker

有谁知道如何在带有centos基础图像的docker容器内安装nfs共享?我试过这个命令:

mount server:/dir /mount/point
Run Code Online (Sandbox Code Playgroud)

并得到下一个错误:

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

当我尝试使用-o nolock选项时,错误是:

mount.nfs: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

Thi*_*ves 43

从docker 17.06开始,您可以在运行时直接将NFS共享挂载到容器,而无需额外的功能

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
Run Code Online (Sandbox Code Playgroud)

或者,您可以在容器之前创建卷:

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
Run Code Online (Sandbox Code Playgroud)

得到了https://github.com/moby/moby/issues/28809的提示

  • 这应该是Docker 17.06及以后的第一个答案.我等了很长时间才有这个能力! (3认同)

hel*_*ert 37

对于使用mount,您将需要CAP_SYS_ADMIN在创建容器时由Docker删除的功能.

有几种解决方案:

  1. --cap-add sys_admin旗帜启动容器.这会导致Docker保留该CAP_SYS_ADMIN功能,从而允许您从容器中安装NFS共享.这可能是一个安全问题; 不要在不受信任的容器中执行此操作.[此答案的先前版本建议使用--privileged=true保留所有功能,感谢@earcam提供的建议使用--cap-add].
  2. 在主机上挂载NFS共享,并将其作为主机卷传递到容器中:

    you@host > mount server:/dir /path/to/mount/point
    you@host > docker run -v /path/to/mount/point:/path/to/mount/point
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用Docker卷插件(如Netshare插件)直接将NFS共享挂载为容器卷:

    you@host > docker run \
      --volume-driver=nfs \
      -v server/dir:/path/to/mount/point \
      centos
    
    Run Code Online (Sandbox Code Playgroud)

  • 方法 2. 似乎不起作用。我在本地系统上安装了 NFS,我可以看到所有文件。但是,当我将挂载文件夹作为卷传递给容器时,我只会得到一个空文件夹。我曾尝试按照景秋的建议更改权限,但没有成功。 (3认同)

Jin*_*Qiu 10

对于接受的答案中列出的第二个选项,我不确定您是否确实尝试使用该"docker run -v"命令将主机上的NFS共享作为卷传递给docker容器.我最近尝试这样做,下面是主机上nfs共享的信息:

nfs-server:/path_to_mount on /path_dest type nfs
Run Code Online (Sandbox Code Playgroud)

然后:

docker run -it -v /path_dest:/path_in_docker docker_name bash
Run Code Online (Sandbox Code Playgroud)

但是docker守护程序总是报告以下错误:

docker: Error response from daemon: stat /path_dest: permission denied.
Run Code Online (Sandbox Code Playgroud)

经过多次搜索,我发现错误实际上来自docker守护进程,它以"root"身份运行.当docker运行要装入卷的容器时,它将请求docker守护程序挂载它.问题是,NFS服务器将以不同方式处理"root".默认情况下,NFS服务器会将"root"映射到"nobody",从而导致错误消息:reference