在具有TCPIP的多节点docker环境中进行Hazelcast

我目前正在努力解决以下问题:

我有一个Java EE应用程序,应该能够在一个集群中运行(实际上是这样)。 对于节点之间的数据交换,我使用Hazelcast 3.3.3。 由于我们的客户害怕UDP,我们使用TCP。 所以我为每个节点configuration3个hazelcast参数:使用的networking接口,端口和集群成员。 在现实生活中(不是docker环境),一切正常。 现在我想把我的Java EE服务器放入Docker容器(每个节点一个),并通过Hazelcast链接它们。

我做的是:

在运行docker容器的主机上,我创build了几个虚拟networking接口(172.21.0.X)。 对于每个docker集装箱我给了networking映射像-p 172.21.0.X:5190:5190(5190是我用于Hazelcast的端口)

在我的Java EE应用程序的容器内我configuration了hazelcast来监听接口172.21.0.X,端口5190成员172.21.0.X:5190,……现在的问题是:docker会分配一个内部的IP号码到每个钱柜。 提前我不能确定哪个IP号码docker将分配。 它最初不是我想要使用的IP(172.21.0.X)。 Hazelcast启动并告诉我:找不到匹配的界面。 当然不是。 Hazelcast会检查Docker容器的IP接口,类似于172.4.XX。 这不适合我给hazelcast的configuration(使用172.21.XX)。

到目前为止,似乎没有可能指定docker集装箱的内部IP号码。 我可以从一个正在运行的容器中查询,但是这太迟了,因为我需要在启动容器之前configuration我的Java EE服务器。

有什么提示? 是否有可能使用TCPIP运行Hazelcast?

这个线程和尼克Scavelli的答案是我认为你正在寻找。

https://groups.google.com/forum/#!msg/vertx/MvKcz_aTaWM/QM6CfllX9HQJ

此主题提供了一个答案和示例: https : //groups.google.com/d/msg/orient-database/ehfKcInWZXs/wxs8xLUOGB8J

基本上你可以在你的hazelcast文件中使用hazelcastvariables,即

<property name="hazelcast.local.localAddress">${hazelcast.ip}</property> 

然后当你运行的docker包含你添加:

 -e IP=`ip route | awk '/default/ { print $9 }'` 

在Docker容器中设置了一个环境variables。 然后在那里你做这样的事情:

 CMD ["java", "-Dhazelcast.ip=${IP}", ... 

因此,它采用docker envvariables,并将其作为定义砸碎成java,然后在运行时select并replace它的configuration文件。

我想让@ gremwell的答案是最新的,因为现在不太正确。 属性hazelcast.local.localAddress不再有效。 相反,应该把这个片段放入hazelcast.xml中

  <network> <public-address>${hazelcast.ip}:${hazelcast.port}</public-address> <port auto-increment="false" port-count="100">${hazelcast.port}</port> ... </network> 

然后通过启动docker容器(我使用官方hazelcast图像和装载文件夹与我的configuration使用-v标志)的参数,

 sudo docker run -p 5701:5701 -e JAVA_OPTS="-Dhazelcast.config=/etc/conf/hazelcast.xml -Dhazelcast.ip=`ip route get 8.8.8.8 | awk '{print $NF; exit}'` -Dhazelcast.port=5701" -v /data/docker/hazelcast:/etc/conf -ti hazelcast/hazelcast 

命令-Dhazelcast.ip=ip route get 8.8.8.8 | awk '{print $NF; exit}' -Dhazelcast.ip=ip route get 8.8.8.8 | awk '{print $NF; exit}' -Dhazelcast.ip=ip route get 8.8.8.8 | awk '{print $NF; exit}'主机机器ip并将其作为hazelcast.ipvariables在configuration文件中传递。 内港和docker端口映射应在3个地方类似5701。 下一个容器运行5702等。

希望这可以帮助。