1. 创建项目目录
mkdir -p rocketmq-custom/{namesrv,broker,dashboard,conf,data}
cd rocketmq-custom
2. 编写 NameServer Dockerfile namesrv/Dockerfile
vi namesrv/Dockerfile
FROM eclipse-temurin:17-jdk-alpine
# 设置环境变量
ENV ROCKETMQ_VERSION=5.2.0
ENV ROCKETMQ_HOME=/opt/rocketmq
ENV JAVA_OPT="-Duser.home=/opt"
# 安装必要工具
RUN apk add --no-cache bash curl
# 下载并安装 RocketMQ
RUN mkdir -p ${ROCKETMQ_HOME} && \
curl -L https://mirrors.aliyun.com/apache/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o /tmp/rocketmq.zip && \
unzip /tmp/rocketmq.zip -d /tmp && \
mv /tmp/rocketmq-all-${ROCKETMQ_VERSION}-bin-release/* ${ROCKETMQ_HOME}/ && \
rm -rf /tmp/rocketmq.zip /tmp/rocketmq-all-${ROCKETMQ_VERSION}-bin-release
# 创建日志和存储目录
RUN mkdir -p ${ROCKETMQ_HOME}/logs ${ROCKETMQ_HOME}/store
# 暴露端口
EXPOSE 9876
# 设置工作目录
WORKDIR ${ROCKETMQ_HOME}
# 启动 NameServer
CMD ["sh", "bin/mqnamesrv"]
3. 编写 Broker Dockerfile broker/Dockerfile
vi broker/Dockerfile
FROM eclipse-temurin:17-jdk-alpine
ENV ROCKETMQ_VERSION=5.2.0
ENV ROCKETMQ_HOME=/opt/rocketmq
ENV JAVA_OPT="-Duser.home=/opt"
RUN apk add --no-cache bash curl
# 下载 RocketMQ
RUN mkdir -p ${ROCKETMQ_HOME} && \
curl -L https://mirrors.aliyun.com/apache/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o /tmp/rocketmq.zip && \
unzip /tmp/rocketmq.zip -d /tmp && \
mv /tmp/rocketmq-all-${ROCKETMQ_VERSION}-bin-release/* ${ROCKETMQ_HOME}/ && \
rm -rf /tmp/rocketmq.zip /tmp/rocketmq-all-${ROCKETMQ_VERSION}-bin-release
# 创建目录
RUN mkdir -p ${ROCKETMQ_HOME}/logs ${ROCKETMQ_HOME}/store
# 复制配置文件
COPY broker.conf ${ROCKETMQ_HOME}/conf/broker.conf
# 暴露端口
EXPOSE 10909 10911 10912
WORKDIR ${ROCKETMQ_HOME}
# 启动 Broker
CMD ["sh", "bin/mqbroker", "-c", "conf/broker.conf"]
3. 编写 Broker 配置文件 conf/broker.conf
vi broker/broker.conf
# 集群名称
brokerClusterName=DefaultCluster
# Broker名称
brokerName=broker-a
# Broker ID,0表示Master
brokerId=0
# NameServer地址
namesrvAddr=rmqnamesrv:9876
# 删除文件时间点,默认凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=48
# Broker角色:ASYNC_MASTER异步复制Master,SYNC_MASTER同步双写Master,SLAVE从节点
brokerRole=ASYNC_MASTER
# 刷盘方式:ASYNC_FLUSH异步刷盘,SYNC_FLUSH同步刷盘
flushDiskType=ASYNC_FLUSH
# 开启自动创建Topic
autoCreateTopicEnable=true
# Broker IP(生产环境建议配置宿主机IP)
# brokerIP1=你的宿主机IP
5. 编写自定义 docker-compose.yml
vi /data/docker-compose/docker-compose.yml
version: '3.8'
services:
namesrv:
build:
context: ./namesrv
dockerfile: Dockerfile
container_name: rmqnamesrv
ports:
- "9876:9876"
volumes:
- ./data/namesrv/logs:/opt/rocketmq/logs
- ./data/namesrv/store:/opt/rocketmq/store
networks:
- rocketmq
restart: unless-stopped
broker:
build:
context: ./broker
dockerfile: Dockerfile
container_name: rmqbroker
ports:
- "10909:10909"
- "10911:10911"
- "10912:10912"
volumes:
- ./data/broker/logs:/opt/rocketmq/logs
- ./data/broker/store:/opt/rocketmq/store
environment:
- NAMESRV_ADDR=rmqnamesrv:9876
depends_on:
- namesrv
networks:
- rocketmq
restart: unless-stopped
dashboard:
image: apacherocketmq/rocketmq-dashboard:2.1.0
container_name: rmqdashboard
ports:
- "8080:8080"
environment:
- JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
depends_on:
- namesrv
- broker
networks:
- rocketmq
restart: unless-stopped
networks:
rocketmq:
driver: bridge
6. 构建并启动
# 启动服务
docker-compose up -d namesrv
docker-compose up -d broker
docker-compose up -d dashboard
# 查看构建的镜像
docker images | grep rocketmq
常用验证命令
# 查看 NameServer 日志
docker logs -f rmqnamesrv
# 查看 Broker 日志
docker logs -f rmqbroker
# 进入 Broker 容器创建 Topic
docker exec -it rmqbroker bash
sh mqadmin updatetopic -t TestTopic -c DefaultCluster
# 查看 Topic 列表
docker exec rmqbroker sh mqadmin topicList -n rmqnamesrv:9876
# 测试消息发送(进入容器)
docker exec -it rmqbroker bash
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
# 测试消息消费
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer