Docker?部署?RocketMQ?5的完整教程
Docker 部署 RocketMQ 5.x 完整教程(含新手踩坑+命令深度解析)
?? 前言:本文基于實戰(zhàn)踩坑經(jīng)驗,整理出 Docker 一鍵部署 RocketMQ + Dashboard 完整流程,全程面向 Docker 新手,每條命令逐行解析,避開 JDK 兼容、網(wǎng)絡(luò)連通、集群注冊等所有常見坑,Windows/Linux 通用,復(fù)制即可上手。
在本地部署 RocketMQ 時,很容易遇到 JDK 版本沖突、Broker 靜默退出、客戶端連接失敗等問題,而 Docker 可以完美隔離環(huán)境,統(tǒng)一依賴,讓部署變得簡單高效,這也是新手避開環(huán)境坑的最優(yōu)方案。
一、前置準(zhǔn)備(必看)
1. 環(huán)境要求
- Windows:安裝 Docker Desktop(需開啟 Hyper-V,新手直接下一步安裝即可)
- Linux:安裝 Docker Engine(后續(xù)可補(bǔ)充 Linux 安裝命令,新手先聚焦部署)
- 端口開放:9876(NameServer)、10911(Broker)、8080(Dashboard),避免防火墻攔截
- 內(nèi)存建議:≥ 2GB,避免容器因內(nèi)存不足崩潰
2. 核心組件說明(新手必懂)
RocketMQ 核心由 3 個組件組成,缺一不可,Docker 部署時需保證三者互通:
- NameServer:注冊中心,管理 Broker 地址信息,相當(dāng)于“導(dǎo)航儀”
- Broker:消息存儲與轉(zhuǎn)發(fā)核心,相當(dāng)于“消息倉庫”,負(fù)責(zé)接收、存儲、轉(zhuǎn)發(fā)消息
- Dashboard:可視化控制臺,替代繁瑣的 mqadmin 命令行,新手操作更友好
二、Docker 網(wǎng)絡(luò)創(chuàng)建(關(guān)鍵一步,避坑核心)
RocketMQ 的 NameServer、Broker、Dashboard 是三個獨立容器,需要在同一網(wǎng)絡(luò)下才能互通,避免因容器 IP 變動導(dǎo)致連接失敗(比 --link 更穩(wěn)定,新手優(yōu)先用這種方式)。
執(zhí)行命令
docker network create rocketmq
命令深度解析(新手必看)
- docker network create:Docker 創(chuàng)建自定義橋接網(wǎng)絡(luò)的核心命令,橋接網(wǎng)絡(luò)可實現(xiàn)容器間內(nèi)網(wǎng)互通
- rocketmq:自定義網(wǎng)絡(luò)名稱,后續(xù)所有 RocketMQ 相關(guān)容器都加入這個網(wǎng)絡(luò),方便管理
- 作用:讓 NameServer、Broker、Dashboard 處于同一“內(nèi)網(wǎng)”,無需暴露多余端口,避免網(wǎng)絡(luò)不通的坑
三、部署 NameServer(注冊中心,先啟動)
NameServer 是 RocketMQ 的“導(dǎo)航中心”,必須先啟動,否則 Broker 無法注冊,客戶端也無法連接。
1. 啟動命令(復(fù)制直接執(zhí)行)
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. 逐行解析(新手吃透每一個參數(shù))
| 參數(shù) | 含義 | 新手必懂作用 |
|---|---|---|
| -d | 后臺運行容器 | 容器啟動后不占用終端,關(guān)閉終端也不會停止 |
| --name rmqnamesrv | 給容器命名 | 后續(xù)查看日志、啟動停止容器,直接用這個名字,不用記復(fù)雜的容器ID |
| --network rocketmq | 加入自定義的 rocketmq 網(wǎng)絡(luò) | 和后續(xù)的 Broker、Dashboard 互通,避免網(wǎng)絡(luò)隔離 |
| --restart always | 開機(jī)自啟 | Docker 重啟、電腦重啟后,容器自動拉起,不用手動重新啟動 |
| -p 9876:9876 | 端口映射(宿主機(jī)端口:容器端口) | 宿主機(jī)的 9876 端口映射到容器的 9876 端口,客戶端通過宿主機(jī) IP:9876 訪問 NameServer(9876 是 NameServer 默認(rèn)端口,不可隨意修改) |
| -e "JAVA_OPT_EXT=-Xms256m -Xmx256m" | 設(shè)置 JVM 參數(shù) | 限制容器占用的內(nèi)存(初始 256M,最大 256M),避免容器因內(nèi)存不足 OOM 崩潰,新手不用改這個值 |
| apacherocketmq/rocketmq:5.3.0 | 使用的 RocketMQ 官方鏡像 | 版本和本地客戶端保持一致(本文用 5.3.0,新手直接用這個版本,避免版本沖突) |
| sh mqnamesrv | 容器內(nèi)執(zhí)行的啟動命令 | 啟動 NameServer 服務(wù),固定寫法,不用修改 |
3. 驗證啟動成功(關(guān)鍵一步)
執(zhí)行以下命令,查看 NameServer 日志,確認(rèn)啟動成功:
docker logs --tail 20 rmqnamesrv
出現(xiàn)以下內(nèi)容,說明啟動成功:
The Name Server boot success
四、部署 Broker(核心組件,最易踩坑)
Broker 是消息存儲的核心,也是最容易踩坑的環(huán)節(jié)(之前遇到的 Broker 靜默退出、注冊失敗,都和配置有關(guān)),新手嚴(yán)格按步驟來,不要隨意修改參數(shù)。
1. 準(zhǔn)備自定義配置文件(解決客戶端連接不上的核心)
新建一個名為 broker.conf 的文件(任意目錄,比如桌面),填入以下配置,重點修改 brokerIP1 為你的宿主機(jī) IP:
# 集群名稱,默認(rèn) DefaultCluster,和客戶端配置一致即可 brokerClusterName = DefaultCluster # Broker 名稱,同一集群內(nèi)唯一 brokerName = broker-a # Broker ID,0 表示主節(jié)點,大于 0 表示從節(jié)點(新手先部署單主節(jié)點) brokerId = 0 # 消息刪除時間,默認(rèn)凌晨 04 點 deleteWhen = 04 # 消息保留時間,默認(rèn) 48 小時(可修改,比如 72 小時) fileReservedTime = 48 # Broker 角色,ASYNC_MASTER 異步主節(jié)點(新手推薦,性能更好) brokerRole = ASYNC_MASTER # 刷盤策略,ASYNC_FLUSH 異步刷盤(新手推薦,兼顧性能和可靠性) flushDiskType = ASYNC_FLUSH # 關(guān)鍵配置:宿主機(jī)真實 IP(Windows/Linux 本機(jī) IP),不能用 127.0.0.1/localhost # 查看 IP:Windows 用 ipconfig,Linux 用 ifconfig brokerIP1 = 192.168.1.105(替換成你的宿主機(jī) IP) # 開啟自動創(chuàng)建 Topic,無需手動用 mqadmin 命令創(chuàng)建(新手必開) autoCreateTopicEnable = true
2. Broker 啟動命令(復(fù)制修改 IP 即可執(zhí)行)
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. 核心參數(shù)深度解析(新手重點看)
- -p 10911:10911:Broker 主通信端口,客戶端發(fā)送/接收消息必須訪問這個端口,不可修改
- -p 10909:10909:Broker 內(nèi)部通信端口(主從同步、心跳),無需手動訪問,必須映射
- -v $(pwd)/broker.conf:/home/rocketmq/conf/broker.conf:掛載自定義配置文件
- $(pwd):表示當(dāng)前命令執(zhí)行的目錄(確保 broker.conf 在這個目錄下)
- 作用:用自定義的 broker.conf 覆蓋容器內(nèi)默認(rèn)配置,重點是指定 brokerIP1,避免客戶端連接失敗
- -e "NAMESRV_ADDR=rmqnamesrv:9876":指定 NameServer 地址
- rmqnamesrv:是 NameServer 容器的名稱(之前命名的),Docker 內(nèi)部可通過容器名訪問,比 IP 更穩(wěn)定
- 作用:讓 Broker 啟動后自動注冊到 NameServer,避免手動注冊的麻煩
- -c /home/rocketmq/conf/broker.conf:指定 Broker 加載的配置文件路徑,和掛載的路徑一致,不可修改
4. 驗證啟動成功
執(zhí)行以下命令,查看 Broker 日志:
docker logs --tail 20 rmqbroker
出現(xiàn)以下內(nèi)容,說明 Broker 啟動成功,且已注冊到 NameServer:
The broker boot success. serializeType=JSON Register broker to name server successfully
五、部署 Dashboard 可視化控制臺(新手福音)
Dashboard 是官方提供的可視化工具,替代繁瑣的 mqadmin 命令行,可直觀查看集群狀態(tài)、Topic、消息等,新手必部署。
1. 啟動命令(復(fù)制直接執(zhí)行)
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. 核心參數(shù)解析
- -p 8080:8080:Dashboard 訪問端口,宿主機(jī) 8080 映射到容器 8080,若 8080 被占用,可修改為 8081:8080(訪問時用 8081 端口)
- -e "JAVA_OPTS=...":指定 NameServer 地址,和 Broker 配置一致,確保 Dashboard 能連接到 NameServer
- -Dcom.rocketmq.sendMessageWithVIPChannel=false:關(guān)閉 VIP 通道,RocketMQ 5.x 默認(rèn)關(guān)閉,避免連接失敗
3. 訪問 Dashboard
打開瀏覽器,輸入以下地址,無需登錄,直接訪問:
http://localhost:8080
訪問成功后,可看到集群狀態(tài)、Broker 信息,說明 Dashboard 部署成功。
4. Dashboard 核心功能(新手常用)
- 集群管理:查看 NameServer、Broker 狀態(tài),是否在線
- Topic 管理:可視化創(chuàng)建、刪除、修改 Topic,不用記 mqadmin 命令
- 消息查詢:按 Topic、消息 ID、消息 Key 查詢消息,排查消息丟失問題
- 消費組管理:查看消費組狀態(tài)、消費堆積情況,重置消費位點
- 死信隊列:查看消費失敗的消息,一鍵重發(fā),解決消費異常問題
六、服務(wù)狀態(tài)檢查全套命令(新手必備)
部署完成后,用以下命令檢查所有服務(wù)是否正常,避免踩坑:
# 1. 查看所有運行的容器(確認(rèn) NameServer、Broker、Dashboard 都在運行) docker ps # 2. 查看 NameServer 日志(排查啟動失敗問題) docker logs rmqnamesrv # 3. 查看 Broker 日志(排查注冊失敗、啟動異常問題) docker logs rmqbroker # 4. 檢查集群節(jié)點(確認(rèn) Broker 已注冊到 NameServer) docker exec -it rmqbroker sh mqadmin clusterList -n rmqnamesrv:9876 # 5. 查看端口占用(排查端口沖突問題) # Windows netstat -ano | findstr 9876 # Linux netstat -tuln | grep 9876
七、實戰(zhàn)踩坑總結(jié)(我們親身遇到的問題,新手必看)
結(jié)合之前部署遇到的問題,整理出 5 個最常見的坑,提前避開,節(jié)省時間:
坑 1:Broker 啟動無日志、靜默退出
- 原因:JDK 版本兼容問題(本地 JDK17 與 RocketMQ 腳本不兼容)、內(nèi)存不足、配置錯誤
- 解決:用 Docker 封裝環(huán)境,統(tǒng)一 JDK 版本;啟動時指定 JVM 內(nèi)存參數(shù)(-Xms512m -Xmx512m);檢查 broker.conf 配置是否正確
坑 2:客戶端報錯 CODE:206 消費者組不在線
- 原因:使用了官方默認(rèn)消費組名
please_rename_unique_group_name(這個組是禁用的,無法使用) - 解決:自定義消費組名(比如 test-consumer-group);先啟動消費者,再發(fā)送消息;開啟 Broker 自動創(chuàng)建 Topic(autoCreateTopicEnable=true)
坑 3:客戶端連接超時、無法發(fā)送消息
- 原因:Broker 注冊的是容器內(nèi)網(wǎng) IP,客戶端無法訪問;brokerIP1 配置錯誤(用了 127.0.0.1)
- 解決:在 broker.conf 中強(qiáng)制指定 brokerIP1 為宿主機(jī)真實 IP;確保容器加入自定義 rocketmq 網(wǎng)絡(luò)
坑 4:Java 客戶端報錯 UnsupportedClassVersionError
- 原因:JDK8 運行 JDK17 編譯的 Jar 包,版本不兼容
- 解決:統(tǒng)一 JDK 版本(客戶端用 JDK17);Docker 部署的 RocketMQ 環(huán)境已隔離 JDK,不會出現(xiàn)此問題
坑 5:mqadmin 創(chuàng)建 Topic 報錯“集群不存在”
- 原因:Broker 未注冊到 NameServer;NameServer 與 Broker 不在同一網(wǎng)絡(luò)
- 解決:使用自定義 Docker 網(wǎng)絡(luò);啟動 Broker 時指定 NAMESRV_ADDR=rmqnamesrv:9876;檢查 Broker 日志是否注冊成功
八、Java 客戶端連接配置(實戰(zhàn)可用)
部署完成后,用 Java 代碼測試消息收發(fā),核心配置如下(替換宿主機(jī) IP 即可):
1. 生產(chǎn)者代碼(發(fā)送消息)
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. 自定義生產(chǎn)者組名(不要用默認(rèn)組名)
DefaultMQProducer producer = new DefaultMQProducer("test-producer-group");
// 2. 設(shè)置 NameServer 地址(宿主機(jī) IP:9876)
producer.setNamesrvAddr("192.168.1.105:9876");
// 3. 啟動生產(chǎn)者
producer.start();
// 4. 發(fā)送消息(TopicTest 會自動創(chuàng)建,無需手動創(chuàng)建)
Message message = new Message("TopicTest", "Tag1", "Hello RocketMQ!".getBytes());
SendResult result = producer.send(message);
System.out.println("消息發(fā)送成功:" + result);
// 5. 關(guān)閉生產(chǎn)者
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. 自定義消費者組名(與生產(chǎn)者組名不同)
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test-consumer-group");
// 2. 設(shè)置 NameServer 地址(和生產(chǎn)者一致)
consumer.setNamesrvAddr("192.168.1.105:9876");
// 3. 訂閱 Topic(* 表示訂閱所有 Tag)
consumer.subscribe("TopicTest", "*");
// 4. 注冊消息監(jiān)聽(接收消息)
consumer.registerMessageListener((MessageListenerConcurrently) (list, context) -> {
for (MessageExt msg : list) {
System.out.println("收到消息:" + new String(msg.getBody()));
}
// 返回消費成功狀態(tài)
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
// 5. 啟動消費者
consumer.start();
System.out.println("消費者啟動成功,等待接收消息...");
}
}九、容器常用運維命令(新手必備)
后續(xù)啟動、停止、重新部署服務(wù),用以下命令即可,不用重新敲部署命令:
# 1. 停止所有 RocketMQ 相關(guān)容器 docker stop rmqnamesrv rmqbroker rocketmq-dashboard # 2. 啟動所有 RocketMQ 相關(guān)容器 docker start rmqnamesrv rmqbroker rocketmq-dashboard # 3. 刪除所有 RocketMQ 相關(guān)容器(重新部署時用) docker rm -f rmqnamesrv rmqbroker rocketmq-dashboard # 4. 查看容器詳細(xì)信息(排查網(wǎng)絡(luò)、掛載問題) docker inspect rmqbroker # 5. 進(jìn)入 Broker 容器內(nèi)部(查看配置、日志) docker exec -it rmqbroker /bin/sh
十、總結(jié)
對于新手來說,Docker 部署 RocketMQ 是避開環(huán)境坑、快速上手的最優(yōu)方案,核心要點總結(jié)如下:
- 先創(chuàng)建自定義 Docker 網(wǎng)絡(luò),確保所有容器互通,避免網(wǎng)絡(luò)問題;
- Broker 必須掛載自定義配置文件,指定 brokerIP1 為宿主機(jī) IP,否則客戶端無法連接;
- 所有組件版本保持一致(本文用 5.3.0),避免版本沖突;
- 用 Dashboard 替代命令行,降低運維成本,新手更容易操作;
- 遇到問題先看日志,大部分問題都能通過日志定位(docker logs 命令)。
按本文步驟操作,可一次性成功部署 RocketMQ,無需反復(fù)踩坑,直接進(jìn)行消息收發(fā)測試,適合新手快速上手。
到此這篇關(guān)于Docker 部署 RocketMQ 5的完整教程的文章就介紹到這了,更多相關(guān)Docker 部署 RocketMQ內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker出現(xiàn)Cannot connect to the Docker daemon. Is the docker d
這篇文章主要介紹了Docker出現(xiàn)Cannot connect to the Docker daemon. Is the docker daemon running on this host錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12
Linux中使用Docker構(gòu)建Nginx容器的詳細(xì)攻略
Nginx是一款廣泛使用的高性能 Web 服務(wù)器和反向代理服務(wù)器,適用于各種場景,如靜態(tài)文件服務(wù)、負(fù)載均衡和 API 網(wǎng)關(guān)等,在本教程中,我們將詳細(xì)介紹如何在 Docker 中構(gòu)建并運行一個 Nginx 容器,幫助開發(fā)者快速搭建和管理 Nginx 服務(wù),感興趣的朋友跟隨小編一起看看吧2025-12-12
通過容器技術(shù)(docker)部署MySQL讀寫分離
Mycat作為開源數(shù)據(jù)庫中間件,在MySQL讀寫分離架構(gòu)中發(fā)揮核心作用,通過智能代理層實現(xiàn)讀寫請求的自動路由、負(fù)載均衡與故障轉(zhuǎn)移,從而提高系統(tǒng)性能和可用性2026-01-01
使用 Docker-compose 搭建lnmp的詳細(xì)過程
Docker-Compose項目是Docker官方的開源項目,負(fù)責(zé)實現(xiàn)對Docker容器集群的快速編排,這篇文章主要介紹了使用 Docker-compose 搭建lnmp,需要的朋友可以參考下2023-06-06
關(guān)于docker啟動jenkins環(huán)境的問題
這篇文章主要介紹了docker啟動jenkins環(huán)境的問題,文中提到了jenkins基本工作原理及管理員密碼獲取方法,對docker啟動jenkins環(huán)境相關(guān)知識感興趣的朋友一起看看吧2022-04-04
Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫超詳細(xì)攻略
Docker倉庫是集中存放鏡像的地方,分為公共倉庫和私有倉庫,這篇文章主要給大家介紹了關(guān)于Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

