爱折腾 | docker搭建RocketMq测试环境踩坑

前言
最近公司在搞ActiveMQ切换到rocketMq的事,虽然不是特别紧急的事,而且好像已经给出切换的文档了,但是本着自己动手丰衣足食的想法,我还是打算把之前发过的rocketMq的相关内容,再好好回顾下,毕竟知其然且知其所以然,才能更好地处理(装)问题(逼)。
不过今天的内容暂时还不涉及RocketMq的相关技术知识,只是一次简单的环境搭建,关于技术层面的知识,我们后面继续探讨。
RocketMQ部署
部署namesrv
namesrv就类似于消息队列的注册中心,因为rocketmq原生支持集群,所以namesrv就显得很重要。
拉取镜像
首先是拉取镜像,这里拉取的是rocketMQ的核心镜像
docker pull rocketmqinc/rocketmq
启动namesrv
启动过程也很简单,主要是docker的一些参数和配置指定
# 后台运行,并映射端口
docker run -d -p 9876:9876 \
# 设置容器名称
--name rmqnamesrv \
# 设置重启策略
--restart=always \
# 映射日志文件夹(前面的为本地路径)
-v /home/syske/docker/mq/data/namesrv/logs:/root/logs \
# 映射书籍存在文件夹(同上)
-v /home/syske/docker/mq/namesrv/store:/root/store \
# 指定环境变量
-e "MAX_POSSIBLE_HEAP=100000000" \
# 指定镜像版本,这里建议指定具体版本,否则在和java交互的时候会报错,目前最新版本是4.4.0,所以maven的依赖也必须对应,否则会报错
rocketmqinc/rocketmq:latest \
# 启动命令
sh mqnamesrv
部署broker
由于broker和namesrv是同一个镜像,所以这里不需要再拉取镜像
创建broker配置
除了最后两行配置,其他的配置都是系统默认的,具体说明可以参考官方文档
# broker集群名称
brokerClusterNam = DefaultCluster
# broker节点名称
brokerName = broker-a
# broker节点id
brokerId = 0
# 删除条件?这个还不清楚用途,后续研究下
deleteWhen = 04
# 文件保留时间(单位小时),默认为3天
fileReservedTime = 48
# broker角色
brokerRole = ASYNC_MASTER
# 磁盘同步方式:同步,异步
flushDiskType = ASYNC_FLUSH
# 类似注册中心
namesrvAddr=192.168.0.103:9876
# 当前broker监听的IP(主)
brokerIP1 = 192.168.0.103
启动broker
这里的启动命令最核心的其实就是最后sh操作,这里制定了配置文件的路径。
 # 后台运行
 docker run -d \
 # 映射端口
-p 10911:10911 \
# 映射端口
-p 10909:10909 \
# 容器名称
--name rmqbroker \
# 重启策略
--restart=always \
# 映射日志路径
-v /home/syske/docker/mq/data/broker/logs:/root/logs \
# 映射文件存储路径
-v /home/syske/docker/mq/data/broker/store:/root/store \
# 映射配置文件
-v /home/syske/docker/mq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
# 链接namesrv
--link rmqnamesrv:namesrv \
# 指定环境设置
-e "NAMESRV_ADDR=namesrv:9876" \
# 指定环境设置,指定镜像
-e "MAX_POSSIBLE_HEAP=200000000" rocketmqinc/rocketmq:latest \
# 启动命令(指定配置启动)
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
由于这里我们把rocketmq的日志映射到了本机目录,所以我们可以直接通过tail查看broker的启动日志,比如broker.log:

当然,你也可以通过docker exec命令的方式查看日志,当然就是没有上面这种方式方便。
安装console
console是rocketmq的扩展组件,console组件提供了图形化的界面,便于我们管理和监控rocketmq,界面截图如下:


官方文档:
https://rocketmq-1.gitbook.io/rocketmq-connector/rocketmq-connect/rocketmq-console/an-zhuang-shi-yong
拉取镜像
默认拉取最新版本镜像:
docker pull styletang/rocketmq-console-ng
启动
启动命令也很简单,只是指定rocketmq的namesrv的地址,除了端口有修改,其他直接复制官方文档
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.0.103:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8000:8080 -t styletang/rocketmq-console-ng
启动成功后直接访问我们配置的端口,即可看到如上截图。
踩坑记录
由于是时候回顾总结,所以过程中的好多错误问题我已经复现不出来了,下面是印象比较深刻的几个问题,各位小伙伴可以参考下,少走一些弯路。
映射路径配置错误,导致容器无限重启。表现就是执行
docker ps的时候,mqbroker服务状态一直是Restarting:
最后几经检查,发现是映射的本地文件夹不存在导致的。本地的路径是
/home/syske/docker/mq/data/broker,但是启动命令里面映射的路径少了docker目录,所以导致日志和配置文件路径都错误了,所以报错了版本问题导致配置文件读取不到:也就是在启动
boker服务的时候,broker.conf的路径配置不正确,导致启动直接报错:
进入容器中查看了
rocketmq的版本才知道这里的路径需要配置成rocketmq-4.4.0,所以各位小伙伴在拉取镜像的时候一定要指定版本,这样在设置配置的时候也就不会出错了。如果你在客户端调用
rocketmq时有如下错误:
你需要在
broker的配置文件中指定brokerIP1的相关配置,因为172.17.0.5是docker的内网ip,我们需要在外部调用broker,所以需要配置一个外部ip(docker主机的局域网ip)

- 如果客户端调用
rocketmq报错的话,那大概率是因为broker服务没有正常启动导致的(我就是因为第一个坑导致的)
 
结语
好了关于docker安装配置rocketMq的相关内容,我们就先到这里,下面我们聊点本次折腾的背景:
原本是打算在manjaro环境搞下rocketMQ的测试环境就可以了,但是在实际操作的时候,发现manjaro还没有配置过JDK环境,而且在我一通安装设置之后,rocketMq启动还是报错,具体报什么错我也记不清楚了,总之就是很恶心,最后我就放弃了这种原生的方式。
之后我又想到了可以在k8s环境搞一套,但是不幸的是,我发现manjaro的k8s集群也坏了,就是执行kubectl命令时候一直提示拒绝连接:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
好吧,太浪费时间了,于是我觉定重新装个系统(一言不合就折腾),一顿操作之后,我安装了特别熟悉的linux系统——ubuntu,不过网络还算给力,20m/s的速度,系统很快就下载好了。之后经过两个小时的折腾,docker、jdk、git、oh-my-zsh都被我搞定了,然后今天又花了两三个小时折腾rocketmq的docker环境。
总体来说,我还是很喜欢这种排查并处理问题的感觉的,特别是解决完所有问题之后的酣畅感,这给了我极大的成就感,这也是我热爱折腾的原因吧!
- END -