如何以编程方式指定由 Marathon 创建的依赖 docker 容器的 IP 和端口?

How to programmatically specify the IP and port of a dependent docker container created by Marathon?

我正在通过编写一个小型网络应用程序来学习微服务架构。该应用程序具有以下组件,每个组件都将由一个 docker 容器托管。

在我用 NodeJS 编写的 API 网关中,有一些地方我会调用:

request('http://service_b_ip_addr:port/get_service_b', callback);

但是,在 Marathon 创建服务 B 的 docker 容器之前,service_b_ip_addrport 都是未知的。

有了一些服务发现机制,例如 mesos-dnsmarathon-lb,我想我可以改变 service_b_ip_addrservice_b.marathon.com 之类的东西。

但我不知道应该如何将 port 放入我的程序中。

在此先感谢您的帮助。


PS:

  1. 我正在使用 BRIDGED 网络模式,因为服务的多个实例可以位于同一个 Mesos 从站上。所以port是一个NATted随机数。

看看this answer.

如果您使用 marathon-lb,则无需传递端口,因为它是一个代理,它会知道服务的名称。

如果您使用 mesos-dns,您应该发出 SRV 请求以获取 ip 和端口。在节点中,您可以使用 dns.resolveSrv(hostname, callback) 来完成,但您的 DNS 必须在默认 (53) 端口上公开并支持 SRV 请求(mesos-dns 支持它)。