RocketMQ部署——Docker Compose服务编排

1,874 阅读4分钟

前言

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,指定构建的基础镜像,可选用centosalpine

# 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,用于运行brokernamesrv容器服务
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
编排中定义三个容器服务:namesrvbroker,以及dashboard
namesrv中指定容器名为rmqnamesrv,映射端口为9876:9876
brokerdashboard要连接 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…