虽然nfs-server的docker镜像有很多,但总有这样或那样的问题,容易踩坑。
这里分享一下自己的使用记录。

v3

使用的镜像是:erichough/nfs-server
相关链接见:https://hub.docker.com/r/erichough/nfs-serverhttps://github.com/ehough/docker-nfs-server
本身说是支持v4的,但截至2020.9月使用v4会有问题,见:https://github.com/ehough/docker-nfs-server/issues/58
使用v3是可以的,但由于v3占用了111端口,所以运行该容器的服务器没办法用nfs-client(rpc-bind用111端口)
而且除了2049,其他的端口没得修改,所以不推荐

NFSv3使用大量辅助协议,客户访问过程首先需要通过portmap/rpcbind获取rpc.mounted监听端口,
然后nfs客户端访问rpc.mounted,nfs服务器根据/etc/exports文件进行客户身份验证,
验证通过后nfs客户端才能与rpc.nfsd建立联系并访问共享。
客户端与服务器数据交互过程的配额管理,文件锁管理以及nfs协议数据统计过程都由单独rpc进程来完成。
所有这些进程除了portmap和nfsd之外都是监听动态随机端口。
NFSv4自身集成辅助协议,只需要TCP 2049一个端口即可,这样极大方便NFS在防火墙后环境中部署。

mkdir -p /opt/nfs-server/share
docker rm -f nfs-server
docker run \
    -d \
    --name nfs-server \
    --restart=always   \
    --privileged \
    -e NFS_VERSION=3 \
      -p 2049:2049   -p 2049:2049/udp   \
      -p 111:111     -p 111:111/udp     \
      -p 32765:32765 -p 32765:32765/udp \
      -p 32767:32767 -p 32767:32767/udp \
    -v /opt/nfs-server/share:/nfs-share \
    -e NFS_EXPORT_0='/nfs-share *(rw,sync,no_root_squash,all_squash,anonuid=0,anongid=0,no_subtree_check)'  \
    erichough/nfs-server
docker logs -f  nfs-server

客户端操作:

mkdir -p /data/nfs-share
# 挂载
mount -v -t nfs -o port=2049 主机:/nfs-share /data/nfs-share
# 卸载
umount /data/nfs-share

v4

使用的镜像是:itsthenetwork/nfs-server-alpinegists/nfs-server

建议用gists/nfs-server,支持NFS_OPTION,配置更加清晰

mkdir -p /opt/nfs-server/share
docker rm -f nfs-server

docker run \
    -d \
    --name nfs-server \
    --restart=always   \
    --privileged \
      -p 32049:2049    \
    -v /opt/nfs-server/share:/nfsshare \
     -e NFS_DIR=/nfsshare   \
     -e NFS_DOMAIN=*   \
     -e NFS_OPTION="fsid=0,rw,sync,no_root_squash,all_squash,anonuid=0,anongid=0,no_subtree_check"   \
    gists/nfs-server
    
docker logs -f  nfs-server

# docker run \
#    -d \
#    --name nfs-server \
#    --restart=always   \
#    --privileged \
#      -p 32049:2049    \
#    -v /opt/nfs-server/share:/nfsshare \
#     -e SHARED_DIRECTORY=/nfsshare   \
#     -e SYNC=true   \
#    itsthenetwork/nfs-server-alpine
    



客户端操作:
注意这里用的是 / ,而非 /nfsshare

NFSv4将所有共享使用一个虚拟文件系统展示给客户端。
伪文件系统根目录(/)使用fsid=0标示,只有一个共享可以是fsid=0。
客户端需要使用“nfs server ip:/”挂载伪文件系统,
伪文件系统一般使用RO方式共享, 其他共享可以通过mount –bind选项在伪文件系统目录下挂载。
客户端挂载过程需要通过mount –t nfs4指定NFS版本为4,默认采用nfsv3

现在客户端挂载一般会优先尝试nfsv4,再尝试nfsv3

mkdir -p /data/nfs-share
# 挂载
mount -v -t nfs -o port=32049 主机:/ /data/nfs-share
# 卸载
umount /data/nfs-share

Q.E.D.