使用开源版emqx5.8.8docker镜像创建了一个集群,有数个节点的,但节点间消息订阅无法互通

通过docker创建了多个节点:emqx@ip1、emqx1@ip1、emqx2@ip1,emqx@ip2、emqx1@ip2、emqx2@ip2,通过集群组网( 映射成不同的Erlang 分布式传输端口)是成功的,由于docker默认各节点内置的“rpc集群端口“都是5369,本人尝试了多种映射方式,只有对外映射成相同端口(比如5370)的节点之间(比如emqx@ip1、emqx@ip2)才能正常收到订阅消息,端口号不一致的节点(比如emqx@ip1、emqx1@ip1)不能互发消息。
问题:1台服务器上只有一个可供对外使用的端口,比如5369,这些docker创建的节点间要相互通信交换消息,如何在同一台物理服务器上配置各docker节点的对外映射端口?

目前没有办法。这个用法太奇怪了。你得自己探索下。

谢谢回复,可能前面我描述还不是很清楚,现做些补充。集群下有两台(后面可能会有多台)云服务器,然后在每台上创建多个docker容器,分别命名为emqx@ip1、emqx1@ip1、emqx2@ip1,emqx@ip2、emqx1@ip2、emqx2@ip2, 其中ip1、ip2是云服务器的内网地址,不是docker容器内ip地址,因为集群内两台云服务器上的docker容器间要相互访问,所以只能把docker容器端口映射出来。也就是两台不同宿主机之上的emqx容器要相互访问,形成一个emqx集群,集群内消息互通。

我对 docker 的理解应该没有比你强多少,

业界的标准实践和 EMQX 的推荐部署方式是:一台云主机(或物理机)只运行一个 EMQX 节点(容器)。EMQX 本身是为高并发设计的,单个节点就能很好地利用多核资源。如果你需要扩容,应该增加云主机的数量,而不是在单台主机上跑多个实例。

基于这个原则,给你问了一下 AI:有两个清晰的方案可以解决你当前的问题:

方案一:使用主机网络模式 (Host Mode) - 最简单

这是最直接的解决办法,让你完全绕开 Docker 的端口映射问题。

  1. 做法: 在每台云服务器上,只启动一个 EMQX 容器。启动时,使用 --net=host (docker run) 或 network_mode: "host" (docker-compose) 来指定网络模式。
  2. 原理: host 模式让容器直接共享宿主机的网络,不再有隔离的容器 IP。
  3. 效果:
  • 不需要再做任何端口映射(去掉所有 -p 参数)。
  • EMQX 容器会直接监听你云服务器的 IP(ip1ip2)。
  • emqx@ip1 会监听在 ip1:5369emqx@ip2 会监听在 ip2:5369
  • 只要你的云服务器防火墙(安全组)放行了 EMQX 集群所需的端口(如 5369, 4370 等),这两个节点就可以像标准非 Docker 集群一样,通过 emqx_ctl cluster join emqx@ip2 这样的命令完美组网。

方案二:使用 Docker Swarm (Overlay Network) - 更规范

如果你希望未来能更方便地管理这个跨主机的集群(比如服务发现、动态扩缩容),推荐使用 Docker Swarm 模式。

  1. 做法:
  • ip1 上运行 docker swarm init,使其成为管理节点。
  • ip2(及更多主机)上运行 docker swarm join ...,使其加入 Swarm 集群。
  • 创建一个跨主机的 overlay 网络:docker network create -d overlay emqx-net
  • 使用 docker service create 来部署 EMQX 服务(而不是 docker run),并指定使用 emqx-net 网络。
  1. 原理: Swarm 会创建一个虚拟网络,跨越你所有的云主机。在这个网络内的所有容器,都可以通过服务名直接通信,Docker 会自动处理底层的路由和端口。
  2. 效果: 你可以轻松地启动一个有 2 个(或 N 个)副本的 EMQX 服务,Swarm 会自动在 ip1ip2 上各部署一个容器。这些容器在 emqx-net 内部可以互相发现并组成集群。这是更健壮和“云原生”的做法。

总结一下: 停止在一台机器上跑多个 EMQX 容器。建议你立即尝试方案一(Host 模式),它能最快地解决你当前的问题。如果后续对编排有更高要求,再研究方案二(Swarm)。

收到,host模式下已经用过了,不清楚这种模式下单个docker容器能支撑多大的连接数,我想搞到百万级,所以目前采用了bridge方式,想测试一下能支撑的最大连接数。
方案二,我尝试看下,应该是个好方向,谢谢!

搞百 W 级,就不要用 docker 了,直接装就行了。
真不需要在一台云主机上搞多个 emqx 实例。emqx 能发挥出多核的能力的。
1 台 64core 的上装一个 emqx,比在上面装 2 个,每个限制成 32core 的部署方式强多了。

收到,多谢指导