文章目錄
- 創建自定義網絡
- 創建NameServer容器
- 創建Broker容器
- 正式開始
- 啟動 Nameserver 容器
- 啟動 Broker 容器并關聯 Nameserver
- docker exec -it rmqbroker vi /etc/rocketmq/broker.conf
- 檢查 namesrv 解析
- 檢查 Broker 注冊狀態
- Nameserver 日志
- Broker 日志
- 檢查容器日志
- 手動指定 Broker 地址創建 Topic
- topic創建
- 驗證 Topic 是否成功創建
- 檢查 RocketMQ 集群狀態
- 自動創建消費者組(Consumer Group)
- 查看消費者組列表
- 關聯配置(可選)
- 注意事項
- 手動創建消費者組(備用方案)
創建自定義網絡
docker network create my-rocketmq-network
創建NameServer容器
docker run -di --network my-rocketmq-network -p 9876:9876 --name=rmqserver \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
-e "JAVA_OPTS=-Duser.home=/opt" \
foxiswho/rocketmq:server-4.5.1
創建Broker容器
docker run -di --network my-rocketmq-network -p 10911:10911 -p 10909:10909 --name=rmqbroker \
-e "JAVA_OPTS=-Duser.home=/opt" \
-e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
foxiswho/rocketmq:broker-4.5.1
sudo iptables -t nat -L -n --line-numbers
使用 -n 參數禁止端口到服務名稱的解析
NAT表主要用于網絡地址轉換,包括DNAT(目標地址轉換)和SNAT/MASQUERADE(源地址轉換)。PREROUTING鏈處理進入的數據包,修改目標地址;POSTROUTING鏈處理離開的數據包,修改源地址。DOCKER鏈是Docker服務自動生成的規則,用于容器網絡的管理。
MASQUERADE的作用是動態源地址轉換,常用于動態IP的環境;DNAT則是目標地址轉換,用于端口轉發。同時,Docker創建的規則可能會影響用戶手動添加的規則,尤其是在PREROUTING鏈中規則順序的問題,Docker的規則可能優先執行,導致用戶規則未生效。
Chain INPUT (policy ACCEPT)
num target prot opt source destinationChain INPUT (policy ACCEPT)
無規則:直接接受所有流量(默認策略為 ACCEPT)。
num target prot opt source destination
1 DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL含義:將所有目標地址為 本地主機 IP 且源地址 不是環回網段(!loopback/8,即非 127.0.0.0/8)的流量轉發到 DOCKER 鏈。隱藏信息:Docker 使用此規則處理從本地主機發往容器網絡的流量。
刪除 Docker 的沖突規則:sudo iptables -t nat -D DOCKER 7
sudo iptables -t nat -I PREROUTING 1 -p tcp --dport 9876 -j DNAT --to-destination 內網ip:9876
正式開始
啟動 Nameserver 容器
docker run -d --name rmqserver -p 9876:9876 -e "JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn128m" -e "JAVA_OPTS=-Duser.home=/opt" foxiswho/rocketmq:server-4.3.2
啟動 Broker 容器并關聯 Nameserver
docker run -d --name rmqbroker -p 10911:10911 -p 10909:10909 --link rmqserver:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn128m" -e "JAVA_OPTS=-Duser.home=/opt" -e "BROKER_IP1=<公網IP>" foxiswho/rocketmq:broker-4.3.2
–link rmqserver:namesrv # 關聯 Nameserver 容器
-e “NAMESRV_ADDR=namesrv:9876” # 使用容器別名訪問 Nameserver
docker exec -it rmqbroker vi /etc/rocketmq/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 公網ip
autoCreateTopicEnable = true
listenPort = 10911
haListenPort = 10909
namesrvAddr = 公網ip:9876
autoCreateProducerGroup=true
檢查 namesrv 解析
ping namesrv # 應返回 172.17.0.3(rmqserver 容器的 IP)
cat /etc/hosts # 確認 namesrv 指向 rmqserver 的 IP
檢查 Broker 注冊狀態
查看 Nameserver 中的 Broker 列表:
docker exec -it rmqserver sh mqadmin clusterList -n namesrv:9876
Nameserver 日志
docker logs -f rmqserver
Broker 日志
docker logs -f rmqbroker
檢查容器日志
docker logs -f rmqserver | grep "boot success" # Nameserver 日志
docker logs -f rmqbroker | grep "boot success" # Broker 日志
手動指定 Broker 地址創建 Topic
如果自動注冊失敗,直接指定 Broker 的地址:
docker exec -it rmqbroker sh mqadmin updateTopic \-n namesrv:9876 \-t TopicTest \-b "Broker 的公網 IP:10911"
topic創建
docker exec -it rmqbroker sh mqadmin updateTopic -n namesrv:9876 -t TopicTest -b "公網ip:10911"
驗證 Topic 是否成功創建
docker exec -it rmqbroker sh mqadmin topicList -n namesrv:9876
sudo iptables -A INPUT -p tcp --dport 10909 -j ACCEPT
網絡模式選擇
Bridge 模式:Docker 默認使用 bridge 網絡模式,容器通過端口映射與宿主機通信。這種方式適合大多數場景,且配置簡單。
Host 模式:如果你使用 host 模式,容器會直接使用宿主機的網絡棧,端口映射不再需要,但可能會帶來端口沖突的問題。
NAT 模式:NAT 模式通常用于虛擬機網絡配置,Docker 容器一般不使用 NAT 模式。
檢查 RocketMQ 集群狀態
通過命令
mqadmin clusterList -n 192.168.33.1:9876
確認 Broker 和 NameServer 狀態正常。
查看 Broker 日志
檢查 Broker 日志($ROCKETMQ_HOME/logs/rocketmqlogs/broker.log),排查是否有存儲或網絡錯誤。
使用命令行工具驗證
查詢消息:
mqadmin queryMsgByKey -n 192.168.33.1:9876 -t YourTopic -k YourKey
查看生產者組列表:
mqadmin producerConnection -n 192.168.33.1:9876 -g MyProducerGroup
自動創建消費者組(Consumer Group)
在RocketMQ中,訂閱組(Subscription Group)包含消費者組的信息,所以自動創建訂閱組實際上就是自動創建消費者組。
還需要考慮不同RocketMQ版本的差異。例如,4.5.0之后的版本可能默認行為不同,或者某些配置項有變化。
默認情況下,RocketMQ Broker 不會自動創建消費者組。需要通過以下配置顯式啟用:
Broker 配置文件(broker.conf)
# 允許自動創建訂閱組(Subscription Group,包含消費者組)
autoCreateSubscriptionGroup = true# 設置 Broker 權限(6 表示讀寫權限)
brokerPermission = 6
關鍵配置解釋
autoCreateSubscriptionGroup=true
允許 Broker 在消費者首次連接時自動創建訂閱組(Subscription Group),即消費者組。
brokerPermission=6
確保 Broker 有權限自動創建組(默認值為 6,即讀寫權限,一般無需修改)。
查看消費者組列表
通過 RocketMQ 控制臺或命令行工具檢查消費者組是否自動創建:
mqadmin consumerConnection -n <namesrv-address> -g YourConsumerGroup
檢查 Broker 日志
觀察 Broker 日志($ROCKETMQ_HOME/logs/rocketmqlogs/broker.log),確認無權限錯誤或組創建失敗信息。
關聯配置(可選)
調整消費者組重試隊列
如果消費者組需要重試隊列(Retry Queue),可配置:
# 每個訂閱組的重試隊列數量(默認 1)
retryQueueNums = 1# 消費重試次數(默認 16 次)
retryMaxTimes = 16
注意事項
生產環境建議
自動創建功能適合開發和測試環境。生產環境建議手動創建消費者組,并通過控制臺或 CLI 管理,避免組名沖突或權限問題。
權限控制
如果 Broker 集群啟用了 ACL(訪問控制列表),需確保消費者客戶端有權限創建訂閱組。
版本兼容性
RocketMQ 4.5.0+ 版本支持 autoCreateSubscriptionGroup,低版本需升級。
手動創建消費者組(備用方案)
如果禁用自動創建,可通過命令行手動創建訂閱組:
mqadmin updateSubGroup -n <namesrv-address> -c <cluster-name> -g YourConsumerGroup