参考
docker安装rocketMQ5.3.3详细步骤_rocketmq docker 安装-CSDN博客
RocketMQ的Docker镜像部署(以及Dashboard的部署、ACL配置)_docker rocketmq dashboard-CSDN博客
环境准备
系统要求
- CentOS7系统
- Docker已安装并启动
- 至少2GB内存
- 至少5GB磁盘空间
检查Docker状态
# 检查Docker是否正常运行
docker version
# 如果Docker未启动,执行以下命令
sudo systemctl start docker
sudo systemctl enable docker
创建Docker网络
为了让RocketMQ各个组件能够相互通信,我们需要创建一个自定义网络:
# 创建名为rocketmq的网络
docker network create rocketmq
安装NameServer
NameServer是RocketMQ的注册中心,负责管理Broker的路由信息。
创建namesrv在宿主机的日志映射目录
sudo mkdir -p /home/rocketmq/namesrv/logs
sudo chmod -R 777 /home/rocketmq
为什么要设置777权限? Docker容器内的进程可能使用不同的用户ID,设置777权限确保容器能够正常读写这些目录。
启动NameServer容器
docker run -d \
--name rmqnamesrv \
--network rocketmq \
--restart=always \
-p 9876:9876 \
-v /home/rocketmq/namesrv/logs:/home/rocketmq/logs/ \
-e "MAX_POSSIBLE_HEAP=100000000" \
apache/rocketmq:5.2.0 \
sh mqnamesrv
参数说明
- --name rmqnamesrv:容器名称
- --network rocketmq:使用我们创建的网络
- --restart=always 开机启动,失败也会一直启动
- -p 9876:9876:端口映射,9876是NameServer默认端口
- -v /home/rocketmq/namesrv/logs:/home/rocketmq/logs/:数据卷挂载
- -e "MAX_POSSIBLE_HEAP=100000000":设置JVM堆内存大小
- apache/rocketmq:5.2.0:使用的镜像版本
- sh mqnamesrv:启动NameServer的命令
验证NameServer启动
# 查看容器状态、查看容器日志
docker ps | grep rmqnamesrv
docker logs rmqnamesrv
如果看到类似"The Name Server boot success"的日志,说明启动成功。
安装Broker
Broker是RocketMQ的核心组件,负责消息的存储和转发。
在宿主机上创建broker配置文件、数据存储路径、日志目录
mkdir -p /home/rocketmq/broker/conf &&
mkdir -p /home/rocketmq/broker/store &&
mkdir -p /home/rocketmq/broker/logs &&
chmod 777 /home/rocketmq/broker/conf &&
chmod 777 /home/rocketmq/broker/store &&
chmod 777 /home/rocketmq/broker/logs
拷贝NameServer容器的中的配置文件到Broker
docker cp rmqnamesrv:/home/rocketmq/rocketmq-5.2.0/conf /home/rocketmq/broker
修改Broker配置
sudo vi /home/rocketmq/broker/conf/broker.conf
# 所属集群名称
brokerClusterName = DefaultCluster
# broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
# 0表示Master,大于0表示不同的slave
brokerId = 0
# 表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
# 在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
# 有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制
brokerRole = ASYNC_MASTER
# 刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要
flushDiskType = ASYNC_FLUSH
# 是否允许自动创建topic
autoCreateTopicEnable=true
# 是否允许 Broker 自动创建 订阅组
# autoCreateSubscriptionGroup = true
# 设置broker节点所在服务器的ip地址
brokerIP1 = 192.168.10.100
namesrvAddr=rmqnamesrv:9876
重要提醒:
- 请将
brokerIP1=你的服务器IP地址
中的"你的服务器IP地址"替换为你实际的服务器IP地址! 可以通过ip addr show
或ifconfig
命令查看。- fileReservedTime = 48 这里可以自行改一下配置,可以设置更长一点;
启动Broker容器
docker run -d \
--name rmqbroker \
--network rocketmq \
--restart=always \
-p 10909:10909 \
-p 10911:10911 \
-p 10912:10912 \
-v /home/rocketmq/broker/conf:/home/rocketmq/rocketmq-5.2.0/conf \
-v /home/rocketmq/broker/store:/home/rocketmq/store \
-v /home/rocketmq/broker/logs:/home/rocketmq/logs \
-e "MAX_POSSIBLE_HEAP=200000000" \
apache/rocketmq:5.2.0 \
sh mqbroker -c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
参数说明
-c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf 指定启动时用的配置文件
-p 10909 端口:是 Broker 的 VIP 监听端口。当普通端口的请求非常繁忙时,Broker 端的所有 I/O 线程可能都在执行请求,导致后续网络请求进入队列,使消息请求执行缓慢。这种情况下,生产者发送消息、消费者获取元数据信息等请求可以使用 VIP 端口,以降低消息发送的延时。
-p10911 端口:是 Broker 的监听端口,主要用于执行 Topic 的重平衡等操作,同时也承载着普通的消息网络请求,例如处理生产者发送的消息、消费者的拉取消息请求等。
-p10912 端口:是 Broker 的 HA(High Availability,高可用)端口,用于主从节点之间的数据同步,以保证在主节点出现故障时,从节点能够尽快接管工作,确保消息服务的高可用性。
-e “MAX_POSSIBLE_HEAP=200000000” rocketmqinc/rocketmq sh mqbroker : 指定broker服务的最大堆内存
如果需要也可以控制容器内存大小:
–memory=4g \ # 限制容器内存使用
–cpus=2.0 \ # 限制容器CPU使用
–memory=2g \ # 容器总内存限制
-e “MAX_POSSIBLE_HEAP=1073741824” \ # 直接内存1GB
-e “JAVA_OPTS=-Xmx1g” \ # 堆内存1GB
验证Broker启动
# 查看容器状态
docker ps | grep rmqbroker
# 查看容器日志
docker logs rmqbroker
如果看到"The broker boot success"的日志,说明启动成功。
安装Dashboard
Dashboard是一个Web管理界面,方便我们管理和监控RocketMQ。
创建目录和修改权限
mkdir -p /home/rocketmq/console/data &&
chmod 777 /home/rocketmq/console/data
配置用户名和密码
vim /home/rocketmq/console/data/users.properties
# This file supports hot change, any change will be auto-reloaded without Console restarting.
# Format: a user per line, username=password[,N] #N is optional, 0 (Normal User); 1 (Admin)
# Define Admin
# === 规则「用户名=密码,权限」。权限为1表示管理员,为0表示普通用户 ===
admin=admin123,1
# Define Users
# === 屏蔽下边两个账户 ==
#user1=user1
#user2=user2
启动 Dashboard
docker run -d --name rmqconsole \
--network rocketmq \
--restart=always \
-p 8080:8080 \
-v /home/rocketmq/console/data:/tmp/rocketmq-console/data \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=true" \
apacherocketmq/rocketmq-dashboard:latest
# 当-Drocketmq.config.loginRequired为false时,则Dashboard不需要登录用户和密码
# 这里的 rocketmq-namesrv 是NameServer的地址
- 直接访问
http://<Dashboard的IP>:8080
,输入前面配置的用户、密码 - 现在已经可以正常使用了
开启 ACL
修改所有Broker节点
编辑Broker配置文件,并加上配置
vim /home/rocketmq/broker/conf/broker.conf
# 开启鉴权
aclEnable = true
编辑ACL配置文件,并加上配置,这里一定要与上面的配置对齐,否则启动Broker会报错
vim /home/rocketmq/broker/conf/plain_acl.yml
# 添加一个给Dashboard使用的用户
- accessKey: console
secretKey: 12345678
whiteRemoteAddress:
admin: true
重启Broker节点
docker restart rmqbroker
修改 Dashboard 启动命令
- 移除已部署的Dashboard
docker rm -f rmqconsole
- 在启动命令中添加accessKey、secretKey
docker run -d --name rmqconsole \
--network rocketmq \
--restart=always \
-p 8080:8080 \
-v /home/rocketmq/console/data:/tmp/rocketmq-console/data \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=true -Drocketmq.config.accessKey=console -Drocketmq.config.secretKey=12345678" \
apacherocketmq/rocketmq-dashboard:latest
如果不填写accessKey,则会报错
验证安装
检查所有容器状态
docker ps
你应该看到三个正在运行的容器:
- rmqnamesrv(NameServer)
- rmqbroker(Broker)
- rmqconsole(管理控制台)
测试消息发送和接收
进入Broker容器测试
# 进入Broker容器
docker exec -it rmqbroker bash
# 发送测试消息
sh mqadmin sendMessage -n rmqnamesrv:9876 -t TestTopic -p "Hello RocketMQ"
# 接收测试消息
sh mqadmin consumeMessage -n rmqnamesrv:9876 -t TestTopic
如果能成功发送和接收消息,说明安装完全成功!
常用操作命令
容器管理
# 查看所有RocketMQ相关容器
docker ps | grep rmq
# 停止所有容器
docker stop rmqnamesrv rmqbroker rmqconsole
# 启动所有容器
docker start rmqnamesrv rmqbroker rmqconsole
# 重启所有容器
docker restart rmqnamesrv rmqbroker rmqconsole
# 删除所有容器(谨慎使用!)
docker rm -f rmqnamesrv rmqbroker rmqconsole
查看日志
# 查看NameServer日志
docker logs -f rmqnamesrv
# 查看Broker日志
docker logs -f rmqbroker
# 查看控制台日志
docker logs -f rmqconsole
进入容器
# 进入NameServer容器
docker exec -it rmqnamesrv bash
# 进入Broker容器
docker exec -it rmqbroker bash
故障排除
1. 容器启动失败
现象: 容器无法启动或频繁重启
解决方案:
# 检查容器日志
docker logs 容器名
# 检查目录权限
ls -la /home/rocketmq/
# 重新设置权限
sudo chmod -R 777 /home/rocketmq/
2. 无法访问管理控制台
现象: 浏览器无法打开http://IP:8080
解决方案:
# 检查防火墙状态
firewall-cmd --state
查看开启的端口
#临时开放的端口(默认为空)
firewall-cmd --list-ports
#永久开放的端口(默认为空)
firewall-cmd --list-ports --permanent
# 永久开放8080端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
# 或者临时关闭防火墙(不推荐生产环境)
systemctl stop firewalld
3. 消息发送失败
现象: 客户端连接超时或发送消息失败
解决方案:
- 检查broker.conf中的brokerIP1配置是否正确
- 确保所有必要端口都已开放:
sudo firewall-cmd --permanent --add-port=9876/tcp
sudo firewall-cmd --permanent --add-port=10909/tcp
sudo firewall-cmd --permanent --add-port=10911/tcp
sudo firewall-cmd --permanent --add-port=10912/tcp
sudo firewall-cmd --reload
4. 内存不足
现象: 容器频繁重启,日志显示内存不足
解决方案: 调整JVM堆内存大小:
# 重新启动容器时调整内存参数
docker run ... -e "MAX_POSSIBLE_HEAP=512000000" ...
5. 数据持久化问题
现象: 容器重启后数据丢失
解决方案: 确保数据卷正确挂载:
# 检查挂载点
docker inspect rmqbroker | grep Mounts -A 200
总结
恭喜你!现在你已经成功在CentOS7上使用Docker安装了完整的RocketMQ环境,包括:
- NameServer:注册中心,端口9876
- Broker:消息代理,端口10909/10911/10912
- 管理控制台:Web界面,端口8080
关键要点回顾
- 网络配置:使用自定义Docker网络确保组件间通信
- 目录权限:设置正确的目录权限确保数据持久化
- IP配置:Broker配置文件中的brokerIP1必须设置为真实IP
- 端口开放:确保防火墙开放所有必要端口
- 内存配置:根据服务器配置调整JVM堆内存大小