在DCOS / Marathon和docker

时间:2015-11-21 16:15:50

标签: docker hazelcast mesos

我在马拉松上部署了一个dockerized dropwizard服务。我使用Hazelcast作为分布式缓存,我开始使用我的dropwizard服务。我已经设置了一个约束来确保每个容器都在一个唯一的主机上启动。

   "constraints": [
        [
            "hostname",
            "UNIQUE"
        ]
    ],

我在我的docker容器上公开了2个端口,10012用于我的服务,10013用于Hazelcast。我正在使用Zookeeper进行Dropwizard服务发现。因此,当我启动我的Hazelcast实例时,我可以访问运行我的docker容器的所有机器的主机名,并按如下所示添加所有这些主机名。

TcpIpConfig tcpIpConfig = join.getTcpIpConfig();
// finder is a handle to a service discovery service and the following gets me all the hosts on which my docker containers will run.
List<ServiceNode<ShardInfo>> nodes = finder.getAllNodes();
nodes.stream()
     .peek(serviceNode -> log.info("Adding " + serviceNode.representation() + " to hazelcast."))
     .map(serviceNode -> serviceNode.getHost())
     .forEach(host -> tcpIpConfig.addMember(host));
tcpIpConfig.setRequiredMember(null).setEnabled(true);

现在问题: 如果我在部署Marathon时使用网络类型作为BRIDGE,那么我不知道docker容器主机,因此我的2个docker容器彼此不了解。它看起来像这样:

ip-10-200-2-219.ap-southeast-1.compute.internal (docker host) - 172.12.1.18 (docker container ip)

ip-10-200-2-220.ap-southeast-1.compute.internal (docker host) - 172.12.1.20 (docker container ip)

从zookeeper我得到了docker主机IP,但没有docker容器IP。

如果我使用网络类型作为HOST,那么一切正常,但问题是我必须确保我的docker容器正在运行的端口始终具有端口1001和10013可用。 (使用BRIDGE,docker容器端口绑定到随机端口)。

3 个答案:

答案 0 :(得分:2)

<强>分析:

两个docker容器位于他们自己的网络中,本地化为从属。他们需要使用从站的公共IP和5701(或您正在使用的任何hazelcast端口)的桥接端口相互识别。

<强>解决方案

在TCP / IP配置中,在启动实例时设置公共地址和端口。所有实例都会这样做,他们将使用马拉松从属IP和用于它的随机端口相互通信。

使用marathon提供的HOST和PORT_5701变量,并在容器内部可用。

Config hzConfig = new Config();
hzConfig.getNetworkConfig().setPublicAddress(
                             String.format("%s:%s", 
                                 System.getenv("HOST"),    
                                 System.getenv("PORT_5701")));

请参阅hazelcast network config documentation以了解有关公共地址选项的更多信息。

答案 1 :(得分:1)

您可以使用TCP / IP发现机制并确保hazelcast节点绑定到docker容器的公共ip。虽然在部署之前,如果您知道docker容器IP,此解决​​方案可能会有所帮助。

<hazelcast> ... <network> ... <join> <multicast enabled="false"> </multicast> <tcp-ip enabled="true"> <member>docker-host1</member> <member>docker-host2</member> <member>172.12.1.20</member> <member>192.168.1.21</member> </tcp-ip> ... </join> ... </network> ... </hazelcast>

答案 2 :(得分:0)

让hazelcast成员发现彼此并形成一个集群是棘手的。我最后听了@bitsofinfo的建议 -  https://github.com/hazelcast/hazelcast/issues/9219

@santanu的回答是正确的。需要为hazelcast成员正确设置公共地址,以便能够相互发现。以下是执行此操作的参数化方法:https://github.com/gagangoku/hazelcast-docker