.. _docker_macos_kind_nfs_sharing:
========================================================
(未成功)Docker Desktop for mac部署kind容器使用共享NFS卷
========================================================
.. warning::
本文方案实践尚未成功,可能是因为 :ref:`docker_desktop` for mac 的物理主机文件系统 ``APFS 加密文件系统`` 影响。所以后续我准备切换到 :ref:`mobile_cloud_x86_kind` 再做实践。
在 :ref:`docker_container_nfs` 使用 :ref:`docker_systemd` 来运行NFS服务器,和本文区别仅是 ``init`` 差异,所以应该也解决不了Docker卷的 ``does not support NFS export`` 问题。
.. note::
我在 :ref:`docker_volume` 学习过程仔细阅读了Docker官方文档 `docker docs: Storage >> Volumes `_ 发现:
- :ref:`docker_volume` 是指运行Docker服务的主机上的卷,也就是说在 :ref:`docker_desktop` for mac中,是指运行于 :ref:`xhyve` 中的Linux虚拟机
**在 Docker Desktop for mac 实践物理主机目录 mount 到容器内部再 NFS sharing 目前没有成功** ,我改变方案,采用 :ref:`docker_macos_kind_nfs_sharing_nfs_ssh_tunnel`
在 :ref:`kind_run_simple_container` 访问共享的NFS可以部署一种共享数据的发布模式:
- 容器内部不需要复制发布的文件,对于静态WEB网站会非常容易实现无状态pod部署
- 数据更新可以在中心化的 :ref:`nfs` 存储上实现,方便 :ref:`devops` 持续部署
我在 :ref:`docker_macos_kind_port_forwarding` 基础上进一步设置 ``dev-gw`` 容器提供NFS服务
准备工作
===========
- 调整 ``dev-gw`` 容器运行命令,将物理主机的 ``docs`` 目录作为卷映射到 ``dev-gw`` 内部:
.. literalinclude:: docker_macos_kind_nfs_sharing/run_dev-gw_container_volume_docs
:language: bash
:caption: 运行 ``dev-gw`` 容器: 物理主机的docs目录被卷映射进 ``dev-gw`` 为后续NFS服务提供存储目录
NFS服务配置
==============
- 采用 :ref:`ubuntu_nfs` 相似方法配置NFS服务,在 ``dev-gw`` 容器内部修改配置文件 ``/etc/exports`` 内容:
.. literalinclude:: docker_macos_kind_nfs_sharing/exports
:language: bash
:caption: 运行 ``dev-gw`` 容器内部添加 /etc/exports
- 在容器内部运行启动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`` :
.. literalinclude:: docker_macos_kind_nfs_sharing/run_dev-gw_container_volume_docs_privileged
:language: bash
:caption: 运行 ``dev-gw`` 容器: 卷 ``docs`` 以及增加运行参数 ``--privileged``
不过, ``--privileged`` 参数不能解决 ``exportfs: /docs does not support NFS export`` , `itsthenetwork/nfs-server-alpine `_ 提到了 ``OverlayFS`` 不支持NFS输出,需要使用 :ref:`docker_volume` 挂载到容器内部。不过,我确实是使用了::
DOCS_DIR="/Users/huataihuang/docs"
docker run ... -v ${DOCS_DIR}:/docs ...
参考 `directory does not support NFS #61 `_ ,我尝试改为 ``bind mount`` :
.. literalinclude:: docker_macos_kind_nfs_sharing/run_dev-gw_container_bind_mount_docs_privileged
:language: bash
:caption: 运行 ``dev-gw`` 容器: 使用 ``bind mount`` 卷 ``docs`` 以及增加运行参数 ``--privileged``
但是报错依旧是 ``exportfs: /docs does not support NFS export``
.. note::
我怀疑在 :ref:`macos` 上运行的 ``Docker Desktop for mac`` 的底层文件系统 ``APFS 加密文件系统`` 影响了容器化运行NFS输出,所以我后续准备在 :ref:`mobile_cloud_x86_kind` 重新实践(底层使用 :ref:`zfs`)
.. note::
`docker docs: Volumes `_ 应该能够直接创建自带NFS输出的Docker卷,待实践
参考
======
- `GitHub: mjstealey/nfs-in-docker `_ 提供了 `docker-entrypoint.sh `_ 参考脚本
- `NFS Docker Volumes: How to Create and Use `_
- `docker docs: Volumes `_
- `itsthenetwork/nfs-server-alpine `_ 给出了很多有关容器中运行NFS服务器的思路和建议