2014-02-24 94 views
19

迄今为止,我使用Mesos,Marathon和Docker管理一组服务器以及我放置的容器,取得了巨大成功。然而,我现在想进一步开始做一些事情,比如自动将haproxy容器链接到启动的每个主要docker服务,或者提供其他基于守护进程和集装箱化服务,这些服务仅与单个父容器链接并且可用。使用Mesos/Marathon链接的Docker容器

通常情况下,我会先用一些名字启动帮助程序服务,然后当我开始真正的服务时,我会将它链接到帮助程序,一切都会好的。这个模型如何适合Marathon和Mesos?现在看来,至少集装箱化是假设一个集装箱。

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

我也曾想过为docker或启动docker容器的执行程序脚本提供“嵌入”或“深层链接”功能。

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

谢谢!

回答

26

你在未知的领域中徘徊! ☺

这里有多种方法;并没有一个是完美的,但是由于编排钩子,未来版本的Docker中情况会有所改善。

一种方法是使用良好的旧服务发现和注册。 I.E.,当一项服务开始时,它将找出其公开可用的地址,并在例如Zookeeper,Etcd,甚至Redis。由于服务找出其公开可用的地址并不是微不足道的(除非您采用一些约定,例如总是映射端口X:X而不是让Docker分配随机端口),您可能需要从外部进行注册。这意味着您的编排层(在这种情况下,Mesos)将启动容器,然后找出主机和端口,并将其放入您的服务发现系统中。我对马拉松不是很熟悉,但你应该能够注册一个钩子。然后,其他容器只会在服务发现注册表中查找端点地址,这很简单。

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

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

您也可以使用Pipework创建跨越多个主机的一个(或多个)虚拟网络,并将您的容器绑定在一起。管道工具可让您手动分配IP地址,或通过DHCP自动分配IP地址。不过,建议不要使用此方法,但如果您还希望将容器插入现有网络体系结构(例如VLAN ......),那么该方法非常合适。

无论您决定使用哪种解决方案,我都强烈建议您“假装”您正在使用链接。即而不是硬编码您的应用配置以连接到(随机示例)my-postgresql-db:5432,使用环境变量DB_PORT_5432_TCP_ADDRDB_PORT_5432_TCP_PORT(就像它是链接一样),并在启动容器时设置这些变量。这样,如果您在没有服务发现等情况下将容器“折叠”到更简单的环境中,则可以毫不费力地轻松回到链接上。

+2

所以对我来说很重要的一件事是容器的位置。我可以相对容易地找到其他容器的某种发现,但我正在寻找一种优化,超越了这种优化,迫使马拉松在每个容器中启动一组容器(认为nginx + rails + credentials守护进程)。显然我需要提交一个补丁,我应该看看Marathon而不是Docker吗? –

+0

只是为了确保我理解正确 - 你的意思是“......这迫使马拉松在他们自己的主机中启动一组容器(...)”?即强制容器在不同的主机上? – jpetazzo

+0

对不起,我希望组在单个主机上,例如附加到每个服务的本地haproxy。我认为这里的正确途径是一个自定义的mesos执行器,它知道如何从马拉松中获取额外的参数,分叉自己,并管理儿童,确保如果任何一件死亡,整个组都会重新启动。 –

相关问题