Docker下部署RocketMQ5.3.3
环境介绍:
- 服务器系统:CentOS7;
- Docker版本:26.1.4
- RocketMQ版本:5.3.3
- RocketMQ-DashBoard:2.1.0
- 主机IP: 192.168.163.130
一、获取镜像
镜像获取有两种方式,在线拉取或者导入现成的镜像包,你根据自己需求选一个即可。
方式一:在线拉取
首先配置国内镜像源,不然拉取进度慢到你怀疑人生。开始吧!(记得在root权限下操作哈~)
1) 创建目录(先在对应路径下看看有没有docker文件夹,有的话就不用新建了)
mkdir -p /etc/docker
2) 在上述目录下新建一个文件daemon.json,内容如下(网上找的)
{"registry-mirrors": ["https://docker.m.daocloud.io","https://1ms.run","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://iju9kaj2.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://docker.hpcloud.cloud","https://cr.console.aliyun.com" ,"https://hub.docker.com","https://docker.unsee.tech","https://docker.1panel.live","https://mirrors.ustc.edu.cn","https://docker.chenby.cn","https://mirrors.azure.cn"]
}
3) 加载一下上述文件,并重启docker
# 加载文件systemctl daemon-reload# 重启docker systemctl restart docker
4) 拉取 rocketmq 和 dashboard 官方镜像
# 拉取rocketmq镜像docker pull apache/rocketmq # 拉取dashboard镜像docker pull apacherocketmq/rocketmq-dashboard:2.1.0
PS:尝试过dashboard最新版和2.0.1都没成功,可能就这个版本适配吧。
方式二:加载已有的镜像源
这种方式适合已经有镜像源文件的小伙伴。比如服务器A上已经有镜像源了,可以先把这个镜像源导出为tar文件,再导入到你的服务器上即可(省去了拉取的时间)。
1) 导出镜像
导出指令如下,你可以一个一个导出,也可以批量导出,就像把多个文件打包成一个压缩包的原理一样。
- 导出单个镜像image1 、image2到对应的tar文件
docker save -o image1.tar image1docker save -o image2.tar image2
- 导出镜像image1 、image2 到一个tar文件
docker save image1 image2 -o images.tar
例如:将服务器A上的镜像先导出到指定位置,比如我的一台windows机器上已有镜像源,我先把它导出到E盘下,命名为rocketmq_images。
docker save -o e:\rocketmq_images.tar apache/rocketmq:latest apacherocketmq/rocketmq-dashboard:2.1.0
2) 导入镜像
docker load -i 镜像包名.tar
例如:用ssh工具将机器A上的包导入到机器B的/home/Downloads/目录下,再使用如下指令加载镜像。
docker load -i /home/Downloads/rocketmq_images.tar
二、创建挂载目录
下面的目录是我的主机目录,结构如下:
|----opt|---rocketmq|---data|---namesrv|---logs|---store|---broker|---logs|---store|---conf /*配置文件broker.conf在这个文件夹放着*/
1. 创建nameserver挂载目录指令
mkdir -p /opt/rocketmq/data/namesrv/logs /opt/rocketmq/data/namesrv/store
2. 创建broker挂载目录指令
mkdir -p /opt/rocketmq/data/broker/logs /opt/rocketmq/data/broker/store
3. 创建broker配置文件目录指令
mkdir -p /opt/rocketmq/data/conf
目录层级如下:
注意:这里一定要设置相关文件夹的访问权限,否则会在访问控制台网页时报如下错误
# 查看文件夹权限ls -lr /opt/rocketmq/# 设置namesrv文件夹读写权限chmod 777 -R /opt/rocketmq/
最终查看文件夹时显示下面的权限即可。
三、创建broker配置文件
在上述的broker配置文件目录 /opt/rocketmq/data/conf下创建文件broker.conf,内容如下,编辑并保存。
# NameServer地址
namesrvAddr=rmqnamesrv:9876
# 所属集群名称,如果节点较多可以配置多个
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
# 设置broker节点所在服务器的ip地址,也就是centosOS7的服务ip
brokerIP1 = 192.168.163.130
# 磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full
diskMaxUsedSpaceRatio=95
四、启动服务
创建一个网络,就可以用容器名代替IP地址了。(也可省略)
docker network create rocketmq
1. 启动nameserver
docker run -d --restart=always --name rmqnamesrv -p 9876:9876 --network rocketmq -v /opt/rocketmq/data/namesrv/logs:/home/rocketmq/logs/rocketmqlogs -v /opt/rocketmq/data/namesrv/store:/home/rocketmq/logs/store -e "MAX_POSSIBLE_HEAP=100000000" apache/rocketmq sh mqnamesrv
2. 启动broker
docker run -d --restart=always --name rmqbroker -p 10911:10911 -p 10909:10909 --network rocketmq -v /opt/rocketmq/data/broker/logs:/home/rocketmq/logs -v /opt/rocketmq/data/broker/store:/home/rocketmq/logs/store -v /opt/rocketmq/data/conf/broker.conf:/home/rocketmq/rocketmq-5.3.3/conf/broker.conf -e "NAMESRV_ADDR=namesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" apache/rocketmq sh mqbroker -c /home/rocketmq/rocketmq-5.3.3/conf/broker.conf
3. 启动dashboard
docker run -d --restart=always --name rmqconsole --network rocketmq -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 9877:8082 apacherocketmq/rocketmq-dashboard:2.1.0
此时在docker中查看一下,各个容器已经正常运行了
如果容器没运行起来,可以查看日志,找找原因,例如,下面是正常跑起来的容器日志,查看方式都一样。
还要注意,一定要开放相应的端口,否则也可能导致部署失败
# 查看当前已经开放的端口firewall-cmd --list-ports# 设置开放指定端口(以80/tcp为例)firewall-cmd --zone=public --add-port=80/tcp --permanent# 重新加载配置firewall-cmd --reload
五、访问可视化控制台
我映射的端口是9877,在另一台局域网主机上访问:http://192.168.163.130:9877/
大功告成!部署rocketmq花费了我两天时间,各种踩坑,尝试各种解决办法最终部署成功,现在总结出来,并记录下来,同时也给还在辛苦尝试的小伙伴们一些建议和思路,感谢浏览!