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

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

相关推荐
huangyuchi.2 分钟前
【Linux】进程切换与优先级
linux·运维·笔记·进程切换·进程优先级·寄存器·linux调度算法
高松燈14 分钟前
开发中常见的String的判空场景总结
后端
程序员NEO27 分钟前
我只说需求,AI 全程托管,代码自己长出来了!
人工智能·后端
白露与泡影35 分钟前
Spring Boot 优雅实现多租户架构!
spring boot·后端·架构
编写美好前程1 小时前
springboot项目如何写出优雅的service?
java·spring boot·后端
chen1108____1 小时前
Nginx 实用知识大全:从模块作用到高并发承载
运维·nginx
Aurora_NeAr1 小时前
大数据之路:阿里巴巴大数据实践——实时技术与数据服务
大数据·后端
过客随尘1 小时前
Mysql RR事务隔离级别引发的生产Bug,你中招了吗?
后端·mysql
知其然亦知其所以然1 小时前
社招 MySQL 面试官问我:InnoDB 的 4 大特性?我靠这 4 个故事一战封神!
后端·mysql·面试
努力一点9481 小时前
linux系统底层逻辑 开机顺序 ubuntu22.04系统
linux·运维·服务器·ubuntu·ai·gpu算力