如何在Docker引擎Swarm模式下在多个主机之间共享卷?

21

在Docker引擎Swarm模式下,我们能否跨多个主机共享一个公用/单一命名卷?最简单的方法是什么?


Docker支持多种卷插件,可用于添加对外部存储系统的支持。请参阅文档:https://docs.docker.com/engine/extend/legacy_plugins/#/volume-plugins - Mark O'Connor
有关这个主题,有什么新的进展吗?你找到了最终解决方案吗?我找到了这篇文章,但它有点过时(https://jaxenter.com/how-to-share-docker-volumes-across-hosts-119602.html),我想知道解决方案#2创建NFS翻译容器是否仍然是唯一/首选的方法。 - Rastikan
从 @MarkO'Connor 提到的列表中,我可以为 Blockbridge 提供担保。 - smeeb
作为多年来热衷于Docker的粉丝,我仍在寻找解决方案!但是,在本地(非云)环境中,我仍然无法找到适用于Docker Swarm模式的解决方案。 - James Mills
3个回答

3
如果您已经设置了一个NFS服务器,那么您可以像这样从Docker Compose使用一些nfs文件夹作为卷:

volumes:
    grafana:
      driver: local
      driver_opts:
        type: nfs
        o: addr=192.168.xxx.xx,rw
        device: ":/PathOnServer"

1

在整体情况下

其他答案肯定是正确的。如果你觉得自己还缺少些什么,或者得出结论认为这个领域可能永远不会真正改善,那么你可能需要重新考虑使用典型的类 POSIX 层次文件系统抽象。并非所有应用程序都真正需要它(我甚至可以说只有少数应用程序需要)。也许你的应用程序也不需要。

为文件系统辩护

在许多圈子中仍然很常见,但通常这些人非常了解他们的远程/分布式文件系统,并知道如何设置和充分利用它们(它们可能也是非常好的系统,尽管通常没有现有的 Docker 卷驱动程序)。有时这也部分是因为他们被迫这样做(不能或不应该重写以支持其他存储后端的代码库)。使用、配置甚至编写任意 Docker 卷驱动程序只是次要关注点。

替代方案

如果你有选择的话,那么评估其他持久性解决方案供你的应用程序使用。许多实现不会使用 POSIX 文件系统接口,而是使用网络接口,这在像 Docker Swarm 这样的集群中不会带来特定的基础设施级别的困难。

由第三方管理的解决方案(例如云提供商)

如果您成功地删除了所有与文件系统相关的持久性和共享数据的依赖(对于短暂的本地状态仍然可以使用),那么您可能声称拥有完全“无状态”的应用程序。当然,通常仍然会在某个地方保留状态,但是想法是您不必自己处理它。许多云提供商(如果您在那里托管东西)将提供完全托管的解决方案,以处理持久状态,使您根本不必关心它。如果您选择这条路,请考虑使用与您可以在本地测试的实现兼容的API的托管服务(例如通过运行基于由第三方提供或您自己维护的该实现的映像的Docker容器来实现)。
DIY解决方案
如果您确实想在Docker Swarm集群内管理持久状态,则文件系统抽象通常是不可避免的(而且您可能会更难以直接针对块设备进行定位)。您将要使用节点和服务约束来确保满足持久化数据所需的任何要求。对于某些东西,例如中央DBMS服务器,这可能很容易(“始终仅在特定节点上运行任务”),对于其他东西,可能涉及更多。
任务设置、扩展和监控并不容易,这就是为什么许多应用程序开发人员很高兴让其他人(例如云服务提供商)来完成。然而,这仍然是一个非常酷的领域需要探索,但是如果你有截止日期,那么可能不应该专注于此。总之,请根据工作需求使用正确的抽象,并考虑自己的优势和资源分配。

0

从头开始,Docker本身不支持此功能。您必须使用其他组件,例如提供新卷类型的Docker插件,或直接在文件系统上使用同步工具来同步数据。

在我看来,最简单的解决方案是rsync或更准确地说是lsyncd,它是rsync的守护程序版本。但我从未尝试过用于Docker卷,因此无法确定它是否能够很好地处理它。 其他解决方案是使用Infinit.sh。它基本上与lsyncd执行相同的操作。这是单向同步。因此,如果您的Docker容器在其卷中是RW,则它将无法满足您的期望。我尝试了这个解决方案,并且对于RO操作效果非常好。但不适用于生产环境。它仍然是alpha版本。Infinit也正在开发Docker驱动程序。尚未发布。因此,我甚至没有尝试过它。太冒险了。

我发现的其他解决方案,但无法安装(因此无法尝试)的是flocker和glusterFS。两者都旨在基于多台计算机的多个HDD创建FS卷。但是,它们的存储库在过去几周中都无法使用。

很抱歉我只能提供一些弱化的解决方案,但我自己也面临着同样的问题,还没有找到完美的解决方案。

祝好, Olivier


lsyncd 很棒,但它只提供单向同步:一个源,一个目的地。对于在群集中随机主机上运行且编写文件的 Docker 容器,您需要在所有主机上拥有相同的数据,而单向同步是不够的。 - fjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接