Docker Swarm 如何实现卷共享?

新手上路,请多包涵

Docker Swarm 可以管理两种类型的存储:

volumebind

虽然 bind 不是 Docker 文档建议的,因为它在本地目录(在每个 swarm 节点上)与任务之间创建了绑定,但没有提到 volume 实现,所以我没有不了解如何在任务之间共享卷?

  • Docker Swarm 如何在节点之间共享卷?
  • 卷保存在哪里(在经理上?如果有多个经理?)
  • 如果它在不同网络的不同机器上运行,节点之间是否没有问题?
  • 它会创建 VPN 吗?

原文由 alessandro308 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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 文件系统的不同方法的示例:

   # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # or from the docker run command
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or to create a service
  $ docker service create \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
  ...

如果您在最后使用 compose 文件示例,请注意,只要存在,对卷的更改(例如更新服务器路径或地址)就不会反映在现有的命名卷中。您需要重命名您的卷或删除它,以允许 swarm 使用新值重新创建它。

我在大多数 NFS 使用中看到的另一个常见问题是在服务器上启用了“root squash”。当以 root 身份运行的容器尝试将文件写入卷时,这会导致权限问题。您也有类似的 UID/GID 权限问题,其中容器 UID/GID 是需要权限才能写入卷的容器,这可能需要在 NFS 服务器上调整目录所有权和权限。

原文由 BMitch 发布,翻译遵循 CC BY-SA 4.0 许可协议

你问的是一个常见的问题。卷数据和卷可以执行的功能由卷驱动程序管理。就像您可以使用不同的网络驱动程序一样 overlaybridgehost ,您可以使用不同的卷驱动程序。

Docker 和 Swarm 仅提供开箱即用的标准 local 驱动程序。它对 Swarm 没有任何认识,它只会在您的服务任务安排在哪个节点上为您的数据创建新卷。这通常不是你想要的。

您需要一个支持 Swarm 的 3rd 方驱动程序插件,并确保您为服务任务创建的卷在正确的时间在正确的节点上可用。选项包括使用“Docker for AWS/Azure”及其包含的 CloudStor 驱动程序,或流行的开源 REX-Ray 解决方案。

有很多 3rd 方卷驱动程序,您可以在 Docker Store 上找到它们。

原文由 Bret Fisher 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题