前言
RocketMQ 是一款广为熟知的分布式消息队列中间件产品。关于 RocketMQ 的介绍、安装部署以及应用的文章也很多,本文则是在服务 Docker 容器化方式下对 RocketMQ 部署过程的记录,主要包括自制 RocketMQ 镜像、各个容器服务的配置,以及基于 Docker Compose 的服务编排。
RocketMQ镜像
直接使用官方镜像
官方镜像apacherocketmq/rocketmq:latest版本对应4.6.0
docker pull apacherocketmq/rocketmq
自制镜像
官方提供的 Docker 镜像只维护到4.6.0版本
因此当要在 Docker 中使用更高版本的 RocketMQ 时建议自制镜像
RocketMQ版本见:archive.apache.org/dist/rocket…
1.克隆官方rocketmq-docker项目
GitHub 项目地址:github.com/apache/rock…
2.构建镜像
打开项目,在image-build目录下使用build-image.sh脚本构建镜像
命令:sh build-image.sh RMQ-VERSION BASE-IMAGE
RMQ-VERSION,指定 RocketMQ 版本
BASE-IMAGE,指定构建的基础镜像,可选用centos,alpine
# cd image-build
# sh build-image.sh RMQ-VERSION BASE-IMAGE
cd image-build
sh build-image.sh 4.8.0 alpine
根据BASE-IMAGE的选择,
centos会使用Dockerfile-centos构建镜像
alpine会使用Dockerfile-alpine构建镜像
Dockerfile-alpine中会下载安装包,可替换镜像源加速
RUN echo -e https://mirrors.aliyun.com/alpine/v3.9/main/ > /etc/apk/repositories
RUN echo -e https://mirrors.aliyun.com/alpine/v3.9/community/ >> /etc/apk/repositories
RUN apk add --no-cache bash gettext nmap-ncat openssl busybox-extras
查看镜像
执行命令:docker images | grep rocketmq
# docker images | grep rocketmq
REPOSITORY TAG IMAGE ID CREATED SIZE
apacherocketmq/rocketmq 4.8.0-alpine 405f8fdf3650 25 hours ago 145MB
RocketMQ Dashboard镜像
自制镜像
1.克隆官方rocketmq-dashboard项目
GitHub 项目地址:github.com/apache/rock…
2.修改构建镜像的Dockerfile文件
把其中的FROM java:8改为其他可用的镜像
这里更改为openjdk:8-alpine,可以减少镜像体积
FROM openjdk:8-alpine
VOLUME /tmp
ADD rocketmq-dashboard-*.jar rocketmq-dashboard.jar
RUN sh -c 'touch /rocketmq-dashboard.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -jar /rocketmq-dashboard.jar" ]
3.修改yml配置文件
把其中rocketmq.config.namesrvAddrs内容置空
修改rocketmq.config.loginRequired值为true
指定rocketmq.config.dataPath的值为/home/rocketmq-console/data
rocketmq:
config:
# if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, default localhost:9876
# configure multiple namesrv addresses to manage multiple different clusters
namesrvAddrs:
# must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
loginRequired: true
# rocketmq-console's data path:dashboard/monitor
dataPath: /home/rocketmq-console/data
4.通过docker-maven-plugin插件构建镜像
mvn clean package -Dmaven.test.skip=true docker:build -DdockerImageTags=latest
查看镜像
执行命令:docker images | grep rocketmq-dashboard
# docker images | grep rocketmq-dashboard
REPOSITORY TAG IMAGE ID CREATED SIZE
apacherocketmq/rocketmq-dashboard latest 1074968cc2de About an hour ago 238MB
编排RocketMQ服务
准备镜像
apacherocketmq/rocketmq:4.8.0-alpine,用于运行broker和namesrv容器服务
apacherocketmq/rocketmq-dashboard:latest,用于运行dashboard容器服务
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apacherocketmq/rocketmq-dashboard latest 1074968cc2de About an hour ago 238MB
apacherocketmq/rocketmq 4.8.0-alpine 405f8fdf3650 25 hours ago 145MB
宿主机目录结构
~/data/rocketmq
├─ broker
│ ├─ conf
│ │ └─ broker.conf
│ ├─ logs
│ └─ store
├─ dashboard
│ └─ data
│ ├─ role-permission.yml
│ └─ users.properties
├─ docker-compose.yml
└─ namesrv
└─ logs
配置broker.conf
创建或配置文件:~/data/rocketmq/broker/conf/broker.conf
broker.conf将挂载到broker服务容器内用于配置
配置brokerIP1,当应用服务以及 RocketMQ 相关服务都在一个内网网段时,可用宿主机内网IP地址,否则使用宿主机外网IP地址
brokerClusterName = DefaultCluster
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1 = 192.168.199.103
配置users.properties
创建或配置文件:~/data/rocketmq/dashboard/data/users.properties
users.properties将挂载到dashboard服务容器内用于访问配置
#username=password[,N] #N是可选项,可以为0 (普通用户);1(管理员)
admin=admin,1
配置role-permission.yml
创建或配置文件:~/data/rocketmq/dashboard/data/role-permission.yml
role-permission.yml将挂载到dashboard服务容器内用于访问配置
rolePerms:
ordinary:
- /rocketmq/*.query
- /ops/*.query
- /dashboard/*.query
- /topic/*.query
- /topic/sendTopicMessage.do
- /producer/*.query
- /message/*.query
- /messageTrace/*.query
- /monitor/*.query
- /consumer/*.query
- /cluster/*.query
- /dlqMessage/*.query
- /dlqMessage/exportDlqMessage.do
- /dlqMessage/batchResendDlqMessage.do
编写docker-compose.yml
创建 Compose 文件:~/data/rocketmq/docker-compose.yml
编排中定义三个容器服务:namesrv、broker,以及dashboard
namesrv中指定容器名为rmqnamesrv,映射端口为9876:9876
当broker和dashboard要连接 NameServer 时,可指定地址为rmqnamesrv:9876
version: '3'
services:
#Service for nameserver
namesrv:
image: apacherocketmq/rocketmq:4.8.0-alpine
container_name: rmqnamesrv
ports:
- 9876:9876
volumes:
- ./namesrv/logs:/home/rocketmq/logs
command: sh mqnamesrv
#Service for broker
broker:
image: apacherocketmq/rocketmq:4.8.0-alpine
container_name: rmqbroker
ports:
- 10909:10909
- 10911:10911
- 10912:10912
depends_on:
- namesrv
environment:
NAMESRV_ADDR: rmqnamesrv:9876
JAVA_OPT_EXT: -server -Xms256m -Xmx256m -Xmn128m
volumes:
- ./broker/logs:/home/rocketmq/logs
- ./broker/store:/home/rocketmq/store
- ./broker/conf/broker.conf:/opt/rocketmq-4.8.0/conf/broker.conf
command: sh mqbroker -n rmqnamesrv:9876 -c /opt/rocketmq-4.8.0/conf/broker.conf
#Service for dashboard
dashboard:
image: apacherocketmq/rocketmq-dashboard:latest
container_name: rmqdashboard
ports:
- 18080:8080
depends_on:
- namesrv
environment:
JAVA_OPTS: -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
volumes:
- ./dashboard/data/users.properties:/home/rocketmq-console/data/users.properties
- ./dashboard/data/role-permission.yml:/home/rocketmq-console/data/role-permission.yml
启动服务
# cd ~/data/rocketmq
docker-compose up -d
访问RocketMQ Dashboard
浏览器访问:localhost:18080
参考
[1] rocketmq-docker:github.com/apache/rock…
[2] rocketmq-dashboard:github.com/apache/rock…