Docker Swarm 可以管理两种类型的存储:
volume
和 bind
虽然 bind
不是 Docker 文档建议的,因为它在本地目录(在每个 swarm 节点上)与任务之间创建了绑定,但没有提到 volume
实现,所以我没有不了解如何在任务之间共享卷?
- Docker Swarm 如何在节点之间共享卷?
- 卷保存在哪里(在经理上?如果有多个经理?)
- 如果它在不同网络的不同机器上运行,节点之间是否没有问题?
- 它会创建 VPN 吗?
原文由 alessandro308 发布,翻译遵循 CC BY-SA 4.0 许可协议
Swarm 模式本身对卷没有任何不同,它运行您在运行容器的节点上提供的任何卷挂载命令。如果您的卷安装在该节点本地,那么您的数据将本地保存在该节点上。没有自动在节点之间移动数据的内置功能。
有一些基于软件的分布式存储解决方案,比如 GlusterFS,Docker 有一个叫做 Infinit 的解决方案,它还不是 GA,它的开发已经让位于 EE 中的 Kubernetes 集成。
典型的结果是您要么需要管理应用程序中的存储复制(例如 etcd 和其他基于 raft 的算法),要么在外部存储系统上执行挂载(希望有自己的 HA)。安装外部存储系统有两个选项,基于块或基于文件。基于块的存储(例如 EBS)通常具有更高的性能,但仅限于安装在单个节点上。为此,您通常需要一个 3rd 方卷插件驱动程序来让您的 docker 节点访问该块存储。基于文件的存储(例如 EFS)性能较低,但更便携,并且可以同时挂载在多个节点上,这对于复制服务很有用。
最常见的基于文件的网络存储是 NFS(这与 EFS 使用的协议相同)。您可以在没有任何 3rd 方插件驱动程序的情况下安装它。不幸的是,docker 附带的名为“本地”的卷插件驱动程序为您提供了将任何您想要的值传递给带有驱动程序选项的挂载命令的选项,并且没有选项,它默认将卷存储在 docker 目录 /var/lib/码头工人/卷。使用选项,您可以将 NFS 参数传递给它,它甚至会在 NFS 主机名上执行 DNS 查找(通常 NFS 没有此功能)。下面是使用本地卷驱动程序挂载 NFS 文件系统的不同方法的示例:
如果您在最后使用 compose 文件示例,请注意,只要存在,对卷的更改(例如更新服务器路径或地址)就不会反映在现有的命名卷中。您需要重命名您的卷或删除它,以允许 swarm 使用新值重新创建它。
我在大多数 NFS 使用中看到的另一个常见问题是在服务器上启用了“root squash”。当以 root 身份运行的容器尝试将文件写入卷时,这会导致权限问题。您也有类似的 UID/GID 权限问题,其中容器 UID/GID 是需要权限才能写入卷的容器,这可能需要在 NFS 服务器上调整目录所有权和权限。