具有桥接网络的Docker容器上的Vert.x + Hazelcast群集

时间:2018-03-25 21:39:55

标签: docker hazelcast vert.x

我在Hazelcast群集上有一个Vert.x服务器应用程序,并且客户端连接到群集。该应用程序部署在Docker容器中。容器有一个桥接地址为172.17.0.2的网络适配器,运行容器的linux主机具有地址为192.168.107.105的网络适配器。在容器属性中,端口1199和5702转发到外部网络适配器已配置并运行良好。

来自docker inspect的

"ExposedPorts": {
                "1199/tcp": {},
                "5702/tcp": {}
            },

其他服务使用的端口1199。 端口5702在Hazelcast.setOptions()中指定:

NetworkConfig().setPort(5702)

客户端工作站位于192.168.108。*子网中。 Telnet 192.168.107.105 5702非常出色。当然,Telnet 172.17.0.2 5702不起作用。

客户端应用程序成功连接到Hazelcast群集(客户端日志):

INFO: hz.client_0 [dev] [3.8.2] Authenticated with server [192.168.107.105]:5702, server version:3.8.2 Local address: /192.168.108.127:49424
Mar 23, 2018 11:54:02 PM com.hazelcast.client.spi.impl.ClientMembershipListener
INFO: hz.client_0 [dev] [3.8.2]

Members [1] {
        Member [192.168.107.105]:5702 - 86005036-d0f2-439e-b056-d30f53d3aabd
}

Mar 23, 2018 11:54:02 PM com.hazelcast.core.LifecycleService
INFO: hz.client_0 [dev] [3.8.2] HazelcastClient 3.8.2 (20170518 - a60f944) is CLIENT_CONNECTED
Connected to Hazelcast cluster: /192.168.107.105

然后它成功连接到Vert.x集群,我想。但是消息发送失败 - 客户端应用程序试图连接到Vert.x实例的本地地址!

(案例1):客户日志:

Connected to Vert.x cluster
Mar 23, 2018 11:54:05 PM io.vertx.core.eventbus.impl.clustered.ConnectionHolder
WARNING: Connecting to server localhost:34030 failed
io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: localhost/127.0.0.1:34030

(案例2):如果我将服务器应用程序VertxOptions.clusterHost更改为192.168.107.105:

VertxOptions().setClusterManager(mgr).setClusterHost(“192.168.107.105”) 

然后错误更改为:

服务器日志:

SEVERE: Failed to start event bus
java.net.BindException: Cannot assign requested address

(案例3):如果我将VertxOptions.clusterHost更改为172.17.0.2:

VertxOptions().setClusterManager(mgr).setClusterHost(“172.17.0.2”) 

然后服务器启动正常,但现在客户端无法发送消息:

WARNING: Connecting to server 172.17.0.2:34030 failed
io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: someserver/172.17.0.2:34030

当我将服务器应用程序部署在可从客户端网络直接访问的网络适配器上的docker容器中时,一切正常。另外,从服务器端发起的消息publish()成功地将消息传递给所有订阅的客户端 - 包括容器内部和外部容器。

我应该如何配置客户端和服务器应用程序,以便它们正常工作? 是否可以在容器中仅使用桥接网络?

ADDED:我想,我应该在容器属性中为vert.x集群公开单独的端口。但在这一点上,我想,问题是(CASE 1和3)客户端应用程序正在尝试连接到容器的内部地址。或者在另一方面(例2) - Vert.x集群无法在外部地址上启动,可以访问客户端应用程序。

1 个答案:

答案 0 :(得分:2)

对不起。我找到了答案: How do I configure Vert.x event bus to work across cluster of Docker containers?

只需设置VertxOptions()。clusterPublicHost(" 192.168.107.105") - 与Hazelcast中的方式相同......

(n:nodes {id: toInteger(row.dest_id)}) AS dest_node, (n:nodes {id: toInteger(row.src_id)}) AS src_node
RETURN src_node.name, dest_node.name

现在错误已更改,但这是因为我没有将群集端口转发到主机网络接口。问题解决了:))

相关问题