Docker部署跨多机器EMQX集群的配置问题咨询
跨机器Docker部署EMQX集群解决方案
你碰到的问题本质是Docker默认的bridge网络是单机隔离的,跨机器的容器没法直接互通。不需要完全禁用Docker虚拟网络,通过以下方案就能解决,全程不用在宿主机直接安装EMQX:
一、最直接的方案:用Docker主机网络模式
让容器直接复用宿主机的IP和端口栈,不再使用Docker的虚拟网络,这样跨机器的容器就能通过宿主机IP直接通信,完美解决发现问题。
静态列表法(适合2-3节点的小集群)
假设两台机器IP分别为 192.168.1.100(节点1)和 192.168.1.101(节点2):
启动节点1(机器A):
docker run -d --name emqx-node1 --net=host \ -e EMQX_NAME=emqx-node1 \ -e EMQX_HOST=192.168.1.100 \ -e EMQX_CLUSTER__DISCOVERY_STRATEGY=static \ -e EMQX_CLUSTER__STATIC__SEEDS=["emqx@192.168.1.100"] \ emqx/emqx:latest
启动节点2(机器B)并加入集群:
docker run -d --name emqx-node2 --net=host \ -e EMQX_NAME=emqx-node2 \ -e EMQX_HOST=192.168.1.101 \ -e EMQX_CLUSTER__DISCOVERY_STRATEGY=static \ -e EMQX_CLUSTER__STATIC__SEEDS=["emqx@192.168.1.100"] \ emqx/emqx:latest
DNS发现法(适合多节点动态扩容)
如果你的环境有DNS服务(比如本地自建DNS或Consul DNS),可以用DNS自动发现节点,同样用host网络模式:
# 替换EMQX_CLUSTER__DNS__NAME为你的集群DNS域名 docker run -d --name emqx-node --net=host \ -e EMQX_NAME=emqx-node \ -e EMQX_HOST=$(hostname -I | awk '{print $1}') \ -e EMQX_CLUSTER__DISCOVERY_STRATEGY=dns \ -e EMQX_CLUSTER__DNS__NAME=emqx-cluster.local \ -e EMQX_CLUSTER__DNS__RECORD_TYPE=A \ emqx/emqx:latest
二、如果不想用host网络:桥接模式下映射必要端口
要是你坚持用Docker的桥接网络,必须手动映射EMQX集群通信的关键端口,让跨机器容器能互相访问:
必须映射的端口
4369:Erlang节点发现端口(epmd服务)6363:EMQX集群RPC通信端口- 以下是客户端和管理用的可选端口,按需映射:
1883:MQTT TCP端口8083:MQTT WebSocket端口18083:EMQX Dashboard管理端口
桥接模式启动示例(机器A)
docker run -d --name emqx-node1 \ -p 1883:1883 -p 8083:8083 -p 18083:18083 \ -p 4369:4369 -p 6363:6363 \ -e EMQX_NAME=emqx-node1 \ -e EMQX_HOST=192.168.1.100 \ -e EMQX_CLUSTER__DISCOVERY_STRATEGY=static \ -e EMQX_CLUSTER__STATIC__SEEDS=["emqx@192.168.1.100"] \ emqx/emqx:latest
机器B启动时,把EMQX_CLUSTER__STATIC__SEEDS改成机器A的IP,同时映射相同端口即可。
三、验证集群是否成功
进入任意一个容器,执行以下命令检查集群状态:
docker exec -it emqx-node1 emqx_ctl cluster status
如果输出里所有节点都显示为running,说明集群构建完成。
内容的提问来源于stack exchange,提问作者Luis Miguel Silva
相关产品推荐
相关产品推荐

