前言
现在网络上大部分的技术文章就是纯粹的复制粘贴,自己具体有没有去实际操作过都是要打上问号的。
众所周知,RocketMQ是name-server和broker一起协同工作的。
那么在docker下的部署,就要考虑到容器间的网络互联问题。
现在网络上清一色使用的是过时的--link来连接name-server和broker。
找一个日期靠前的部署教程,甚至都无法正常启动容器,所以才有了这篇文章。
文章说明
本教程完全由我反复部署,试验了3种不同环境,公司,家里,朋友电脑。全部能正常部署成功,期间出现的一些问题点也会给出解决方案。
1.镜像版本选择
从docker hub上查看到RocketMQ镜像最新版本为4.4.0。
那么就选择4.4.0了。
2.为容器网络互联创建RocketMQ的docker网络
# 后续的name-server,broker,rocketmq-console都会使用该网络
docker network create rocketmq
# 创建好网络可以使用docker inspect命令查看网络信息
docker inspect rocketmq
3.部署name-server
# 无须先pull镜像,docker run之前会自动下载镜像
docker run -d --name rmqnamesrv -p 9876:9876 \
--privileged=true \
--network rocketmq \
-v /docker/rocketmq/namesrv/logs:/root/logs \
-v /docker/rocketmq/namesrv/store:/root/store \
-e "MAX_POSSIBLE_HEAP=100000000" \
rocketmqinc/rocketmq:4.4.0 sh mqnamesrv autoCreateTopicEnable=true
参数说明:
- --name rmqnamesrv:指定容器名称为rmqnamesrv,注意这个名字,后续会使用。
- --network rocketmq:为容器指定网络为rocketmq,同一网络下的容器能够通过容器名称互通。
- --privileged=true:如果使用-v映射了目录,则使用该参数获取文件访问权限
查看启动成功后的日志:
docker logs -f rmqnamesrv
4.部署broker
首先在宿主机创建broker的配置文件目录
sudo mkdir -p /docker/rocketmq/broker/conf
创建broker的配置文件broker.conf
vi /docker/rocketmq/broker/conf/broker.conf
broker.conf内容如下(记得修改brokerIP1的值为宿主机的ip地址)
brokerClusterName = DefaultCluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
brokerIP1=192.168.81.120
部署broker
# 无须先pull镜像,docker run之前会自动下载镜像
docker run -d --name rmqbroker -p 10911:10911 -p 10909:10909 \
--privileged=true \
--network rocketmq \
-v /docker/rocketmq/broker/logs:/root/logs \
-v /docker/rocketmq/broker/store:/root/store \
-v /docker/rocketmq/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
-e "NAMESRV_ADDR=rmqnamesrv:9876" -e "MAX_POSSIBLE_HEAP=200000000" \
rocketmqinc/rocketmq:4.4.0 sh mqbroker autoCreateTopicEnable=true -c /opt/rocketmq-4.4.0/conf/broker.conf
参数说明:
- --network rocketmq:为容器指定网络为rocketmq,同一网络下的容器能够通过容器名称互通。
- -e "NAMESRV_ADDR=rmqnamesrv:9876":此处的rmqnamesrv就是容器name-server的名称
查看启动日志:
docker logs -f rmqbroker
从日志可以看出,已经获取到配置文件中broker的ip地址。
name-server的地址则是由name-server容器名称:端口号组成。
下面来验证一下容器内部是否能够通过容器名称进行网络互联。
验证思路为从一个容器内部ping另一个容器,看是否能够ping通。
# 进入broker容器
docker exec -it rmqbroker /bin/bash
# ping name-server的容器名称
ping rmqnamesrv
能够ping通,说明网络是互通的,现在rocketmq就已经部署完毕了。
如果无法ping通容器,那么说明启动命令有问题,重新检查自己启动的命令。
如果无法ping通宿主机的ip,请重新按下述文章步骤安装docker。
CentOS下的docker部署 - Torture
为了后续方便,这里再部署一个RocketMQ的控制台。
5.部署console
console的部署就不说那么多了,直接上命令。
# 同样在启动的时候指定同一个network
# 注意修改rocketmq.namesrv.addr后面的地址为容器名称:端口号
docker run -d --name rmqconsole -p 8080:8080 --network rocketmq \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876" styletang/rocketmq-console-ng
访问控制台: