备注
我在 Docker 卷 学习过程仔细阅读了 Docker 官方文档 docker docs: Storage » Volumes 发现:
- Docker 卷 是指运行 Docker 服务的主机上的卷,也就是说在 Docker Desktop for mac 中,是指运行于 xhyve - macOS 平台的 KVM 中的 Linux 虚拟机
在 Docker Desktop for windows 实践物理主机目录 mount 到容器内部再 NFS sharing 目前没有成功 ,我改变方案,采用 (正在探索)Docker Desktop for mac 部署 kind 容器通过 SSH Tunnel 使用共享 NFS 卷
在 在 kind 运行简单的容器 访问共享的 NFS 可以部署一种共享数据的发布模式:
- 容器内部不需要复制发布的文件,对于静态 WEB 网站会非常容易实现无状态 pod 部署
- 数据更新可以在中心化的 nfs 服务 存储上实现,方便 DevOps Atlas 持续部署
我在 Docker Desktop for mac 端口转发(port forwarding) 基础上进一步设置 dev-gw
容器提供 NFS 服务
准备工作¶
- 调整
dev-gw
容器运行命令,将物理主机的docs
目录作为卷映射到dev-gw
内部:
运行 dev-gw
容器: 物理主机的 docs 目录被卷映射进 dev-gw
为后续 NFS 服务提供存储目录¶
|
|
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 卷,待实践
nfs 部署 storageclass
|
|
部署 nfs client 插件
|
|
3. 创建 pvc
|
|
创建
|
|
查看 pvc
|
|
4. 部署测试 pod
|
|
创建 测试 pod
|
|
查看 pod
|
|
查看 pv 是否动态创建:
|
|
好了是不是用起来很方便,还有其他的很多存储可以测试自己搞一套试试。
参考¶
- GitHub: mjstealey/nfs-in-docker 提供了 docker-entrypoint.sh 参考脚本
- NFS Docker Volumes: How to Create and Use
- docker docs: Volumes
- itsthenetwork/nfs-server-alpine 给出了很多有关容器中运行 NFS 服务器的思路和建议