挂载nfs网络共享目录到本地目录报错
背景:nfs服务器(172.17.0.16),nfs客户端都是docker容器
报错内容如下:
mount 172.17.0.16:/share /data/share
Job for rpc-statd.service failed because a timeout was exceeded.
See "systemctl status rpc-statd.service" and "journalctl -xe" for details.
mount.nfs: mounting 172.17.0.16:/share failed, reason given by server: No such file or directory
猜想1:可能是和nfs镜像所在的系统版本有关,于是测试了centos8,centos7,都没用。
猜想2:是nfs服务器端容器的问题,容器的部分组件未启动或被精简掉了。
测试2:docker pull专门针对nfs共享的镜像namazu510/nfs-server。然后通过该镜像创建并运行容器,作为nfs服务器端:docker run -dti --name node10 --hostname node10 --privileged=true -v /usr/apps/:/usr/apps/ -p :9010:80 namazu510/nfs-server /sbin/init
node10的IP是172.17.0.2。
猜想3:也可能和IP别名有关,因为nfs客户端和服务器端都是采用的IP别名,相互之间用IP别名通信(原因是容器中很难固定成静态IP,用了个偷懒的办法)。
测试3:取消别名再测试,没用。
猜想4:也可能和容器启动时执行的命令有关,将/sbin/init 改为 bash 试试,没用。
测试4:docker run -dti --name node16 --hostname node16 --privileged=true -v /usr/apps/:/usr/apps/ -p :9116:80 centos7-nginx-custom:v3.0 bash ,创建并运行nfs服务器端的容器,使用bash作为1号进程,不过这样的话,systemctl等命令都无法使用,根本行不通。
猜想5:和容器本身的局限性有关,也是网上查到一个资料说容器中的nfs是要依赖宿主机的内核的,估计容器很难执行mount。
(网上的资料摘录:问题出在docker-machine上.如果要使用nfs挂载,则需要在机器本身运行modprobe nfs,而不是在容器中运行.容器使用机器的内核.与modprobe nfs和nfs服务器相同。)
测试5-1:在lenovo实体机上测试,没问题。
lenovo实体机上装nfs服务器端并启动,并设置好共享文件夹,在lenovo中的docker容器内安装nfs-utils,然后不用启动nfs,直接mount lenovo的IP:/share /data/share,成功。
测试5-2:容器nfs客户端,能mount到asus实体机上的nfs服务端共享文件夹。
最终得出结论,在容器中很难配置成功NFS服务器!
最终方法:在asus实体机中搭建nfs服务器,作为服务器端。
详细搭建链接