网上有很多第三方的写法,其实官方本来提供了一个项目,只是年代有点久远,不过(经过简单修改)还是可以用的,地址如下
https://github.com/apache/rocketmq-docker
1.构建镜像
以下指令均为root账号下执行,并且安装好docker环境
#下载
wget -O rocketmq-docker.zip https://github.com/apache/rocketmq-docker/archive/refs/heads/master.zip
#解压
unzip rocketmq-docker.zip
按照项目首页说明,先要进行 Image Build
后面两个参数是需要构建的MQ版本,使用的基础镜像(centos, alpine)
cd rocketmq-docker-master/image-build
sh build-image.sh 4.8.0 alpine
期间会下载镜像,也会下载主程序,有点慢,等吧。
漫长的等待....
看到类似信息就完成了
Successfully built d8d1c5e4f5e4
Successfully tagged apacherocketmq/rocketmq:4.8.0-alpine
以下指令可以验证以下
docker images | grep rocketmq
apacherocketmq/rocketmq 4.8.0-alpine d8d1c5e4f5e4 47 seconds ago 145MB
#只有一个镜像,namesvr和broker 是通过不同指令来启动的
2.构建Stage(部署方案?)
上面执行完之后,可以获取一个可用镜像,现在需要生成各种部署方案
##按项目首页说明是提供以下4中部署方案,这里选取第二种【集群模式,docker】部署
1. Single Node
2. Cluster with docker-compose
3. Cluster on Kubernetes
4. Cluster of Dledger storage
生成各种部署方案
sh stage.sh 4.8.0
以下为输出
Stage version = 4.8.0
mkdir /home/darin/rocketmq-docker-master/stages/4.8.0
staged templates into folder /home/darin/rocketmq-docker-master/stages/4.8.0
进入目录
cd stages/4.8.0/templates
ls
大概能看到以下内容
data kubernetes play-docker-compose.sh play-docker.sh play-kubernetes.sh ssl
docker-compose play-consumer.sh play-docker-dledger.sh play-docker-tls.sh play-producer.sh
上述的sh文件分别各个部署方案的启动文件
3.调整部署文件
在 docker-compose 目录内能看到 docker-compose.yml,分别定义了
- namesrv
- broker
- broker1
做如下调整
- 调整镜像版本号(原来的是错误,4.8.0 --> 4.8.0-alpine)
- 为方便查看,把broker 改名 broker-a, broker1 改名 broker-b
- 为区分数据,data目录给 namesrv 使用,broker-a 对应 data-a, broker-b 对应 data-b
- 修改相关配置文件(让broker识别主机ip,修改broker-b默认端口)
调整后如下
version: '2'
services:
#Service for nameserver
namesrv:
image: apacherocketmq/rocketmq:4.8.0-alpine
container_name: rmqnamesrv
ports:
- 9876:9876
volumes:
- ./data/namesrv/logs:/home/rocketmq/logs
command: sh mqnamesrv
#Service for broker
broker-a:
image: apacherocketmq/rocketmq:4.8.0-alpine
container_name: rmqbroker-a
links:
- namesrv
ports:
- 10909:10909
- 10911:10911
- 10912:10912
environment:
- NAMESRV_ADDR=namesrv:9876
volumes:
- ./data-a/broker/logs:/home/rocketmq/logs
- ./data-a/broker/store:/home/rocketmq/store
- ./data-a/broker/conf/broker.conf:/opt/rocketmq-4.8.0/conf/broker.conf
command: sh mqbroker -c /opt/rocketmq-4.8.0/conf/broker.conf
#Service for another broker -- broker1
broker-b:
image: apacherocketmq/rocketmq:4.8.0-alpine
container_name: rmqbroker-b
links:
- namesrv
ports:
- 10809:10809
- 10811:10811
- 10812:10812
environment:
- NAMESRV_ADDR=namesrv:9876
volumes:
- ./data-b/broker/logs:/home/rocketmq/logs
- ./data-b/broker/store:/home/rocketmq/store
- ./data-b/broker/conf/broker.conf:/opt/rocketmq-4.8.0/conf/broker.conf
command: sh mqbroker -c /opt/rocketmq-4.8.0/conf/broker.conf
修改stages/4.8.0/templates/docker-compose里的目录
mv data1 data-a
cp -r data-a data-b
相应地,play-docker-compose.sh里prepare_dir也需要做对应修改
dirs=("docker-compose/data/namesrv/logs" "docker-compose/data-a/broker/logs" "docker-compose/data-a/broker/store" "docker-compose/data-b/broker/logs" "docker-compose/data-b/broker/store")
修改配置文件,目的主要是
- 让broker识别出主机ip,用于上报到namesrv
- 修改broker-b的启动端口,避免上报时候信息出错
#data-a
#/data-a/broker/conf/broker.conf
#增加一行
brokerIP1 = 192.168.10.97
#/data-b/broker/conf/broker.conf
#修改broker name(因为是copy回来的 需要改名)
brokerName = broker-b
#增加
brokerIP1 = 192.168.10.97
#Broker 对外服务的监听端口
listenPort = 10811
#haService中使用
haListenPort=10812
#主要用于slave同步master
fastListenPort=10809
执行启动脚本
./play-docker-compose.sh
#看到类似输出则启动成功
Removing RocketMQ Container...
35fb42d81419
bae114ad9858
9584de98563e
Creating rmqnamesrv ... done
Creating rmqbroker-b ... done
Creating rmqbroker-a ... done
#验证
docker ps | grep rocket
0917c71a77c3 apacherocketmq/rocketmq:4.8.0-alpine "sh mqbroker -c /opt…" 3 minutes ago Up 3 minutes 9876/tcp, 0.0.0.0:10929->10909/tcp, 0.0.0.0:10931->10911/tcp, 0.0.0.0:10932->10912/tcp rmqbroker-b
494a1091445c apacherocketmq/rocketmq:4.8.0-alpine "sh mqbroker -c /opt…" 3 minutes ago Up 3 minutes 0.0.0.0:10909->10909/tcp, 9876/tcp, 0.0.0.0:10911-10912->10911-10912/tcp rmqbroker-a
d61cf9077851 apacherocketmq/rocketmq:4.8.0-alpine "sh mqnamesrv" 3 minutes ago Up 3 minutes 10909/tcp, 0.0.0.0:9876->9876/tcp, 10911-10912/tcp
#同时,现在也可以直接用docker-compose去操作了
docker-compose -f docker-compose.yml restart
安装rocketmq-console
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.10.97:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 18080:8080 -t -d styletang/rocketmq-console-ng
安装完成后可以访问 主机IP:18080,至此,部署结束
本部署方案为开发环境部署,线上环境请部署多个namesrv做集群,另外,文中多次出现192.168.10.97为主机IP,请按实际情况修改