



























🔥 前言:本文基于实战踩坑经验,整理出 Docker 一键部署 RocketMQ + Dashboard 完整流程,全程面向 Docker 新手,每条命令逐行解析,避开 JDK 兼容、网络连通、集群注册等所有常见坑,Windows/Linux 通用,复制即可上手。
在本地部署 RocketMQ 时,很容易遇到 JDK 版本冲突、Broker 静默退出、客户端连接失败等问题,而 Docker 可以完美隔离环境,统一依赖,让部署变得简单高效,这也是新手避开环境坑的最优方案。
RocketMQ 核心由 3 个组件组成,缺一不可,Docker 部署时需保证三者互通:
RocketMQ 的 NameServer、Broker、Dashboard 是三个独立容器,需要在同一网络下才能互通,避免因容器 IP 变动导致连接失败(比 --link 更稳定,新手优先用这种方式)。
docker network create rocketmq
NameServer 是 RocketMQ 的“导航中心”,必须先启动,否则 Broker 无法注册,客户端也无法连接。
docker run -d \
--name rmqnamesrv \
--network rocketmq \
--restart always \
-p 9876:9876 \
-e "JAVA_OPT_EXT=-Xms256m -Xmx256m" \
apacherocketmq/rocketmq:5.3.0 \
sh mqnamesrv
| 参数 | 含义 | 新手必懂作用 |
|---|---|---|
执行以下命令,查看 NameServer 日志,确认启动成功:
docker logs --tail 20 rmqnamesrv
出现以下内容,说明启动成功:
The Name Server boot success
Broker 是消息存储的核心,也是最容易踩坑的环节(之前遇到的 Broker 静默退出、注册失败,都和配置有关),新手严格按步骤来,不要随意修改参数。
新建一个名为 broker.conf 的文件(任意目录,比如桌面),填入以下配置,重点修改 brokerIP1 为你的宿主机 IP:
# 集群名称,默认 DefaultCluster,和客户端配置一致即可
brokerClusterName = DefaultCluster
# Broker 名称,同一集群内唯一
brokerName = broker-a
# Broker ID,0 表示主节点,大于 0 表示从节点(新手先部署单主节点)
brokerId = 0
# 消息删除时间,默认凌晨 04 点
deleteWhen = 04
# 消息保留时间,默认 48 小时(可修改,比如 72 小时)
fileReservedTime = 48
# Broker 角色,ASYNC_MASTER 异步主节点(新手推荐,性能更好)
brokerRole = ASYNC_MASTER
# 刷盘策略,ASYNC_FLUSH 异步刷盘(新手推荐,兼顾性能和可靠性)
flushDiskType = ASYNC_FLUSH
# 关键配置:宿主机真实 IP(Windows/Linux 本机 IP),不能用 127.0.0.1/localhost
# 查看 IP:Windows 用 ipconfig,Linux 用 ifconfig
brokerIP1 = 192.168.1.105(替换成你的宿主机 IP)
# 开启自动创建 Topic,无需手动用 mqadmin 命令创建(新手必开)
autoCreateTopicEnable = true
docker run -d \
--name rmqbroker \
--network rocketmq \
--restart always \
-p 10911:10911 \
-p 10909:10909 \
-v $(pwd)/broker.conf:/home/rocketmq/conf/broker.conf \
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
-e "JAVA_OPT_EXT=-Xms512m -Xmx512m" \
apacherocketmq/rocketmq:5.3.0 \
sh mqbroker -c /home/rocketmq/conf/broker.conf
执行以下命令,查看 Broker 日志:
docker logs --tail 20 rmqbroker
出现以下内容,说明 Broker 启动成功,且已注册到 NameServer:
The broker boot success. serializeType=JSON
Register broker to name server successfully
Dashboard 是官方提供的可视化工具,替代繁琐的 mqadmin 命令行,可直观查看集群状态、Topic、消息等,新手必部署。
docker run -d \
--name rocketmq-dashboard \
--network rocketmq \
--restart always \
-p 8080:8080 \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
apacherocketmq/rocketmq-dashboard:latest
打开浏览器,输入以下地址,无需登录,直接访问:
http://localhost:8080
访问成功后,可看到集群状态、Broker 信息,说明 Dashboard 部署成功。
部署完成后,用以下命令检查所有服务是否正常,避免踩坑:
# 1. 查看所有运行的容器(确认 NameServer、Broker、Dashboard 都在运行)
docker ps
# 2. 查看 NameServer 日志(排查启动失败问题)
docker logs rmqnamesrv
# 3. 查看 Broker 日志(排查注册失败、启动异常问题)
docker logs rmqbroker
# 4. 检查集群节点(确认 Broker 已注册到 NameServer)
docker exec -it rmqbroker sh mqadmin clusterList -n rmqnamesrv:9876
# 5. 查看端口占用(排查端口冲突问题)
# Windows
netstat -ano | findstr 9876
# Linux
netstat -tuln | grep 9876
结合之前部署遇到的问题,整理出 5 个最常见的坑,提前避开,节省时间:
please_rename_unique_group_name(这个组是禁用的,无法使用)部署完成后,用 Java 代码测试消息收发,核心配置如下(替换宿主机 IP 即可):
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
public class ProducerTest {
public static void main(String[] args) throws Exception {
// 1. 自定义生产者组名(不要用默认组名)
DefaultMQProducer producer = new DefaultMQProducer("test-producer-group");
// 2. 设置 NameServer 地址(宿主机 IP:9876)
producer.setNamesrvAddr("192.168.1.105:9876");
// 3. 启动生产者
producer.start();
// 4. 发送消息(TopicTest 会自动创建,无需手动创建)
Message message = new Message("TopicTest", "Tag1", "Hello RocketMQ!".getBytes());
SendResult result = producer.send(message);
System.out.println("消息发送成功:" + result);
// 5. 关闭生产者
producer.shutdown();
}
}
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
public class ConsumerTest {
public static void main(String[] args) throws Exception {
// 1. 自定义消费者组名(与生产者组名不同)
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test-consumer-group");
// 2. 设置 NameServer 地址(和生产者一致)
consumer.setNamesrvAddr("192.168.1.105:9876");
// 3. 订阅 Topic(* 表示订阅所有 Tag)
consumer.subscribe("TopicTest", "*");
// 4. 注册消息监听(接收消息)
consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
for (MessageExt msg : list) {
System.out.println("收到消息:" + new String(msg.getBody()));
}
// 返回消费成功状态
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
// 5. 启动消费者
consumer.start();
System.out.println("消费者启动成功,等待接收消息...");
}
}
后续启动、停止、重新部署服务,用以下命令即可,不用重新敲部署命令:
# 1. 停止所有 RocketMQ 相关容器
docker stop rmqnamesrv rmqbroker rocketmq-dashboard
# 2. 启动所有 RocketMQ 相关容器
docker start rmqnamesrv rmqbroker rocketmq-dashboard
# 3. 删除所有 RocketMQ 相关容器(重新部署时用)
docker rm -f rmqnamesrv rmqbroker rocketmq-dashboard
# 4. 查看容器详细信息(排查网络、挂载问题)
docker inspect rmqbroker
# 5. 进入 Broker 容器内部(查看配置、日志)
docker exec -it rmqbroker /bin/sh
对于新手来说,Docker 部署 RocketMQ 是避开环境坑、快速上手的最优方案,核心要点总结如下:
按本文步骤操作,可一次性成功部署 RocketMQ,无需反复踩坑,直接进行消息收发测试,适合新手快速上手。
💡 转载请注明出处,若有疑问,欢迎留言讨论。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。