与Mesos / Marathon链接的Docker容器

到目前为止,我使用Mesos,Marathon和Docker来pipe理一组服务器,以及我要放置的容器。 不过,我现在想进一步开始做一些事情,比如自动将haproxy容器链接到启动的每个主要docker服务,或者提供其他基于守护进程和集装箱化服务,这些服务仅与单个父容器链接并且可用。

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

我有一个想法,首先启动帮助器服务,无论它可以find的任何主机,然后添加一个约束到真正的服务,主机名=辅助服务的主机名,但这似乎会导致问题的资源提供和竞争条件那些资源。

我也曾想过为docker提供一个“embed”或“deep-link”function,或者是启动docker容器的executor脚本。

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

谢谢!

你在未知的领域徘徊! ☺

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

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

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

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

您还可以使用“ pipe道工作”创build跨越多个主机的一个(或多个)虚拟networking,并将您的容器绑定在一起。 pipe道工具可以让你手动分配IP地址,或通过DHCP自动分配IP地址。 不过,不build议使用这种方法,但如果您也希望将容器插入现有的networking体系结构(例如VLAN …),则这种方法非常合适。

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