RocketMQ 在 5.x 版本中不仅提供了强大的消息功能,还引入了 Proxy、HTTP 接口等新特性。我一开始使用的是 二进制启动 (mqnamesrv
、mqbroker
),但后来发现 Docker 部署更易管理、更易升级。本文将完整介绍如何将 RocketMQ 从二进制迁移到 Docker,并解决常见问题。
1. 清理二进制版本
如果你之前用二进制启动过 mqnamesrv
和 mqbroker
,先停掉这些进程,避免端口冲突。
1.1 停止进程
使用 jps
或 ps -ef
找到 NamesrvStartup
和 BrokerStartup
进程:
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=宿主机IP
或JAVA_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 不兼容,建议使用:bashdnf install -y docker-compose-plugin docker compose up -d
8. 总结
通过 Docker 部署 RocketMQ 能简化运维,特别是使用 docker-compose 一键启动 Namesrv + Broker + Dashboard
。
记得 设置 brokerIP1 ,否则外部客户端会遇到 127.0.0.1
连接失败问题。
生产环境要注意开放端口和安全组配置。