我目前正在努力解决以下问题:
我有一个Java EE应用程序,它应该能够在集群中运行(实际上是这样)。对于节点之间的数据交换,我使用Hazelcast 3.3.3。由于我们的客户害怕UDP,我们使用TCP。因此,我为每个节点配置3个hazelcast参数:要使用的网络接口,端口和群集成员。在现实生活中(不是码头环境)一切正常。现在我想将我的Java EE服务器放入docker容器(每个节点一个),并通过Hazelcast链接它们。
我做的是:
在运行docker容器的主机上,我创建了几个虚拟网络接口(172.21.0.X)。对于每个docker容器,我提供了网络映射,如-p 172.21.0.X:5190:5190(5190是我用于Hazelcast的端口)
在我的容器内的Java EE应用程序中,我配置了hazelcast来监听接口172.21.0.X,端口5190成员172.21.0.X:5190,......现在的问题是:docker将分配一个内部IP号到每个投币器。事先我无法确定哪个IP号码码头会分配。它绝对不是我想要使用的IP(172.21.0.X)。 Hazelcast启动并告诉我:找不到匹配的界面。当然不是。 Hazelcast将检查docker容器的IP接口,类似于172.4.XX.这不符合我给hazelcast的配置(使用172.21.X.X)。
到目前为止,似乎无法指定docker容器的内部IP号。我可以从正在运行的容器中查询它,但由于我需要在启动容器之前完成Java EE服务器的配置,所以为时已晚。
有什么提示吗?是否可以使用TCPIP运行Hazelcast?
这个帖子和Nick Scavelli的回答是我认为你正在寻找的。
https://groups.google.com/forum/#!msg/vertx/MvKcz_aTaWM/QM6CfllX9HQJ
这个帖子提供了一个答案和一个例子:https://groups.google.com/d/msg/orient-database/ehfKcInWZXs/wxs8xLUOGB8J
基本上你在hazelcast文件中使用了hazelcast变量,即
<property name="hazelcast.local.localAddress">${hazelcast.ip}</property>
然后,当您运行包含的docker时,添加:
-e IP=`ip route | awk '/default/ { print $9 }'`
这在docker容器中设置了一个环境变量。然后在那里你做这样的事情:
CMD ["java", "-Dhazelcast.ip=${IP}", ...
因此它采用了docker env变量,并将其作为定义粉碎成java,然后在运行时将其删除并替换为其配置文件。
我想让@ 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容器时传递params(我使用官方hazelcast图像并使用-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}'
接受主机ip并将其作为hazelcast.ip变量传递到配置文件中。内部端口和docker端口映射应该在3个地方类似5701。下一个容器运行5702,依此类推。
希望这可以帮助。