背景
2024.7.22刚爆出来的漏洞 CVE-2024-23321
要求将rocketmq升级到5.3.0
https://www.cvedetails.com/cve/CVE-2024-23321/?q=CVE-2024-23321
源码下载地址
https://rocketmq.apache.org/download/
下载基础镜像并升级
基础镜像
考虑到系统架构为arm64,但官方并没有发布对应架构的docker镜像,本次在dockerhub上拉取了一个别人打包的rocketmq:4.9.7作为本次打包的基础镜像(最近连不上dockerhub,拉不下来么的办法)
# 基础镜像中提供了jdk1.8的运行环境,不再需要我们单独创建环境
docker pull dyrnq/rocketmq:4.9.7
编译源码
教程:https://rocketmq.apache.org/zh/docs/quickStart/01quickstart
编译按照官网给的编译方式在对应服务器上运行即可,本次记录如何准备编译环境
# 需要环境
jdk1.8
maven
我是直接在宿主机上编译的(容器内下载很慢,不知道为啥),运行系统是银河麒麟,安装包的管理方式是yum,类似centos,但linux原理上大同小异
# 安装openjdk(jdk需要去apache官网登录下载有点麻烦,openjdk一样用)
yum install java-1.8.0-openjdk
# 安装maven,maven主要是为了编译
yum install maven
# 验证安装
java -version
mvn -version
# 编译命令,记得将5.2.0换成你下载的5.3.0,编译时间很长(亲测吃完饭回来还没编译完,要下一堆东西)
unzip rocketmq-all-5.2.0-source-release.zip
cd rocketmq-all-5.2.0-source-release/
mvn -Prelease-all -DskipTests -Dspotbugs.skip=true clean install -U
cd distribution/target/rocketmq-5.2.0/rocketmq-5.2.0
最后生成的distribution/target/rocketmq-5.2.0/rocketmq-5.2.0
就是能在你操作系统中运行的包
打包镜像
镜像操作需要在容器中执行,使用之前下载的4.9.7的镜像创建一个容器
docker run -it dyrnq/rocketmq:4.9.7 /bin/bash
容器内工作目录是/opt/rocketmq
,把之前编译好的文件使用docker cp
命令复制到容器内/home/
下,此处有一个权限问题,我在宿主机上的用户是root,而容器内默认用户只有一个rocketmq,复制进去之后的文件权限也是root,无法操作,但在/home/
下有个rocketmq的目录权限都是rocketmq的用户和组
将编译好的rocketmq-5.3.0放到/home/rocketmq
下后权限就变了,**原理未知 **
此时把容器内/opt/rocketmq/
目录下文件都删除,将/home/rocketmq/rocketmq-5.3.0/
下的文件复制到/opt/rocketmq
中即可
rm -rf /opt/rocketmq/*
cp -r /home/rocketmq/rocketmq-5.3.0/* /opt/rocketmq/
退出容器,提交
docker commit 容器id rocketmq:5.3.0-arm64
注意此时有个问题是镜像内环境变量中mq的版本还是4.9.7,我是重新写了一个Dockerfile设置了一下环境变量,重新提交了一下
到此,适用于arm64版本的rocketmq-5.3.0打包完成
使用
通过docker-compose创建
version: '3'
services:
# rocketmq相关
namesrv:
image: rocketmq:5.3.0-arm64
container_name: rocketmq-namesrv
restart: always
mem_limit: "50g"
#volumes:
#- ./namesrv-logs:/home/rocketmq/logs/rocketmqlogs
networks:
- rocketmq
ports:
- 9876:9876
environment:
- TZ=Asia/Shanghai
- MAX_POSSIBLE_HEAP=4096m
#- JAVA_OPT_EXT=-server -Xms64m -Xmx64m -Xmn64m
command: sh mqnamesrv
broker:
image: rocketmq:5.3.0-arm64
container_name: rocketmq-broker
depends_on:
- namesrv
restart: always
mem_limit: "50g"
volumes:
- ./broker.conf:/etc/broker.conf:ro
#- ./broker-logs:/home/rocketmq/logs/rocketmqlogs
networks:
- rocketmq
ports:
- 10909:10909
- 10911:10911
environment:
- TZ=Asia/Shanghai
- NAMESRV_ADDR=namesrv:9876
- MAX_POSSIBLE_HEAP=4096m
#- JAVA_OPT_EXT=-server -Xms64m -Xmx64m -Xmn64m
command: sh mqbroker -c /etc/broker.conf
# # 提供可视化rocketmq页面,可选择部署,不需要页面可不部署
mqconsole:
image: candice0630/rocketmq-console-ng:2.0 #这儿是非apache官方编译的ng镜像,而是从dockerhub上下载的专用于arm64(aarch64)架构的镜像
container_name: rmqconsole
networks:
- rocketmq
ports:
- 19876:8080
environment:
JAVA_OPTS: -Drocketmq.config.namesrvAddr=namesrv:9876 -Drocketmq.config.isVIPChannel=false
depends_on:
- namesrv