这是文件
version: '3.8'
services:
emqx:
image: 111test:1443/library/emqx:4.4.18
container_name: emqx
restart: always
user: "${HOST_UID}:${HOST_GID}"
ports:
- 1883:1883
- 8083:8083
- 8084:8084
- 8883:8883
- 18083:18083
volumes:
- ./emqx/data:/opt/emqx/data
- ./emqx/log:/opt/emqx/log
- ./emqx/etc/emqx_auth_mysql.conf:/opt/emqx/etc/plugins/emqx_auth_mysql.conf
network_mode: test_network
environment:
- EMQX_NODE_NAME=emqx@${HOST_IP}
- EMQX_NODE_COOKIE=test001
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static
- EMQX_CLUSTER__STATIC__SEEDS=[ "emqx@${HOST_IP}", "emqx2@${HOST_IP}"]
- EMQX_LISTENER__TCP__EXTERNAL=1883
- EMQX_LISTENER__WS__EXTERNAL=8083
- EMQX_LISTENER__WSS__EXTERNAL=8084
- EMQX_LISTENER__SSL__EXTERNAL=8883
- EMQX_DASHBOARD__LISTENER__HTTP=18083
emqx2:
image: 111test:1443/library/emqx:4.4.18
container_name: emqx2
restart: always
user: "${HOST_UID}:${HOST_GID}"
ports:
- 1884:1883
- 8085:8083
- 8086:8084
- 8884:8883
- 18084:18083
volumes:
- ./emqx2/data:/opt/emqx/data
- ./emqx2/log:/opt/emqx/log
- ./emqx2/etc/emqx_auth_mysql.conf:/opt/emqx/etc/plugins/emqx_auth_mysql.conf
network_mode: test_network
environment:
- EMQX_NODE_NAME=emqx2@${HOST_IP}
- EMQX_NODE_COOKIE=test001
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static
- EMQX_CLUSTER__STATIC__SEEDS=[ "emqx@${HOST_IP}", "emqx2@${HOST_IP}"]
- EMQX_LISTENER__TCP__EXTERNAL=1883
- EMQX_LISTENER__WS__EXTERNAL=8083
- EMQX_LISTENER__WSS__EXTERNAL=8084
- EMQX_LISTENER__SSL__EXTERNAL=8883
- EMQX_DASHBOARD__LISTENER__HTTP=18083
env文件
HOST_UID=0 #echo $(id -u)
HOST_GID=0 #echo $(id -g)
HOST_IP=192.168.8.244
启动是没问题的,但是没有组成集群模式,有大佬遇到过吗
你有两个container 不可能都叫一个host ip的
不要随便填 IP。单机上的两个容器应使用 Docker 网络内可解析的两个不同名字;
不要写宿主机 IP,也不要硬编码容器 IP。
先用最小配置把集群跑通。它使用独立的 Docker 数据卷,不会读取你原来 ./emqx/data 和 ./emqx2/data 里的旧节点数据:
services:
emqx1:
image: emqx/emqx:4.4.18
restart: unless-stopped
ports:
- "1883:1883"
- "8083:8083"
- "8084:8084"
- "8883:8883"
- "18083:18083"
environment:
EMQX_NAME: emqx
EMQX_HOST: node1.emqx.io
EMQX_NODE__COOKIE: test001
EMQX_CLUSTER__DISCOVERY: static
EMQX_CLUSTER__STATIC__SEEDS: "emqx@node1.emqx.io,emqx@node2.emqx.io"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 12
volumes:
- emqx1_data:/opt/emqx/data
- emqx1_log:/opt/emqx/log
networks:
emqx-bridge:
aliases:
- node1.emqx.io
emqx2:
image: emqx/emqx:4.4.18
restart: unless-stopped
ports:
- "1884:1883"
- "8085:8083"
- "8086:8084"
- "8884:8883"
- "18084:18083"
environment:
EMQX_NAME: emqx
EMQX_HOST: node2.emqx.io
EMQX_NODE__COOKIE: test001
EMQX_CLUSTER__DISCOVERY: static
EMQX_CLUSTER__STATIC__SEEDS: "emqx@node1.emqx.io,emqx@node2.emqx.io"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
interval: 5s
timeout: 25s
retries: 12
volumes:
- emqx2_data:/opt/emqx/data
- emqx2_log:/opt/emqx/log
networks:
emqx-bridge:
aliases:
- node2.emqx.io
networks:
emqx-bridge:
driver: bridge
volumes:
emqx1_data:
emqx1_log:
emqx2_data:
emqx2_log:
启动:
docker compose up -d --wait
docker compose ps
docker compose exec -T emqx1 /opt/emqx/bin/emqx_ctl cluster status
docker compose exec -T emqx2 /opt/emqx/bin/emqx_ctl cluster status
预期两个节点都看到:
Cluster status: #{running_nodes => ['emqx@node1.emqx.io','emqx@node2.emqx.io'],
stopped_nodes => []}
你原配置还有三处要一起改:
- 4.4.18 用
EMQX_CLUSTER__DISCOVERY=static,不是 EMQX_CLUSTER__DISCOVERY_STRATEGY。
- Cookie 用
EMQX_NODE__COOKIE,不是 EMQX_NODE_COOKIE。
- 删除两处
network_mode: test_network,改用上面的 networks 和 DNS alias。
如果必须使用内网镜像,只替换两处 image:
image: 111test:1443/library/emqx:4.4.18
先不要挂回旧的 data 目录。节点名已经写入 Mnesia 数据目录,直接拿 emqx@192.168.8.244 的旧数据启动新节点名,容易得到旧节点残留或启动异常。确认新集群正常后,再处理原数据和 MySQL 认证配置。
这套配置已用 emqx/emqx:4.4.18 实际启动验证,两个容器均为 healthy,两个节点的 cluster status 都能看到完整集群。
提示 4.4.18 已过维护周期,快用 5.x 或才 6.x 吧。 
好的,感谢哈,另外想了解下,单机伪集群相比单机版,性能提升大概能有个多少
单机伪集群基本不会提升性能,按 0% 或者 -5% 估算更合适,高负载下还可能比单节点更低。
- 两个容器仍共享同一台主机的 CPU、内存、磁盘和网卡,没有新增硬件资源;
- 单个 EMQX/Erlang VM 默认已经会使用多核 CPU,拆成两个 VM 不是把算力翻倍;
- 集群还多了路由表同步、订阅同步和跨节点消息转发开销。
它的用途主要是验证集群配置、节点发现和故障流程,不是真正的性能扩容或高可用;宿主机宕机时两个节点会一起掉。
要提升容量,把节点放到不同物理机或虚拟机上,前面接 LB 分散连接,再用相同的连接数、消息大小、QoS、订阅扇出做单节点/双节点压测。双节点提升多少没有通用百分比,也不会必然线性翻倍。
如果暂时只有这一台机器,直接跑单节点最佳!