docker部署内网跨宿主机双主集群报错emqx@192.168.0.97' not responding to pings. 本机ipping不通

version: '3'

services:
  emqx1:
    image: emqx/emqx:5.8.9
    container_name: emqx1
    network_mode: host
    environment:
      - "EMQX_NODE__COOKIE=emqx-cluster-2026-secret"
      - "EMQX_NODE__NAME=emqx1@192.168.0.97"
      - "EMQX_NODE_IP=192.168.0.97"
      - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
      - "EMQX_CLUSTER__STATIC__SEEDS=[emqx1@192.168.0.97,emqx2@192.168.0.97]"
      - "EMQX_RPC__PORT_DISCOVERY=manual"
      - "EMQX_RPC__TCP_SERVER_PORT=5370"
      - "EMQX_NODE__DIST_LISTEN_PORT=4370"
    healthcheck:
      test: [ "CMD", "/opt/emqx/bin/emqx", "ctl", "status" ]
      interval: 5s
      timeout: 25s
      retries: 5
    #    networks:
    #      emqx-bridge:
    #        aliases:
    #          - node1.emqx.io
    ports:
      - 1883:1883
      - 8083:8083
      - 8086:8084
      - 8883:8883
      - 18083:18083
      - 4370:4370
      - 5370:5370
    # volumes:
    #   - $PWD/emqx1_data:/opt/emqx/data

dockerexec -it emqx1sh-c"emqx ctl cluster status"Node ‘emqx@192.168.0.97’ not responding to pings.

端口都开放了,使用了 emqx/emqx:5.8.8、 emqx/emqx:5.8.9 、emqx/emqx:5.7.2的镜像都报这个问题,容器内部是可以ping通192.168.0.97

期望得到技术支持

看起来应该是集群连通问题。

  1. 两宿主机先 ping 192.168.0.97 的容器 IP,确认网段和路由
  2. 检查 docker 网络和防火墙:1883/8883/4370/4369 是否双向放通
  3. 来点 emqx 日志,重点看集群 ping/failed 的那段,按时间贴完整日志
version: '3'

services:
  emqx1:
    image: emqx/emqx:5.8.9
    container_name: emqx1
    environment:
      - "EMQX_NODE_NAME=emqx@192.168.202.74"
      - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
      - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@192.168.0.97,emqx@192.168.202.74]"
      - "EMQX_NODE__COOKIE=BusClusterSec_20260612"
    healthcheck:
      test: [ "CMD", "/opt/emqx/bin/emqx", "ctl", "status" ]
      interval: 5s
      timeout: 25s
      retries: 5
    networks:
      emqx-bridge:
        aliases:
          - node2.emqx.io
    ports:
      - 1883:1883
      - 8083:8083
      - 8883:8883
      - 18083:18083
      - 4370:4370
    #      - 4369:4369
    # volumes:
    #   - $PWD/emqx2_data:/opt/emqx/data
  emqx2:
    image: emqx/emqx:5.8.9
    container_name: emqx2
    environment:
      - "EMQX_NODE_NAME=emqx2@192.168.202.74"
      - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
      - "EMQX_CLUSTER__STATIC__SEEDS=[emqx2@192.168.0.97,emqx2@192.168.202.74]"
      - "EMQX_NODE__COOKIE=BusClusterSec_20260611"
      - "EMQX_RPC__TCP_SERVER_PORT=5370"
      - "ERL_EPMD_DIST_PORT=4371"
      - "EMQX_RPC__PORT_DISCOVERY=manual"
      - "ERL_DIST_ADDR=0.0.0.0"
      # 强制dist套接字绑定宿主机网卡192.168.202.74
      - "ERL_ARGS=-kernel inet_dist_use_interface {192,168,202,74}"
    healthcheck:
      test: [ "CMD", "/opt/emqx/bin/emqx", "ctl", "status" ]
      interval: 5s
      timeout: 25s
      retries: 5
    networks:
      emqx-bridge:
        aliases:
          - node1.emqx.io
    ports:
      - 1884:1883
      - 8084:8083
      #      - 8084:8084
      - 8884:8883
      - 18084:18083
      # epmd共用4369,dist、rpc错开
      #      - 4369:4369
      - 4371:4371
      - 5370:5370
    # volumes:
    #   - $PWD/emqx1_data:/opt/emqx/data
networks:
  emqx-bridge:
    driver: bridge

现在默认端口的通了,分别在A、B两台机器上部署 emqx1与emqx2 ,B机器上的emqx1与A机器上的emqx1建立集群成功,B机器上的emqx1日志如下,因为A机器是在WSL中部署的docker部署的服务就不展示日志了因为其网络也是ping不通。

^Croot@pigsty:~/test/emqx# docker logs -f emqx1
EMQX_RPC__PORT_DISCOVERY [rpc.port_discovery]: manual
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds]: [...]
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds.2]: emqx@192.168.202.74
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds.1]: emqx@192.168.0.97
EMQX_CLUSTER__DISCOVERY_STRATEGY [cluster.discovery_strategy]: static
EMQX_NODE__COOKIE [node.cookie]: ******
EMQX_NODE__NAME [node.name]: emqx@192.168.202.74
2026-06-15T08:03:49.963753+00:00 [error] ** Connection attempt from node 'emqx@192.168.202.12' rejected. Invalid challenge reply. **
Listener tcp:default on 0.0.0.0:1883 started.
Listener ssl:default on 0.0.0.0:8883 started.
Listener ws:default on 0.0.0.0:8083 started.
Listener wss:default on 0.0.0.0:8084 started.
Listener http:dashboard on :18083 started.
EMQX 5.8.9 is running now!
2026-06-15T08:03:51.608198+00:00 [warning] msg: Stopping mria, reason: join
Stop listener http:dashboard on :18083 successfully.
Listener tcp:default on 0.0.0.0:1883 stopped.
Listener ssl:default on 0.0.0.0:8883 stopped.
Listener ws:default on 0.0.0.0:8083 stopped.
Listener wss:default on 0.0.0.0:8084 stopped.
Listener tcp:default on 0.0.0.0:1883 started.
Listener ssl:default on 0.0.0.0:8883 started.
Listener ws:default on 0.0.0.0:8083 started.
Listener wss:default on 0.0.0.0:8084 started.
Listener http:dashboard on :18083 started.
2026-06-15T08:03:57.245741+00:00 [error] ** Connection attempt from node 'emqx@192.168.202.12' rejected. Invalid challenge reply. **

^Croot@pigsty:~/test/emqx# docker exec -it emqx1 sh -c “emqx ctl cluster status”
Cluster status: #{running_nodes => [‘emqx@192.168.0.97’,‘emqx@192.168.202.74’],
stopped_nodes => }

A机器的emqx2与B机器上的emqx2建立集群则失败日志如下

root@pigsty:~/test/emqx# docker logs -f emqx2
EMQX_RPC__TCP_SERVER_PORT [rpc.server_port]: 5370
EMQX_RPC__PORT_DISCOVERY [rpc.port_discovery]: manual
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds]: [...]
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds.2]: emqx2@192.168.202.74
EMQX_CLUSTER__STATIC__SEEDS [cluster.static.seeds.1]: emqx2@192.168.0.97
EMQX_CLUSTER__DISCOVERY_STRATEGY [cluster.discovery_strategy]: static
EMQX_NODE__COOKIE [node.cookie]: ******
EMQX_NODE__NAME [node.name]: emqx2@192.168.202.74
Listener tcp:default on 0.0.0.0:1883 started.
Listener ssl:default on 0.0.0.0:8883 started.
Listener ws:default on 0.0.0.0:8083 started.
Listener wss:default on 0.0.0.0:8084 started.
Listener http:dashboard on :18083 started.
EMQX 5.8.9 is running now!
^Croot@pigsty:~/test/emqx# docker exec -it emqx2 sh -c "emqx ctl cluster status"
Node 'emqx2@192.168.202.74' not responding to pings.

补充:A机器是weindows中通过WSL部署的docker然后在其中部署的emqx1与emqx2其里面的节点也是一直报 not responding to pings. 查询资料说是其网络特殊。B机器是debian中部署的docker其中的emqx1节点是可以与A中的emqx1节点建立集群的。期望实现 :A机器分别部署多个节点分别于B中的多个节点分别建议双主互相同步。
谢谢!

这应该和 emqx 部署无关,看着更像是网络方面的配置有问题,我也不太懂 docker 里面的网络。你还得自己探索一下。

您好,emqx有配置通讯端口的环境变量么 比如通讯端口默认的4369与4371想映射为其他端口,有相关环境变量支撑配置么

咨询一下集群之间通讯的端口是多少是必须固定的还是可以自定义


docker中无法配置。

开源版与企业版分别是否支持实现这种场景,A宿主机服务器通过docker分别部署A1、A2、A3三个emqx容器,B宿主机 服务器通过docker分别部署B1、B2、B3三个emqx容器.A1与B1、A2与B2、A3与B3分别建立双主的场景实现。

没有这么干过,最好不要这么干。

可以明确是否支持实现上述场景么,不支持的话就不死磕了,现在测试下来只有一组可以正常建立双主其他两组建立不起来,谢谢,帮忙从理论上明确一下

理论支持,但最好别这么干

怎么配置可以试一下,这个5369端口还有4370,4371 自定义后,B2如何识别A1的自定义通讯端口,有环境变量可以配置么

EMQX_RPC__PORT_DISCOVERY=manual
EMQX_RPC__TCP_SERVER_PORT=5370 有类似配置5370这样的端口环境变量么

不要按“自定义端口映射”配置,集群端口是从 node.name 推导的,static.seeds 里也不能写端口。
B2 识别 A1 的方式只有 node@host,不是 host:port

EMQX_CLUSTER__STATIC__SEEDS=[emqx1@a-host,emqx1@b-host]

端口规则是固定的:

  • Erlang 分布式端口:4370 + 节点名前缀里的数字后缀emqx@host 是 4370,emqx1@host 是 4371,emqx2@host 是 4372。
  • 集群 RPC:Docker 场景文档里是 5369;普通部署是 5370 + offset
  • static.seeds 不会携带端口,所以把容器内 5369/437x 映射成宿主机任意端口,远端节点不会知道。
    所以你这个 A 宿主机跑 A1/A2/A3、B 宿主机跑 B1/B2/B3,再分别跨宿主机组 3 套双节点集群,如果所有节点都用同一个宿主机 IP,只靠 Docker -p 改端口,基本走不通。
    要试只能满足这几个条件:
  1. 每个 EMQX 节点有独立、对端可直连的地址,node.name 的 host 部分要从所有对端解析到这个节点本身,不是同一个宿主机 IP。
  2. 不做任意端口 NAT,开放 EMQX 按节点名推导出来的集群端口。
  3. 同一组集群的 node.cookie 一致,不同组最好隔离 cookie 和数据目录。
  4. emqx2 这种节点名要按 4372 查,不是 4371。
    如果只是验证方案,别在 WSL + Docker bridge + 跨宿主机端口映射上搞了。换成每个节点独立 VM/IP,或者用 macvlan/overlay 网络让容器拿到可路由 IP,再测集群会省很多时间。

感谢