|
|
一楼是我尝试自己创建nfs容器镜像的过程
二楼是方便我以后用导出的镜像直接搭建
- --------------------------------------------------------------------------------------------------------------------
- 算了,我还是自己用rockylinux9.3搭建nfs客户端吧
- 先不使用--net=host 我手动放行端口111和2049 然后额外的几个端口我临时用iptables放行
- docker run -it \
- -d \
- --name=nfs_server \
- --restart unless-stopped \
- -e TZ=Asia/Shanghai \
- --privileged \
- --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
- -v /root/docker/nfs/nfs_share:/root/nfs_share \
- rockylinux:9.3 bash
- docker exec -it nfs_server bash
- yum install -y nfs-utils rpcbind net-tools
- 然后编辑配置文件
- vi /etc/exports
- /root/nfs_share *(rw,sync,no_root_squash,no_all_squash,insecure)
- # 启动rpcbind服务
- rpcbind -w
- # 创建nfs运行所需的目录(如果不存在)
- #mkdir -p /var/lib/nfs/v4recovery #已经有了
- touch /var/lib/nfs/etab /var/lib/nfs/rmtab /var/lib/nfs/xtab
- # 启动nfs服务相关进程
- exportfs -r
- mount -t nfsd nfsd /proc/fs/nfsd
- rpc.nfsd 8
- rpc.mountd -N 2 #是否不应该填写后面的参数 最开始还有个 -N 3的 一会重新测试不挂参数
- 检查exportfs -v
- 到这里就运行好了
- ip是172.17.0.5
- 执行到这一步,后面卡了,然后开始问AI
- -------------------------------------------------------------
- 我用rockylinux9.3的docker镜像创建了docker容器,命令如下
- docker run -it \
- -d \
- --name=rocky9.3 \
- --restart unless-stopped \
- -e TZ=Asia/Shanghai \
- --privileged \
- -v /root/docker/nfs/nfs_share:/root/nfs_share \
- rockylinux:9.3 bash
- 然后打算在容器内安装nfs服务端
- 先进入容器docker exec -it rocky9.3 bash
- 然后执行安装命令yum install nfs-utils rpcbind net-tools -y
- 然后编辑配置文件
- vi /etc/exports
- /root/nfs_share *(rw,sync,no_root_squash)
- 但是检查exportfs -v的时候提示下面的错误
- exportfs: can't open /var/lib/nfs/etab for reading
- 这个应该怎么解决?
- -------------------------------------------------------------
- /root/nfs_share *(rw,sync,no_root_squash,no_all_squash,insecure)里面
- no_all_squash和insecure这两个的作用
- -------------------------------------------------------------
- docker stop rocky9.3我用这个命令打算停止这个开启了nfs的容器,但是提示下面的内容
- Error response from daemon: cannot stop container: rocky9.3: tried to kill container, but did not receive an exit event
- 这个时候容器还是被结束了
- 为什么会不能正常停止容器,是否需要我先在容器内停止nfs服务?
- 哦,就是因为nfs服务还在运行,解决办法就是先停止nfs相关进程
- # 1. 进入容器
- docker exec -it rocky9.3 bash
- # 2. 停止NFS相关进程(优雅清理)
- rpc.nfsd 0 # 停止nfsd进程
- killall rpc.mountd # 停止mountd进程
- killall rpcbind # 停止rpcbind进程
- exit # 退出容器
- # 3. 停止容器(此时不会报错)
- docker stop rocky9.3
- 然后测试重新启动
- docker start rocky9.3
- docker exec -it rocky9.3 bash
- # 启动服务
- rpcbind -w #这一步会产生111端口监听
- exportfs -r
- mount -t nfsd nfsd /proc/fs/nfsd
- rpc.nfsd 8 #这一步会产生剩余端口监听
- rpc.mountd -N 2
- 检查
- rpcinfo -p localhost
- 应该有100003和100005
- -------------------------------------------------------------
- 然后开始弄客户端,直接写总结的吧 不要写过程了
- docker run -it \
- -d \
- --name=nfs_client \
- --restart unless-stopped \
- -e TZ=Asia/Shanghai \
- --cap-add SYS_ADMIN \
- --cap-add DAC_READ_SEARCH \
- --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
- -v /root/docker/nfs/nfs_share_client:/root/nfs_share \
- rockylinux:9.3 bash
- docker exec -it nfs_client bash
- yum install -y nfs-utils net-tools
- rpcbind -w
- showmount -e 172.17.0.5 #提示正常
- mount -t nfs 172.17.0.5:/root/nfs_share /root/nfs_share
- OK,客户端链接成功 忘记写了,-v参数可能后面还有加:share 貌似这里不用加,会提示无效参数 这里写错了,应该是shared
- -------------------------------------------------------------
- 先把这个导出试试
- 52ea419beebc
- docker export 52ea419beebc > /root/docker/docker-image/nfs_client-export.tar
- 然后导出server
- 0442ca5cd39b
- docker export 0442ca5cd39b > /root/docker/docker-image/nfs_server-export.tar
- -------------------------------------------------------------
- 然后测试导入
- cat /root/docker/docker-image/nfs_client-export.tar | docker import - nfs-client:latest
- cat /root/docker/docker-image/nfs_server-export.tar | docker import - nfs-server:latest
- -------------------------------------------------------------
- 然后用刚刚导入的镜像创建server
- docker run -it \
- -d \
- --name=nfs \
- --restart unless-stopped \
- -e TZ=Asia/Shanghai \
- --privileged \
- --net=host \
- --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
- -v /root/docker/nfs/nfs_share:/root/nfs_share \
- nfs-server:latest bash
- 测试不要用端口映射,直接host模式试试
- -p 111:111/tcp -p 111:111/udp \
- -p 2049:2049/tcp -p 2049:2049/udp \
- -p 32767:32767/tcp -p 32767:32767/udp \
- -p 32768:32768/tcp -p 32768:32768/udp \
- 防火墙设置
- iptables -I FORWARD 1 -p tcp -m multiport --dport 111,2049 -j INPUT_SSH___________________ -m comment --comment "NFS只允许我自己访问"
- 如果是远程服务器,是否还需要多映射一些端口
- netstat -antp
- 41747
- 20048
- 45023
- netstat -anup
- 111
- 45515
- 20048
- 60534
- iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 41747 -j DNAT --to 172.17.0.4:41747
- iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 20048 -j DNAT --to 172.17.0.4:20048
- iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 45023 -j DNAT --to 172.17.0.4:45023
- iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 111 -j DNAT --to 172.17.0.4:111
- iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 45515 -j DNAT --to 172.17.0.4:45515
- iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 20048 -j DNAT --to 172.17.0.4:20048
- iptables -t nat -A DOCKER ! -i docker0 -p udp --dport 60534 -j DNAT --to 172.17.0.4:60534
- docker exec -it nfs bash
- # 启动服务
- rpcbind -w #这一步会产生111端口监听
- exportfs -r
- mount -t nfsd nfsd /proc/fs/nfsd
- rpc.nfsd 8 #这一步会产生剩余端口监听
- rpc.mountd
- #rpc.statd
- 检查
- rpcinfo -p localhost
- 应该有100003和100005
- IP是172.17.0.4
- -------------------------------------------------------------
- 然后用刚刚导入的镜像创建client
- docker run -it \
- -d \
- --name=nfs_client_daoru \
- --restart unless-stopped \
- -e TZ=Asia/Shanghai \
- --cap-add SYS_ADMIN \
- --cap-add DAC_READ_SEARCH \
- --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
- -v /root/docker/nfs/nfs_share_client:/root/nfs_share \
- nfs-client:latest bash
- docker exec -it nfs_client_daoru bash
- rpcbind -w
- showmount -e 172.17.0.4 #提示正常
- mount -t nfs 172.17.0.4:/root/nfs_share /root/nfs_share
- OK,成功
- ---------------------------------
- 测试用另外一台服务器当client
- docker run -it \
- -d \
- --name=nfs_client \
- --restart unless-stopped \
- -e TZ=Asia/Shanghai \
- --cap-add SYS_ADMIN \
- --cap-add DAC_READ_SEARCH \
- --mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup,ro \
- -v /root/nfs_share_client:/root/nfs_share:shared \
- nfs-client:latest bash
- #测试直接用最高权限
- --privileged \
- docker exec -it nfs_client bash
- rpcbind -w
- showmount -e 110.42.34.125 #这里卡住了,是否需要在服务端开放更多端口?
- mount -t nfs 110.42.34.125:/root/nfs_share /root/nfs_share
- OK,成功
- 继续问问
- 在110.42.34.125这台服务器上,我只对nfs的docker容器映射了111和2049端口
- 然后我在另外一台服务器上用这条命令挂载nfs
- mount -t nfs 110.42.34.125:/root/nfs_share /root/nfs_share
- 提示
- mount.nfs: mounting 110.42.34.125:/root/nfs_share failed, reason given by server: No such file or directory
- 请问是服务器端口没有映射全吗?
- 大概率是端口没有映射全,我在服务器上的client连内网IP是能成功的
- 最后服务端使用host网络就成功了
- -------------------------------------------------------------
- 这个是我问AI的过程
- https://www.doubao.com/thread/w850cb687bc542a99
复制代码 |
|