惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
S
Secure Thoughts
月光博客
月光博客
美团技术团队
雷峰网
雷峰网
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Forbes - Security
Forbes - Security
W
WeLiveSecurity
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
G
GRAHAM CLULEY
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
Last Week in AI
Last Week in AI
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
N
News and Events Feed by Topic
罗磊的独立博客
The Register - Security
The Register - Security
Blog — PlanetScale
Blog — PlanetScale
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
B
Blog
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Engineering at Meta
Engineering at Meta
Latest news
Latest news
IT之家
IT之家
D
DataBreaches.Net
博客园 - 司徒正美
N
Netflix TechBlog - Medium
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 分享一下笔者的 Mac 装机必备软件 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
Docker 部署 RocketMQ 5
鲍宪立 · 2026-04-19 · via 博客园_首页

Docker 部署 RocketMQ 5.x 完整教程(含新手踩坑+命令深度解析)

🔥 前言:本文基于实战踩坑经验,整理出 Docker 一键部署 RocketMQ + Dashboard 完整流程,全程面向 Docker 新手,每条命令逐行解析,避开 JDK 兼容、网络连通、集群注册等所有常见坑,Windows/Linux 通用,复制即可上手。

在本地部署 RocketMQ 时,很容易遇到 JDK 版本冲突、Broker 静默退出、客户端连接失败等问题,而 Docker 可以完美隔离环境,统一依赖,让部署变得简单高效,这也是新手避开环境坑的最优方案。

一、前置准备(必看)

1. 环境要求

  • Windows:安装 Docker Desktop(需开启 Hyper-V,新手直接下一步安装即可)
  • Linux:安装 Docker Engine(后续可补充 Linux 安装命令,新手先聚焦部署)
  • 端口开放:9876(NameServer)、10911(Broker)、8080(Dashboard),避免防火墙拦截
  • 内存建议:≥ 2GB,避免容器因内存不足崩溃

2. 核心组件说明(新手必懂)

RocketMQ 核心由 3 个组件组成,缺一不可,Docker 部署时需保证三者互通:

  • NameServer:注册中心,管理 Broker 地址信息,相当于“导航仪”
  • Broker:消息存储与转发核心,相当于“消息仓库”,负责接收、存储、转发消息
  • Dashboard:可视化控制台,替代繁琐的 mqadmin 命令行,新手操作更友好

二、Docker 网络创建(关键一步,避坑核心)

RocketMQ 的 NameServer、Broker、Dashboard 是三个独立容器,需要在同一网络下才能互通,避免因容器 IP 变动导致连接失败(比 --link 更稳定,新手优先用这种方式)。

执行命令

docker network create rocketmq

命令深度解析(新手必看)

  • docker network create:Docker 创建自定义桥接网络的核心命令,桥接网络可实现容器间内网互通
  • rocketmq:自定义网络名称,后续所有 RocketMQ 相关容器都加入这个网络,方便管理
  • 作用:让 NameServer、Broker、Dashboard 处于同一“内网”,无需暴露多余端口,避免网络不通的坑

三、部署 NameServer(注册中心,先启动)

NameServer 是 RocketMQ 的“导航中心”,必须先启动,否则 Broker 无法注册,客户端也无法连接。

1. 启动命令(复制直接执行)

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

2. 逐行解析(新手吃透每一个参数)

-d 后台运行容器 容器启动后不占用终端,关闭终端也不会停止 --name rmqnamesrv 给容器命名 后续查看日志、启动停止容器,直接用这个名字,不用记复杂的容器ID --network rocketmq 加入自定义的 rocketmq 网络 和后续的 Broker、Dashboard 互通,避免网络隔离 --restart always 开机自启 Docker 重启、电脑重启后,容器自动拉起,不用手动重新启动 -p 9876:9876 端口映射(宿主机端口:容器端口) 宿主机的 9876 端口映射到容器的 9876 端口,客户端通过宿主机 IP:9876 访问 NameServer(9876 是 NameServer 默认端口,不可随意修改) -e "JAVA_OPT_EXT=-Xms256m -Xmx256m" 设置 JVM 参数 限制容器占用的内存(初始 256M,最大 256M),避免容器因内存不足 OOM 崩溃,新手不用改这个值 apacherocketmq/rocketmq:5.3.0 使用的 RocketMQ 官方镜像 版本和本地客户端保持一致(本文用 5.3.0,新手直接用这个版本,避免版本冲突) sh mqnamesrv 容器内执行的启动命令 启动 NameServer 服务,固定写法,不用修改
参数 含义 新手必懂作用

3. 验证启动成功(关键一步)

执行以下命令,查看 NameServer 日志,确认启动成功:

docker logs --tail 20 rmqnamesrv

出现以下内容,说明启动成功:

The Name Server boot success

四、部署 Broker(核心组件,最易踩坑)

Broker 是消息存储的核心,也是最容易踩坑的环节(之前遇到的 Broker 静默退出、注册失败,都和配置有关),新手严格按步骤来,不要随意修改参数。

1. 准备自定义配置文件(解决客户端连接不上的核心)

新建一个名为 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

2. Broker 启动命令(复制修改 IP 即可执行)

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

3. 核心参数深度解析(新手重点看)

  • -p 10911:10911:Broker 主通信端口,客户端发送/接收消息必须访问这个端口,不可修改
  • -p 10909:10909:Broker 内部通信端口(主从同步、心跳),无需手动访问,必须映射
  • -v $(pwd)/broker.conf:/home/rocketmq/conf/broker.conf:挂载自定义配置文件
    • $(pwd):表示当前命令执行的目录(确保 broker.conf 在这个目录下)
    • 作用:用自定义的 broker.conf 覆盖容器内默认配置,重点是指定 brokerIP1,避免客户端连接失败
  • -e "NAMESRV_ADDR=rmqnamesrv:9876":指定 NameServer 地址
    • rmqnamesrv:是 NameServer 容器的名称(之前命名的),Docker 内部可通过容器名访问,比 IP 更稳定
    • 作用:让 Broker 启动后自动注册到 NameServer,避免手动注册的麻烦
  • -c /home/rocketmq/conf/broker.conf:指定 Broker 加载的配置文件路径,和挂载的路径一致,不可修改

4. 验证启动成功

执行以下命令,查看 Broker 日志:

docker logs --tail 20 rmqbroker

出现以下内容,说明 Broker 启动成功,且已注册到 NameServer:

The broker boot success. serializeType=JSON
Register broker to name server successfully

五、部署 Dashboard 可视化控制台(新手福音)

Dashboard 是官方提供的可视化工具,替代繁琐的 mqadmin 命令行,可直观查看集群状态、Topic、消息等,新手必部署。

1. 启动命令(复制直接执行)

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

2. 核心参数解析

  • -p 8080:8080:Dashboard 访问端口,宿主机 8080 映射到容器 8080,若 8080 被占用,可修改为 8081:8080(访问时用 8081 端口)
  • -e "JAVA_OPTS=...":指定 NameServer 地址,和 Broker 配置一致,确保 Dashboard 能连接到 NameServer
  • -Dcom.rocketmq.sendMessageWithVIPChannel=false:关闭 VIP 通道,RocketMQ 5.x 默认关闭,避免连接失败

3. 访问 Dashboard

打开浏览器,输入以下地址,无需登录,直接访问:

http://localhost:8080

访问成功后,可看到集群状态、Broker 信息,说明 Dashboard 部署成功。

4. Dashboard 核心功能(新手常用)

  • 集群管理:查看 NameServer、Broker 状态,是否在线
  • Topic 管理:可视化创建、删除、修改 Topic,不用记 mqadmin 命令
  • 消息查询:按 Topic、消息 ID、消息 Key 查询消息,排查消息丢失问题
  • 消费组管理:查看消费组状态、消费堆积情况,重置消费位点
  • 死信队列:查看消费失败的消息,一键重发,解决消费异常问题

六、服务状态检查全套命令(新手必备)

部署完成后,用以下命令检查所有服务是否正常,避免踩坑:

# 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 个最常见的坑,提前避开,节省时间:

坑 1:Broker 启动无日志、静默退出

  • 原因:JDK 版本兼容问题(本地 JDK17 与 RocketMQ 脚本不兼容)、内存不足、配置错误
  • 解决:用 Docker 封装环境,统一 JDK 版本;启动时指定 JVM 内存参数(-Xms512m -Xmx512m);检查 broker.conf 配置是否正确

坑 2:客户端报错 CODE:206 消费者组不在线

  • 原因:使用了官方默认消费组名 please_rename_unique_group_name(这个组是禁用的,无法使用)
  • 解决:自定义消费组名(比如 test-consumer-group);先启动消费者,再发送消息;开启 Broker 自动创建 Topic(autoCreateTopicEnable=true)

坑 3:客户端连接超时、无法发送消息

  • 原因:Broker 注册的是容器内网 IP,客户端无法访问;brokerIP1 配置错误(用了 127.0.0.1)
  • 解决:在 broker.conf 中强制指定 brokerIP1 为宿主机真实 IP;确保容器加入自定义 rocketmq 网络

坑 4:Java 客户端报错 UnsupportedClassVersionError

  • 原因:JDK8 运行 JDK17 编译的 Jar 包,版本不兼容
  • 解决:统一 JDK 版本(客户端用 JDK17);Docker 部署的 RocketMQ 环境已隔离 JDK,不会出现此问题

坑 5:mqadmin 创建 Topic 报错“集群不存在”

  • 原因:Broker 未注册到 NameServer;NameServer 与 Broker 不在同一网络
  • 解决:使用自定义 Docker 网络;启动 Broker 时指定 NAMESRV_ADDR=rmqnamesrv:9876;检查 Broker 日志是否注册成功

八、Java 客户端连接配置(实战可用)

部署完成后,用 Java 代码测试消息收发,核心配置如下(替换宿主机 IP 即可):

1. 生产者代码(发送消息)

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();
    }
}

2. 消费者代码(接收消息)

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 是避开环境坑、快速上手的最优方案,核心要点总结如下:

  1. 先创建自定义 Docker 网络,确保所有容器互通,避免网络问题;
  2. Broker 必须挂载自定义配置文件,指定 brokerIP1 为宿主机 IP,否则客户端无法连接;
  3. 所有组件版本保持一致(本文用 5.3.0),避免版本冲突;
  4. 用 Dashboard 替代命令行,降低运维成本,新手更容易操作;
  5. 遇到问题先看日志,大部分问题都能通过日志定位(docker logs 命令)。

按本文步骤操作,可一次性成功部署 RocketMQ,无需反复踩坑,直接进行消息收发测试,适合新手快速上手。

补充说明

💡 转载请注明出处,若有疑问,欢迎留言讨论。