在docker容器中安装nfs共享

有谁知道如何装载docker容器内的nfs共享与centos基本形象? 我试过这个命令:

mount server:/dir /mount/point 

并得到了下一个错误:

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 

对于使用mount ,你需要CAP_SYS_ADMINfunction,在创build容器的时候这个function被Docker删除。

有几个解决scheme:

  1. --privileged=true标志启动容器。 这会导致Docker不删除任何能够允许从容器中挂载NFS共享的function。 这可能是一个安全问题; 不要在不受信任的容器中这样做。
  2. 在主机上挂载NFS共享,并将其作为主机卷传递到容器中:

     you@host > mount server:/dir /path/to/mount/point you@host > docker run -v /path/to/mount/point:/path/to/mount/point 
  3. 使用Docker卷插件(如Netshare插件)将NFS共享作为容器卷直接安装:

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

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

 nfs-server:/path_to_mount on /path_dest type nfs 

接着:

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

但是docker守护进程总是报告下面的错误:

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

经过多次search后,我发现这个错误实际上来自docker守护进程,它以“root”身份运行。 当docker运行一个容器来装载容器时,会要求docker守护进程装载它。 问题是,NFS服务器将不同地处理“根” 。 默认情况下,NFS服务器会将“root”映射到“nobody” ,导致错误消息: reference

从docker 17.06开始,你可以直接在运行时将NFS共享挂载到容器上,而不需要额外的function

docker run --mount 'type=volume,src=VOL_NAME,volume-driver=local,dst=/LOCAL-MNT,volume-opt=type=nfs,volume-opt=device=:/NFS-SHARE,"volume-opt=o=addr=NFS-SERVER,vers=4,hard,timeo=600,rsize=1048576,wsize=1048576,retrans=2"' -d -it --name mycontainer ubuntu

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

我在Docker容器上挂载nfs,感谢@helmbert。

  1. 使用--privileged=true标志运行--privileged=true容器。

     $ docker run -it --privileged=true centos:7 bash [root@f7915ae635aa /]# yum install -y nfs-utils 
  2. 安装nfs工具包并在CentOS上挂载nfs。

     [root@f7915ae635aa /]# yum install -y nfs-utils [root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock 
  3. 显示nfs服务器的挂载。

     [root@f7915ae635aa /]# showmount example.tw Hosts on example.tw: 10.10.10.1 10.10.10.2