虽然nfs-server的docker镜像有很多,但总有这样或那样的问题,容易踩坑。
这里分享一下自己的使用记录。
v3
使用的镜像是:erichough/nfs-server
相关链接见:https://hub.docker.com/r/erichough/nfs-server 、 https://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在防火墙后环境中部署。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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
|
客户端操作:
1 2 3 4 5 6
| 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-alpine 或 gists/nfs-server
建议用gists/nfs-server,支持NFS_OPTION,配置更加清晰
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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 \
|
客户端操作:
注意这里用的是 / ,而非 /nfsshare
NFSv4将所有共享使用一个虚拟文件系统展示给客户端。
伪文件系统根目录(/)使用fsid=0标示,只有一个共享可以是fsid=0。
客户端需要使用“nfs server ip:/”挂载伪文件系统,
伪文件系统一般使用RO方式共享, 其他共享可以通过mount –bind选项在伪文件系统目录下挂载。
客户端挂载过程需要通过mount –t nfs4指定NFS版本为4,默认采用nfsv3
现在客户端挂载一般会优先尝试nfsv4,再尝试nfsv3
1 2 3 4 5 6
| mkdir -p /data/nfs-share # 挂载 mount -v -t nfs -o port=32049 主机:/ /data/nfs-share # 卸载 umount /data/nfs-share
|