荣耀之链论坛

 找回密码
 立即注册
搜索
查看: 38|回复: 1

docker搭建NFS

[复制链接]

1440

主题

2676

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11333
发表于 2026-2-22 12:57 | 显示全部楼层 |阅读模式
一楼是我尝试自己创建nfs容器镜像的过程


二楼是方便我以后用导出的镜像直接搭建



  1. --------------------------------------------------------------------------------------------------------------------

  2. 算了,我还是自己用rockylinux9.3搭建nfs客户端吧
  3. 先不使用--net=host 我手动放行端口111和2049 然后额外的几个端口我临时用iptables放行
  4. docker run -it \
  5. -d \
  6. --name=nfs_server \
  7. --restart unless-stopped \
  8. -e TZ=Asia/Shanghai \
  9. --privileged \
  10. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  11. -v /root/docker/nfs/nfs_share:/root/nfs_share \
  12. rockylinux:9.3 bash

  13. docker exec -it nfs_server bash
  14. yum install -y nfs-utils rpcbind net-tools
  15. 然后编辑配置文件
  16. vi /etc/exports
  17. /root/nfs_share *(rw,sync,no_root_squash,no_all_squash,insecure)



  18. # 启动rpcbind服务
  19. rpcbind -w

  20. # 创建nfs运行所需的目录(如果不存在)
  21. #mkdir -p /var/lib/nfs/v4recovery  #已经有了
  22. touch /var/lib/nfs/etab /var/lib/nfs/rmtab /var/lib/nfs/xtab

  23. # 启动nfs服务相关进程
  24. exportfs -r
  25. mount -t nfsd nfsd /proc/fs/nfsd
  26. rpc.nfsd 8
  27. rpc.mountd -N 2 #是否不应该填写后面的参数 最开始还有个 -N 3的 一会重新测试不挂参数
  28. 检查exportfs -v


  29. 到这里就运行好了
  30. ip是172.17.0.5












  31. 执行到这一步,后面卡了,然后开始问AI
  32. -------------------------------------------------------------
  33. 我用rockylinux9.3的docker镜像创建了docker容器,命令如下
  34. docker run -it \
  35. -d \
  36. --name=rocky9.3 \
  37. --restart unless-stopped \
  38. -e TZ=Asia/Shanghai \
  39. --privileged \
  40. -v /root/docker/nfs/nfs_share:/root/nfs_share \
  41. rockylinux:9.3 bash
  42. 然后打算在容器内安装nfs服务端
  43. 先进入容器docker exec -it rocky9.3 bash
  44. 然后执行安装命令yum install nfs-utils rpcbind net-tools -y
  45. 然后编辑配置文件
  46. vi /etc/exports
  47. /root/nfs_share *(rw,sync,no_root_squash)
  48. 但是检查exportfs -v的时候提示下面的错误
  49. exportfs: can't open /var/lib/nfs/etab for reading
  50. 这个应该怎么解决?
  51. -------------------------------------------------------------
  52. /root/nfs_share *(rw,sync,no_root_squash,no_all_squash,insecure)里面
  53. no_all_squash和insecure这两个的作用
  54. -------------------------------------------------------------
  55. docker stop rocky9.3我用这个命令打算停止这个开启了nfs的容器,但是提示下面的内容
  56. Error response from daemon: cannot stop container: rocky9.3: tried to kill container, but did not receive an exit event
  57. 这个时候容器还是被结束了  
  58. 为什么会不能正常停止容器,是否需要我先在容器内停止nfs服务?

  59. 哦,就是因为nfs服务还在运行,解决办法就是先停止nfs相关进程
  60. # 1. 进入容器
  61. docker exec -it rocky9.3 bash
  62. # 2. 停止NFS相关进程(优雅清理)
  63. rpc.nfsd 0          # 停止nfsd进程
  64. killall rpc.mountd  # 停止mountd进程
  65. killall rpcbind     # 停止rpcbind进程
  66. exit                # 退出容器
  67. # 3. 停止容器(此时不会报错)
  68. docker stop rocky9.3

  69. 然后测试重新启动
  70. docker start rocky9.3
  71. docker exec -it rocky9.3 bash
  72. # 启动服务
  73. rpcbind -w #这一步会产生111端口监听
  74. exportfs -r
  75. mount -t nfsd nfsd /proc/fs/nfsd
  76. rpc.nfsd 8 #这一步会产生剩余端口监听
  77. rpc.mountd -N 2
  78. 检查
  79. rpcinfo -p localhost
  80. 应该有100003和100005

  81. -------------------------------------------------------------
  82. 然后开始弄客户端,直接写总结的吧 不要写过程了

  83. docker run -it \
  84. -d \
  85. --name=nfs_client \
  86. --restart unless-stopped \
  87. -e TZ=Asia/Shanghai \
  88. --cap-add SYS_ADMIN \
  89. --cap-add DAC_READ_SEARCH \
  90. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  91. -v /root/docker/nfs/nfs_share_client:/root/nfs_share \
  92. rockylinux:9.3 bash

  93. docker exec -it nfs_client bash
  94. yum install -y nfs-utils net-tools
  95. rpcbind -w
  96. showmount -e 172.17.0.5 #提示正常
  97. mount -t nfs 172.17.0.5:/root/nfs_share /root/nfs_share

  98. OK,客户端链接成功  忘记写了,-v参数可能后面还有加:share  貌似这里不用加,会提示无效参数 这里写错了,应该是shared
  99. -------------------------------------------------------------
  100. 先把这个导出试试
  101. 52ea419beebc
  102. docker export 52ea419beebc > /root/docker/docker-image/nfs_client-export.tar

  103. 然后导出server
  104. 0442ca5cd39b
  105. docker export 0442ca5cd39b > /root/docker/docker-image/nfs_server-export.tar

  106. -------------------------------------------------------------
  107. 然后测试导入
  108. cat /root/docker/docker-image/nfs_client-export.tar | docker import - nfs-client:latest
  109. cat /root/docker/docker-image/nfs_server-export.tar | docker import - nfs-server:latest

  110. -------------------------------------------------------------
  111. 然后用刚刚导入的镜像创建server
  112. docker run -it \
  113. -d \
  114. --name=nfs \
  115. --restart unless-stopped \
  116. -e TZ=Asia/Shanghai \
  117. --privileged \
  118. --net=host \
  119. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  120. -v /root/docker/nfs/nfs_share:/root/nfs_share \
  121. nfs-server:latest bash

  122. 测试不要用端口映射,直接host模式试试
  123. -p 111:111/tcp -p 111:111/udp \
  124. -p 2049:2049/tcp -p 2049:2049/udp \
  125. -p 32767:32767/tcp -p 32767:32767/udp \
  126. -p 32768:32768/tcp -p 32768:32768/udp \
  127. 防火墙设置
  128. iptables -I FORWARD 1 -p tcp -m multiport --dport 111,2049 -j INPUT_SSH___________________ -m comment --comment "NFS只允许我自己访问"

  129. 如果是远程服务器,是否还需要多映射一些端口
  130. netstat -antp
  131. 41747
  132. 20048
  133. 45023
  134. netstat -anup
  135. 111
  136. 45515
  137. 20048
  138. 60534

  139. iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 41747 -j DNAT --to 172.17.0.4:41747
  140. iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 20048 -j DNAT --to 172.17.0.4:20048
  141. iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 45023 -j DNAT --to 172.17.0.4:45023


  142. iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 111 -j DNAT --to 172.17.0.4:111
  143. iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 45515 -j DNAT --to 172.17.0.4:45515
  144. iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 20048 -j DNAT --to 172.17.0.4:20048
  145. iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 60534 -j DNAT --to 172.17.0.4:60534


  146. docker exec -it nfs bash
  147. # 启动服务
  148. rpcbind -w #这一步会产生111端口监听
  149. exportfs -r
  150. mount -t nfsd nfsd /proc/fs/nfsd
  151. rpc.nfsd 8 #这一步会产生剩余端口监听
  152. rpc.mountd
  153. #rpc.statd
  154. 检查
  155. rpcinfo -p localhost
  156. 应该有100003和100005
  157. IP是172.17.0.4

  158. -------------------------------------------------------------
  159. 然后用刚刚导入的镜像创建client

  160. docker run -it \
  161. -d \
  162. --name=nfs_client_daoru \
  163. --restart unless-stopped \
  164. -e TZ=Asia/Shanghai \
  165. --cap-add SYS_ADMIN \
  166. --cap-add DAC_READ_SEARCH \
  167. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  168. -v /root/docker/nfs/nfs_share_client:/root/nfs_share \
  169. nfs-client:latest bash

  170. docker exec -it nfs_client_daoru bash
  171. rpcbind -w
  172. showmount -e 172.17.0.4 #提示正常
  173. mount -t nfs 172.17.0.4:/root/nfs_share /root/nfs_share
  174. OK,成功
  175. ---------------------------------
  176. 测试用另外一台服务器当client
  177. docker run -it \
  178. -d \
  179. --name=nfs_client \
  180. --restart unless-stopped \
  181. -e TZ=Asia/Shanghai \
  182. --cap-add SYS_ADMIN \
  183. --cap-add DAC_READ_SEARCH \
  184. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  185. -v /root/nfs_share_client:/root/nfs_share:shared \
  186. nfs-client:latest bash

  187. #测试直接用最高权限
  188. --privileged \

  189. docker exec -it nfs_client bash
  190. rpcbind -w
  191. showmount -e 110.42.34.125 #这里卡住了,是否需要在服务端开放更多端口?
  192. mount -t nfs 110.42.34.125:/root/nfs_share /root/nfs_share
  193. OK,成功

  194. 继续问问
  195. 在110.42.34.125这台服务器上,我只对nfs的docker容器映射了111和2049端口
  196. 然后我在另外一台服务器上用这条命令挂载nfs
  197. mount -t nfs 110.42.34.125:/root/nfs_share /root/nfs_share
  198. 提示
  199. mount.nfs: mounting 110.42.34.125:/root/nfs_share failed, reason given by server: No such file or directory
  200. 请问是服务器端口没有映射全吗?
  201. 大概率是端口没有映射全,我在服务器上的client连内网IP是能成功的

  202. 最后服务端使用host网络就成功了

  203. -------------------------------------------------------------
  204. 这个是我问AI的过程
  205. https://www.doubao.com/thread/w850cb687bc542a99
复制代码
回复

使用道具 举报

1440

主题

2676

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11333
 楼主| 发表于 2026-2-22 13:33 | 显示全部楼层

  1. 我把镜像打包了
  2. 然后最终总结的使用方法:

  3. 先上传镜像,然后导入
  4. cat /root/docker/docker-image/nfs_client-export.tar | docker import - nfs-client:latest
  5. cat /root/docker/docker-image/nfs_server-export.tar | docker import - nfs-server:latest

  6. --------------------------------------------------------------------------------------------

  7. 服务端:
  8. docker run -it \
  9. -d \
  10. --name=nfs \
  11. --restart unless-stopped \
  12. -e TZ=Asia/Shanghai \
  13. --privileged \
  14. --net=host \
  15. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  16. -v /root/docker/nfs/nfs_share:/root/nfs_share \
  17. nfs-server:latest bash

  18. 防火墙严格设置:
  19. iptables -A INPUT -p tcp -m multiport --dport 111,2049 -j INPUT_SSH___________________ -m comment --comment "NFS只允许我自己访问"


  20. docker exec -it nfs bash
  21. # 启动服务
  22. rpcbind -w #这一步会产生111端口监听
  23. exportfs -r
  24. mount -t nfsd nfsd /proc/fs/nfsd
  25. rpc.nfsd 8 #这一步会产生剩余端口监听
  26. rpc.mountd

  27. #检查具体用了哪些端口
  28. rpcinfo -p
  29. #结果如下
  30.    program vers proto   port  service
  31.     100000    4   tcp    111  portmapper
  32.     100000    3   tcp    111  portmapper
  33.     100000    2   tcp    111  portmapper
  34.     100000    4   udp    111  portmapper
  35.     100000    3   udp    111  portmapper
  36.     100000    2   udp    111  portmapper
  37.     100003    3   tcp   2049  nfs
  38.     100003    4   tcp   2049  nfs
  39.     100227    3   tcp   2049  nfs_acl
  40.     100021    1   udp  37543  nlockmgr
  41.     100021    3   udp  37543  nlockmgr
  42.     100021    4   udp  37543  nlockmgr
  43.     100021    1   tcp  36141  nlockmgr
  44.     100021    3   tcp  36141  nlockmgr
  45.     100021    4   tcp  36141  nlockmgr
  46.     100005    1   udp  20048  mountd
  47.     100005    1   tcp  20048  mountd
  48.     100005    2   udp  20048  mountd
  49.     100005    2   tcp  20048  mountd
  50.     100005    3   udp  20048  mountd
  51.     100005    3   tcp  20048  mountd
  52. #然后防火墙只放行这些端口,只允许指定客户端访问
  53. iptables -A INPUT -p tcp -m multiport --dport 36141,20048 -j INPUT_SSH___________________ -m comment --comment "NFS只允许我自己访问"
  54. iptables -A INPUT -p udp -m multiport --dport 111,37543,20048 -j INPUT_SSH___________________ -m comment --comment "NFS只允许我自己访问"
  55. #到这里服务端就设置完全了


  56. --------------------------------------------------------------------------------------------


  57. 客户端:
  58. docker run -it \
  59. -d \
  60. --name=nfs_client \
  61. --restart unless-stopped \
  62. -e TZ=Asia/Shanghai \
  63. --cap-add SYS_ADMIN \
  64. --cap-add DAC_READ_SEARCH \
  65. --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
  66. -v /root/nfs_share_client:/root/nfs_share:shared \
  67. nfs-client:latest bash
  68. 说明:主要是-v参数后面的shared,这个参数加了以后,在docker内挂载了nfs,才可以在物理机访问

  69. docker exec -it nfs_client bash
  70. rpcbind -w
  71. showmount -e 110.42.34.125 #这一步其实可以不要,这个是检测的
  72. mount -t nfs 110.42.34.125:/root/nfs_share /root/nfs_share
  73. OK,成功


  74. --------------------------------------------------------------------------------------------
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

荣耀之链

GMT+8, 2026-3-20 06:47 , Processed in 0.014698 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表