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 连接失败问题。

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

相关推荐
木易双人青18 分钟前
01-Docker-简介、安装与使用
运维·docker·容器
专注API从业者1 小时前
Python + 淘宝 API 开发:自动化采集商品数据的完整流程
大数据·运维·前端·数据挖掘·自动化
bobz9652 小时前
小语言模型是真正的未来
后端
Lovyk3 小时前
Linux 正则表达式
linux·运维
DevYK3 小时前
企业级 Agent 开发实战(一) LangGraph 快速入门
后端·llm·agent
一只叫煤球的猫3 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
冒泡的肥皂3 小时前
MVCC初学demo(一
数据库·后端·mysql
颜如玉4 小时前
ElasticSearch关键参数备忘
后端·elasticsearch·搜索引擎
ac.char4 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
卡拉叽里呱啦5 小时前
缓存-变更事件捕捉、更新策略、本地缓存和热key问题
分布式·后端·缓存