通过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 的端口映射问题。
- 做法: 在每台云服务器上,只启动一个 EMQX 容器。启动时,使用
--net=host(docker run) 或network_mode: "host"(docker-compose) 来指定网络模式。 - 原理:
host模式让容器直接共享宿主机的网络,不再有隔离的容器 IP。 - 效果:
- 你不需要再做任何端口映射(去掉所有
-p参数)。 - EMQX 容器会直接监听你云服务器的 IP(
ip1和ip2)。 emqx@ip1会监听在ip1:5369,emqx@ip2会监听在ip2:5369。- 只要你的云服务器防火墙(安全组)放行了 EMQX 集群所需的端口(如 5369, 4370 等),这两个节点就可以像标准非 Docker 集群一样,通过
emqx_ctl cluster join emqx@ip2这样的命令完美组网。
方案二:使用 Docker Swarm (Overlay Network) - 更规范
如果你希望未来能更方便地管理这个跨主机的集群(比如服务发现、动态扩缩容),推荐使用 Docker Swarm 模式。
- 做法:
- 在
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网络。
- 原理: Swarm 会创建一个虚拟网络,跨越你所有的云主机。在这个网络内的所有容器,都可以通过服务名直接通信,Docker 会自动处理底层的路由和端口。
- 效果: 你可以轻松地启动一个有 2 个(或 N 个)副本的 EMQX 服务,Swarm 会自动在
ip1和ip2上各部署一个容器。这些容器在emqx-net内部可以互相发现并组成集群。这是更健壮和“云原生”的做法。
总结一下: 停止在一台机器上跑多个 EMQX 容器。建议你立即尝试方案一(Host 模式),它能最快地解决你当前的问题。如果后续对编排有更高要求,再研究方案二(Swarm)。
收到,host模式下已经用过了,不清楚这种模式下单个docker容器能支撑多大的连接数,我想搞到百万级,所以目前采用了bridge方式,想测试一下能支撑的最大连接数。
方案二,我尝试看下,应该是个好方向,谢谢!
搞百 W 级,就不要用 docker 了,直接装就行了。
真不需要在一台云主机上搞多个 emqx 实例。emqx 能发挥出多核的能力的。
1 台 64core 的上装一个 emqx,比在上面装 2 个,每个限制成 32core 的部署方式强多了。
收到,多谢指导