在一个容器内(泊坞窗)宣布你的应用程序

我在周末在docker的IRC上问了这个问题,但是在我想通过这个答案之前,我不得不走开:

如果我有许多应用程序在容器中运行(现在让我们假设它们都运行在相同的物理硬件上,但情况并非如此),我希望每个应用程序都能够find每个应用程序其他自动。

使用某种registry(例如etcd或DNS-SD / Bonjour),您可以宣布您的服务和任何相关的详细信息,并让其他应用程序了解它们并相应地路由stream量。

这里的问题是,当一个应用程序可以知道它一个容器服务的主机名/端口时,它不一定是它可以访问的端口或地址。 有两点需要join的信息:

  • 服务可以访问的地方; 从容器外可以进入
  • 什么服务(版本号,服务types); 从容器内部可以进入

你会如何推荐我通过集装箱壁垒获取这些信息?

  1. 我可以通过TCP将Docker暴露给容器,所以应用程序可以查询它显示的位置,但这似乎违反了关注的分离。
  2. 我可以在我的容器中打开一个文件/端口,主机系统在启动一个容器以准备发布之后查询,但这有点像我将重新创buildWSDL。

任何想法或指导我应该如何解决这个问题?

我想也许是启动容器执行服务注册的方法。 其他容器然后可以执行registry查找来发现这些服务。

更新

Maestro项目举例说明了容器如何在外部进行configuration,然后启动以build立一个协作的容器networking。

我也遇到了麻烦。 我相信你的想法中的错误是容器本身是唯一知道它做什么的人。

容器不是自我意识的实体,它们现在正在为MySQL提供服务,并决定明天成为队列处理器。

相反,有一个控制器(可能只是一个自动化的系统,或者你在命令行上),那个控制器知道一个特定的应用程序应该运行,为了运行这个应用程序,需要一些特定的服务,这就是为什么一个容器首先被启动的原因。

控制器知道需要MySQL服务,并且MySQL服务表示要连接的单个主机端口。 如果是这样的话,也可能知道一个服务是由两个或三个端口组成的。

因此,主机/控制器要么告诉容器要注册哪个地址,要么询问它在哪个本地端口上服务(或者更可能是基于容器定义知道端口),这在架构上是正确的。

实际上,主机可以告诉容器“在这个特定端口上的LAN接口上运行你的服务,我将注册它”,“在你的LAN接口上的任何端口上自己运行你的服务并自己注册”或者“运行你的在这个端口上的服务,并注册与主机:端口,我会设置映射,以确保它在那里可用“。

所有这些在架构上都会好起来的:最后,总是由主机/控制器来决定,因为它确实是唯一一个知道服务在哪里运行哪里可以访问的地方。

我发现docker中的一个实际问题是容器IP和主机映射端口被dynamic分配,以至于在容器运行之前,你不能真正获得任何信息。 这就是为什么Flynn自己select主机端口映射,而不是让Docker自动执行它。

我已经写了一些我的想法。