RocketMQ 从二进制到 Docker 完整部署(含 Dashboard)

RocketMQ 在 5.x 版本中不仅提供了强大的消息功能,还引入了 Proxy、HTTP 接口等新特性。我一开始使用的是 二进制启动mqnamesrvmqbroker),但后来发现 Docker 部署更易管理、更易升级。本文将完整介绍如何将 RocketMQ 从二进制迁移到 Docker,并解决常见问题。


1. 清理二进制版本

如果你之前用二进制启动过 mqnamesrvmqbroker,先停掉这些进程,避免端口冲突。

1.1 停止进程

使用 jpsps -ef 找到 NamesrvStartupBrokerStartup 进程:

bash 复制代码
jps
# 输出示例
259515 BrokerStartup
258287 NamesrvStartup

停止进程:

bash 复制代码
kill -9 259515 258287

1.2 清除环境变量

如果 /etc/profile 中设置了 RocketMQ 的环境变量,建议移除:

bash 复制代码
vim /etc/profile
# 删除:
export rocketmq=/usr/local/rocketmq-all-5.3.2-bin-release/
export PATH=$PATH:$rocketmq/bin

刷新配置:

bash 复制代码
source /etc/profile

2. 安装 Docker

在 Rocky Linux 9 环境下,Docker 官方仓库可能会出现 SSL 问题,因此推荐使用国内镜像源。

2.1 安装 Docker CE

bash 复制代码
dnf install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

如果下载过慢,可改用国内源:

bash 复制代码
rm -f /etc/yum.repos.d/docker-ce.repo
tee /etc/yum.repos.d/docker-ce.repo <<-'EOF'
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/8/$basearch/stable
enabled=1
gpgcheck=0
EOF
dnf clean all
dnf makecache

2.2 启动 Docker

bash 复制代码
systemctl daemon-reload
systemctl enable --now docker

3. 配置 Docker 镜像加速

/etc/docker/daemon.json 配置加速器:

bash 复制代码
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.baidubce.com"
  ]
}
EOF
systemctl daemon-reload
systemctl restart docker

4. 部署 RocketMQ 容器

RocketMQ 的 Docker 部署通常包括:

  • Namesrv(NameServer)
  • Broker
  • Dashboard

4.1 创建自定义网络

bash 复制代码
docker network create rocketmq

4.2 启动 Namesrv

bash 复制代码
docker run -d --name rmqnamesrv \
  --network rocketmq \
  -p 9876:9876 \
  apache/rocketmq:5.3.2 sh mqnamesrv

4.3 解决 Broker 127.0.0.1 问题

RocketMQ Broker 注册到 Namesrv 时默认用 127.0.0.1:10911,外部客户端无法访问,需要指定 brokerIP1 为宿主机 IP。

方法 1:用环境变量

bash 复制代码
docker run -d --name rmqbroker \
  --network rocketmq \
  -p 10909:10909 -p 10911:10911 -p 10912:10912 \
  -p 18082:8080 -p 18083:8081 \
  -e "NAMESRV_ADDR=rmqnamesrv:9876" \
  -e "JAVA_OPT_EXT=-Drocketmq.brokerIP1=172.16.0.3" \
  apache/rocketmq:5.3.2 sh mqbroker --enable-proxy

172.16.0.3 是宿主机的内网地址,可通过 ip addr show 查看。

方法 2:使用 broker.conf

如果需要更多自定义配置,创建 broker.conf

bash 复制代码
cd /opt/rocketmq-docker
vim broker.conf

内容示例:

conf 复制代码
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
brokerIP1=172.16.0.3

启动时挂载:

bash 复制代码
docker run -d --name rmqbroker \
  --network rocketmq \
  -p 10909:10909 -p 10911:10911 -p 10912:10912 \
  -p 18082:8080 -p 18083:8081 \
  -e "NAMESRV_ADDR=rmqnamesrv:9876" \
  -v /opt/rocketmq-docker/broker.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf \
  apache/rocketmq:5.3.2 \
  sh mqbroker --enable-proxy -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf

4.4 启动 Dashboard

bash 复制代码
docker run -d --name rocketmq-dashboard \
  --network rocketmq \
  -p 18080:8080 \
  -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876" \
  apacherocketmq/rocketmq-dashboard:latest

访问 http://<宿主机IP>:18080


5. 防火墙与安全组配置

需要放通的端口:

  • 9876:Namesrv
  • 10911:Broker 通信端口
  • 18080:Dashboard
  • 18082:Broker HTTP Proxy

5.1 开放防火墙端口

css 复制代码
bash
复制编辑
firewall-cmd --add-port=9876/tcp --permanent
firewall-cmd --add-port=10911/tcp --permanent
firewall-cmd --add-port=18080/tcp --permanent
firewall-cmd --add-port=18082/tcp --permanent
firewall-cmd --reload

5.2 云服务器安全组

在云厂商控制台添加安全组规则,放行 9876, 10911, 18080, 18082


6. 使用 Docker Compose 一键启动

建议将 Namesrv、Broker 和 Dashboard 写入 docker-compose.yml,一键部署:

yaml 复制代码
version: '3.8'
services:
  namesrv:
    image: apache/rocketmq:5.3.2
    container_name: rmqnamesrv
    ports:
      - "9876:9876"
    command: sh mqnamesrv
    networks:
      - rocketmq

  broker:
    image: apache/rocketmq:5.3.2
    container_name: rmqbroker
    ports:
      - "10909:10909"
      - "10911:10911"
      - "10912:10912"
      - "18082:8080"
      - "18083:8081"
    environment:
      NAMESRV_ADDR: "namesrv:9876"
      JAVA_OPT_EXT: "-Drocketmq.brokerIP1=172.16.0.3"
    command: sh mqbroker --enable-proxy
    depends_on:
      - namesrv
    networks:
      - rocketmq

  dashboard:
    image: apacherocketmq/rocketmq-dashboard:latest
    container_name: rocketmq-dashboard
    ports:
      - "18080:8080"
    environment:
      JAVA_OPTS: "-Drocketmq.namesrv.addr=namesrv:9876"
    depends_on:
      - namesrv
    networks:
      - rocketmq

networks:
  rocketmq:
    driver: bridge

启动:

bash 复制代码
docker compose up -d

7. 常见问题

7.1 connect to 127.0.0.1:10911 failed

  • 原因:Broker 注册到 Namesrv 的地址是 127.0.0.1。
  • 解决:配置 brokerIP1=宿主机IPJAVA_OPT_EXT=-Drocketmq.brokerIP1=宿主机IP

7.2 端口冲突

  • 错误:address already in use
  • 解决:用 ss -tulnp | grep <port> 查找占用进程,或换宿主机端口映射(如 18080:8080)。

7.3 Docker Compose 报错

  • 老版 docker-compose 1.x 与 Docker 28 不兼容,建议使用:

    bash 复制代码
    dnf install -y docker-compose-plugin
    docker compose up -d

8. 总结

通过 Docker 部署 RocketMQ 能简化运维,特别是使用 docker-compose 一键启动 Namesrv + Broker + Dashboard

记得 设置 brokerIP1 ,否则外部客户端会遇到 127.0.0.1 连接失败问题。

生产环境要注意开放端口和安全组配置。

相关推荐
AntBlack2 分钟前
Z-Image 发布了 ,赶紧体验了一把(配套 Modal执行脚本)
前端·后端·aigc
努力的小雨4 分钟前
AI 编程协作,我的一点邪修方法,希望可以帮助到你
后端
码事漫谈16 分钟前
C++网络编程:从Socket混乱到优雅Reactor的蜕变之路
后端
码事漫谈22 分钟前
C++ Lambda表达式:从“这是什么鬼”到“真香!”的完整心路历程
后端
k***121743 分钟前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
学历真的很重要1 小时前
LangChain V1.0 Short-term Memory 详细指南
后端·python·语言模型·面试·langchain·agent·ai编程
s***P9821 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
芝麻开门-新起点1 小时前
数据脱敏与自动化技术融合:大规模GIS数据安全高效处理方案
运维·自动化
行走正道1 小时前
【探索实战】跨云应用分发自动化实战:基于Kurator的统一交付体系深度解析
运维·自动化·wpf·kurator·跨云分发
杨云龙UP2 小时前
SQL Server 备份异地同步 + 清理脚本
运维·服务器·数据库·sql·mysql·sqlserver