(未成功)Docker Desktop for mac部署kind容器使用共享NFS卷
警告
本文方案实践尚未成功,可能是因为 Docker Desktop for mac 的物理主机文件系统 APFS 加密文件系统
影响。所以后续我准备切换到 X86移动云Kind(本地docker模拟k8s集群) 再做实践。
在 Docker容器使用NFS 使用 Docker systemd进程管理器 来运行NFS服务器,和本文区别仅是 init
差异,所以应该也解决不了Docker卷的 does not support NFS export
问题。
备注
我在 Docker 卷 学习过程仔细阅读了Docker官方文档 docker docs: Storage >> Volumes 发现:
Docker 卷 是指运行Docker服务的主机上的卷,也就是说在 Docker Desktop for mac中,是指运行于 xhyve - macOS平台的KVM 中的Linux虚拟机
在 Docker Desktop for mac 实践物理主机目录 mount 到容器内部再 NFS sharing 目前没有成功 ,我改变方案,采用 (正在探索)Docker Desktop for mac部署kind容器通过 SSH Tunnel 使用共享NFS卷
在 在kind运行简单的容器 访问共享的NFS可以部署一种共享数据的发布模式:
我在 Docker Desktop for mac 端口转发(port forwarding) 基础上进一步设置 dev-gw
容器提供NFS服务
准备工作
调整
dev-gw
容器运行命令,将物理主机的docs
目录作为卷映射到dev-gw
内部:
dev-gw
容器: 物理主机的docs目录被卷映射进 dev-gw
为后续NFS服务提供存储目录IPTABLES_DIR="/Users/huataihuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
DOCS_DIR="/Users/huataihuang/docs"
docker run -itd -p 122:22 -p 10000-10099:10000-10099 --network kind \
--cap-add=NET_ADMIN --cap-add=NET_RAW \
--mount type=bind,source="${IPTABLES_DIR}"/iptables_port_forwarding,target=/root/iptables_port_forwarding,readonly \
-v ${DOCS_DIR}:/docs \
--hostname dev-gw --name dev-gw fedora-gw
NFS服务配置
采用 Ubuntu NFS部署 相似方法配置NFS服务,在
dev-gw
容器内部修改配置文件/etc/exports
内容:
dev-gw
容器内部添加 /etc/exports/docs *(rw,sync,no_root_squash,no_subtree_check)
在容器内部运行启动NFS服务进行验证:
exportfs -a rpcbind rpc.statd rpc.nfsd rpc.mountd
异常排查
执行 exprotfs -a
提示错误:
exportfs: /docs does not support NFS export
执行 rpc.nfsd
提示错误:
rpc.nfsd: Unable to request RDMA services: Protocol not supported
参考 itsthenetwork/nfs-server-alpine ,在容器中运行NFS服务器,
docker run
需要使用参数--privileged
:
dev-gw
容器: 卷 docs
以及增加运行参数 --privileged
IPTABLES_DIR="/Users/huataihuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
DOCS_DIR="/Users/huataihuang/docs"
docker run -itd -p 122:22 -p 10000-10099:10000-10099 --network kind \
--cap-add=NET_ADMIN --cap-add=NET_RAW \
--mount type=bind,source="${IPTABLES_DIR}"/iptables_port_forwarding,target=/root/iptables_port_forwarding,readonly \
--privileged \
-v ${DOCS_DIR}:/docs \
--hostname dev-gw --name dev-gw fedora-gw
不过, --privileged
参数不能解决 exportfs: /docs does not support NFS export
, itsthenetwork/nfs-server-alpine 提到了 OverlayFS
不支持NFS输出,需要使用 Docker 卷 挂载到容器内部。不过,我确实是使用了:
DOCS_DIR="/Users/huataihuang/docs"
docker run ... -v ${DOCS_DIR}:/docs ...
参考 directory does not support NFS #61 ,我尝试改为 bind mount
:
dev-gw
容器: 使用 bind mount
卷 docs
以及增加运行参数 --privileged
IPTABLES_DIR="/Users/huataihuang/docs/github.com/cloud-atlas/source/kubernetes/kind/docker_macos_kind_port_forwarding"
DOCS_DIR="/Users/huataihuang/docs"
docker run -itd -p 122:22 -p 10000-10099:10000-10099 --network kind \
--cap-add=NET_ADMIN --cap-add=NET_RAW \
--mount type=bind,source="${IPTABLES_DIR}"/iptables_port_forwarding,target=/root/iptables_port_forwarding,readonly \
--privileged \
--mount type=bind,source=${DOCS_DIR},target=/docs \
--hostname dev-gw --name dev-gw fedora-gw
但是报错依旧是 exportfs: /docs does not support NFS export
备注
我怀疑在 macOS 上运行的 Docker Desktop for mac
的底层文件系统 APFS 加密文件系统
影响了容器化运行NFS输出,所以我后续准备在 X86移动云Kind(本地docker模拟k8s集群) 重新实践(底层使用 ZFS)
备注
docker docs: Volumes 应该能够直接创建自带NFS输出的Docker卷,待实践
参考
GitHub: mjstealey/nfs-in-docker 提供了 docker-entrypoint.sh 参考脚本
itsthenetwork/nfs-server-alpine 给出了很多有关容器中运行NFS服务器的思路和建议