你在未知的领域徘徊!☺</p>
这里有多种方法;并且它们都不是完美的,但是在未来版本的 Docker 中情况会有所改善,这要归功于编排钩子。
一种方法是使用良好的旧服务发现和注册。IE,当一个服务启动时,它会计算出它的公开地址,并在例如Zookeeper,Etcd,甚至Redis中注册自己。由于服务找出其公开可用地址并非易事(除非您采用一些约定,例如始终映射端口 X:X 而不是让 Docker 分配随机端口),您可能希望从外部进行注册。这意味着您的编排层(在这种情况下为 Mesos)将启动容器,然后找出主机和端口,并将其放入您的服务发现系统中。我对 Marathon 不是很熟悉,但是您应该可以为此注册一个钩子。然后,其他容器只会在服务发现注册表中查找端点地址,简单明了。
您还可以查看Skydock,它会自动使用 Skydns 为您的容器注册 DNS 名称。然而,它目前是单主机,所以如果你喜欢这个想法,你必须以某种方式扩展它以支持多个主机,也许还有 SRV 记录。
另一种方法是使用“众所周知的入口点”。这实际上是服务发现的简化案例。这意味着您将确保您的服务将始终在预设的主机和端口上运行,以便您可以静态使用这些地址。当然,这很糟糕(因为当您想要重现环境以进行测试/登台时,这会让您的生活变得更加困难),但是如果您对服务发现一无所知,那么这可能是一个开始。
您还可以使用Pipework创建一个(或多个)跨越多个主机的虚拟网络,并将您的容器绑定在一起。Pipework 将允许您手动分配 IP 地址,或通过 DHCP 自动分配 IP 地址。虽然不推荐这种方法,但如果您还想将容器插入现有的网络架构(例如 VLAN ......),它是一个很好的选择。
无论您决定使用哪种解决方案,我都强烈建议您“假装”您正在使用链接。即不是硬编码您的应用程序配置以连接到(随机示例)my-postgresql-db:5432
,而是使用环境变量DB_PORT_5432_TCP_ADDR
和DB_PORT_5432_TCP_PORT
(好像它是一个链接),并在启动容器时设置这些变量。这样,如果您将容器“折叠”到更简单的环境中而无需服务发现等,您可以轻松地回退到链接上而无需付出任何努力。