到目前为止,我在使用mesos、marathon和docker管理服务器群以及放置在服务器上的容器方面取得了巨大成功。但是,我现在想更进一步,开始做一些事情,比如自动将haproxy容器链接到启动的每个主docker服务,或者提供其他基于守护进程的容器化服务,这些服务是链接的,并且只对单亲容器可用。
通常,我会先用一些名字启动helper服务,然后当我启动真正的服务时,我会将它链接到helper,一切都会很好。这种模式如何适应马拉松和中观呢?至少目前看来,集装箱化假设只有一个集装箱。
我有一个想法,首先在它能找到的任何主机上启动helper服务,然后向真正的服务添加一个hostname=helper服务的hostname的约束,但这似乎会导致资源提供和这些资源的竞争条件出现问题。
我还想为docker或启动docker容器的executor脚本提供“嵌入”或“深度链接”功能。
在我走上任何一条路之前,我想知道是否有人解决了这个问题,或者我只是想得太多了。
谢谢!
1条答案
按热度按时间rmbxnbpk1#
你在未知的领域徘徊!☺
这里有多种方法;它们中没有一个是完美的,但是在docker的未来版本中,由于编排挂钩,情况会有所改善。
一种方法是使用好的旧服务发现和注册。i、 例如,当一个服务启动时,它会找出它的公开地址,并在zookeeper、etcd甚至redis中注册自己。由于服务要找出其公共可用的地址并非易事(除非您采用某些约定,例如始终Map端口x:x,而不是让docker分配随机端口),因此您可能希望从外部进行注册。这意味着您的编排层(在这种情况下是mesos)将启动容器,然后计算出主机和端口,并将其放入服务发现系统中。我对马拉松不是很熟悉,但你应该可以注册一个钩子。然后,其他容器将只在服务发现注册表中查找端点地址,简单明了。
您还可以查看skydock,它会自动向skydns注册容器的dns名称。但是,它目前是单主机的,所以如果您喜欢这个想法,您必须以某种方式扩展它以支持多个主机,也许还有srv记录。
另一种方法是使用“众所周知的切入点”。这实际上是服务发现的简化案例。这意味着您将确保您的服务始终在预先设置的主机和端口上运行,以便您可以静态地使用这些地址。当然,这是不好的(因为当您想要为测试/暂存目的复制环境时,这将使您的生活更加困难),但是如果您对服务发现一无所知,那么,这可能是一个开始。
您还可以使用管道来创建一个(或多个)跨多个主机的虚拟网络,并将容器绑定在一起。管道将允许您手动或通过dhcp自动分配ip地址。虽然不建议使用这种方法,但是如果您还想将容器插入现有的网络体系结构(例如vlan…),那么这种方法非常适合。
无论您决定使用哪种解决方案,我强烈建议您“假装”正在使用链接。i、 e.不要硬编码你的应用程序配置以连接到(随机示例)
my-postgresql-db:5432
,使用环境变量DB_PORT_5432_TCP_ADDR
以及DB_PORT_5432_TCP_PORT
(就像它是一个链接),并在启动容器时设置这些变量。这样,如果您将容器“折叠”到一个更简单的环境中,而不需要服务发现等,您就可以轻松地回退到链接上,而无需付出任何努力。