docker部署nfs服务器v3v4

虽然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在防火墙后环境中部署。

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-alpinegists/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 \
# -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

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


docker部署nfs服务器v3v4
https://linshenkx.github.io/docker-nfs-server-v3-v4/
作者
John Doe
发布于
2022年9月20日
许可协议