【问题标题】:Are Docker Volumes machine-specificDocker Volumes 是特定于机器的吗
【发布时间】:2017-11-13 12:41:35
【问题描述】:

我是 Docker Swarm 的新手。据我了解,Docker Swarm 允许您从集群中抽象出来。意味着您不关心部署了哪个 hardriwe 容器。

另一方面,在 Docker 中处理数据库的标准方法是在 Docker 容器外部写入数据(以避免写时复制行为)。这是通过挂载Volume 并将与数据库相关的数据写入其中来实现的。这里重要的是 - Volumes 是特定于机器的吗? Docker 和 Docker Swarm 是否足够聪明,可以在需要的机器上挂载一个 Volume?

例子:

我有 3 台机器和 3 个微服务/容器。它们都是通过 Docker Swarm 部署的。只有一个微服务/容器必须连接到数据库。所以我只需要在一台机器上安装Volume。但在哪个?

【问题讨论】:

    标签: docker docker-swarm docker-volume


    【解决方案1】:

    当涉及到 Docker swarm 和其他编排框架时,数据库和类似的有状态应用程序仍然是一件难以处理的事情。理想情况下,容器应该能够在 swarm 中的任何节点上运行,但是当您需要在容器的生命周期之外持久化数据时,问题就来了。

    挂载卷是 Docker 持久化数据的方式,但是这会将容器与特定节点联系起来,因为卷是在特定节点上创建的。有许多项目试图解决这个问题并提供某种分布式存储。

    有一个名为Flocker 的项目解决了上述问题(不再维护)。还有一个名为REXRAY 的新项目。

    Docker 和 Docker Swarm 是否足够聪明,可以在需要的机器上安装卷?

    默认情况下,没有。 Docker swarm 将选择其中一个节点并在其上部署容器。但是,您可以解决此问题:

    首先,您需要在服务定义下的 Stackfile/Composefile 中定义一个命名卷。 其次,您需要使用节点Placement Constraints 来限制数据库容器应该运行的位置。

    如果你不是分布式存储工具,那么当涉及到需要卷的数据库和类似的有状态容器时,你需要将容器限制在特定的节点上。

    【讨论】:

    • 非常感谢您的出色回答!如果您知道答案,您能否添加有关 REXRAY 如何为全状态数据库实现节点无关行为的详细信息?为什么使用 Docker / Docker Swarm 架构很难实现相同的行为?我想如果这很容易,Docker 会在很久以前实现机器不可知卷
    • 对于特定节点的硬编码/受限容器的高可用性如何?有什么变通办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2021-12-19
    • 2011-03-21
    相关资源
    最近更新 更多