【问题标题】:Linked Docker Containers with Mesos/Marathon使用 Mesos/Marathon 链接的 Docker 容器
【发布时间】:2014-03-25 16:36:16
【问题描述】:

到目前为止,我在使用 Mesos、Marathon 和 Docker 来管理一组服务器以及我放置在它们上面的容器方面取得了巨大的成功。但是,我现在想更进一步,开始做一些事情,比如自动将一个 haproxy 容器链接到每个启动的主 docker 服务,或者提供其他基于守护进程的容器化服务,这些服务链接并且仅可用于单个父容器。

通常,我会先用某个名称启动助手服务,然后当我启动真正的服务时,我会将它链接到助手,一切都会好起来的。这个模型如何适应 Marathon 和 Mesos?至少目前看来,容器化假设是单个容器。

我有一个想法,首先在它可以找到的任何主机上启动辅助服务,然后向实际服务添加一个约束,即主机名 = 辅助服务的主机名,但这似乎会导致资源提供问题和这些资源的竞争条件。

我还考虑为 docker 或启动 docker 容器的执行程序脚本提供“嵌入”或“深度链接”功能。

在我走上这些道路之前,我想知道是否有其他人解决了这个问题,或者我是否只是在思考问题。

谢谢!

【问题讨论】:

    标签: docker mesos marathon


    【解决方案1】:

    你在未知的领域徘徊! ☺

    这里有多种方法;并且它们都不是完美的,但是在未来版本的 Docker 中情况会有所改善,这要归功于编排钩子。

    一种方法是使用良好的旧服务发现和注册。即,当一个服务启动时,它会计算出它的公开地址,并将自己注册到 e.g. Zookeeper、Etcd,甚至 Redis。由于服务确定其公开可用地址并非易事(除非您采用一些约定,例如始终映射端口 X:X 而不是让 Docker 分配随机端口),您可能希望从外部进行注册。这意味着您的编排层(在这种情况下为 Mesos)将启动容器,然后找出主机和端口,并将其放入您的服务发现系统中。我对 Marathon 不是很熟悉,但是您应该可以为此注册一个钩子。然后,其他容器只会在服务发现注册表中查找端点地址,简单明了。

    您还可以查看Skydock,它会自动使用 Skydns 为您的容器注册 DNS 名称。然而,它目前是单主机,所以如果你喜欢这个想法,你必须以某种方式扩展它以支持多主机,也许还有 SRV 记录。

    另一种方法是使用“知名入口点”。这实际上是服务发现的简化案例。这意味着您将确保您的服务将始终在预设的主机和端口上运行,以便您可以静态使用这些地址。当然,这很糟糕(因为当您想要重现环境以进行测试/登台时,这会让您的生活变得更加艰难),但是如果您对服务发现一无所知,那么这可能是一个开始。

    您还可以使用Pipework 创建一个(或多个)跨越多个主机的虚拟网络,并将您的容器绑定在一起。 Pipework 将允许您手动分配 IP 地址,或通过 DHCP 自动分配 IP 地址。虽然不推荐这种方法,但如果您还想将容器插入现有的网络架构(例如 VLAN...),它非常适合。

    无论您决定使用哪种解决方案,我都强烈建议您“假装”您正在使用链接。 IE。而不是硬编码您的应用程序配置以连接到(随机示例)my-postgresql-db:5432,使用环境变量DB_PORT_5432_TCP_ADDR 和DB_PORT_5432_TCP_PORT(好像它是一个链接),并在启动容器时设置这些变量。这样,如果您将容器“折叠”到更简单的环境中,无需服务发现等,您可以轻松地回退链接。

    【讨论】:

    • 所以对我来说很重要的一件事是容器的位置。我可以相对轻松地进行某种发现来找到其他容器,但我正在寻找一种优化,而不是迫使 marathon 在各自的容器中启动一组容器(想想 nginx + rails + credentials daemon)。显然我需要提交一个补丁,我应该看看 Marathon 而不是 docker 吗?
    • 只是为了确保我理解正确——你的意思是“……这迫使 marathon 启动一组容器(……),每个容器都在自己的主机中”? IE。强制容器在不同的主机上?
    • 抱歉,我希望该组位于单个主机上,例如附加到每个服务的本地 haproxy。我认为这里的正确路径是一个自定义的 mesos 执行器,它知道如何从马拉松中获取额外的参数,分叉本身,并管理孩子,以确保在任何一个部分死亡时重新启动整个组。
    • 明白。好吧,老实说,我对 Marathon/Mesos 的了解还不够。我不知道是否可以将现有作业用作资源,以便您可以告诉“这个后端服务算作提供一个 backend 类型的资源单元;现在请在某处启动一个 haproxy 服务,知道它需要一个类型为 backend 的单元来运行(以及 X 和 Y 单元,例如 RAM 和 CPU)”。
    • 为什么不将这两个应用程序分组,第二个应用程序应该取决于第一个应用程序是否健康,然后,您可以使用 consul (+ consul-marathon) 服务发现链接它们。在第二个中,您只需指定 app1.service.consul
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多