我目前正在努力解决以下问题:
我有一个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?
答案 0 :(得分:5)
这个帖子和Nick Scavelli的回答是我认为你在寻找的。 p>
https://groups.google.com/forum/#!msg/vertx/MvKcz_aTaWM/QM6CfllX9HQJ
答案 1 :(得分:4)
这个帖子提供了一个答案和一个例子: 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,然后在运行时将其删除并替换为它的配置文件。
答案 2 :(得分:0)
我想让@ 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,依此类推。
希望这有帮助。