目录
前言
单机版部署
1. 准备工作
2. 创建Docker网络
3.启动NameServer
4.启动Broker
5.启动RocketMQ控制台
集群版部署
1.启动NameServer
2.启动Broker
配置文件说明
前言
废话不多直接上干货,我负责踩坑,你负责验证。
单机版部署
1. 准备工作
确保Docker和Docker Compose已经安装。如果没有,请先进行安装。
2. 创建Docker网络
docker network create rocketmq-net
查看Docker网络:
docker network ls
NETWORK ID NAME DRIVER SCOPE
3ce16f0e7951 bridge bridge local
afe16f80ffc9 host host local
36892fa1b1bb none null local
ce100504c410 rocketmq-network bridge local
3.启动NameServer
docker run -d --name rmqnamesrv --network rocketmq-network -p 9876:9876 rocketmqinc/rocketmq sh mqnamesrv
输出结果:
Unable to find image 'rocketmqinc/rocketmq:latest' locally
latest: Pulling from rocketmqinc/rocketmq
a02a4930cb5d: Pull complete
90eb47c86343: Pull complete
43bf660f95f6: Pull complete
7f5ca7a20245: Pull complete
707a618112e3: Pull complete
4b527473eafb: Pull complete
fedd1d06c8ba: Pull complete
27782fcf3aef: Pull complete
Digest: sha256:b08556227ad8d169b7927f4c48335877cb10060e6781374ce5a644ea29f6fbe1
Status: Downloaded newer image for rocketmqinc/rocketmq:latest
332a6a49ef2f1caf3ec8fb597df49a03a7a91b3a552668f5bf762c19595c2a25
参数解释:
docker run
docker run
命令用于创建并启动一个新的容器。- 在这个命令中,你可以指定容器的配置和运行时行为。
-d
-d
选项表示“分离模式”(detached mode),即在后台运行容器。- 容器启动后,你的终端不会被占用,容器会在后台继续运行。
--name rmqnamesrv
--name rmqnamesrv
为容器指定一个名称,这里将容器命名为rmqnamesrv
。- 使用自定义名称可以更方便地管理和引用这个容器,比如通过名称启动、停止、查看日志等。
--network rocketmq-network
--network rocketmq-network
指定容器要连接的 Docker 网络,这里是rocketmq-network
。- 这使得该容器可以通过网络中的名称(如
rmqnamesrv
)与其他容器进行通信。- 使用自定义网络可以控制容器之间的连接范围,并启用 Docker 内置的 DNS 服务。
-p 9876:9876
-p 9876:9876
映射主机的端口和容器的端口。- 这意味着将主机的
9876
端口映射到容器的9876
端口。- RocketMQ 的 NameServer 默认监听
9876
端口,因此通过这个映射,可以从主机直接访问 NameServer。
rocketmqinc/rocketmq
rocketmqinc/rocketmq
是所使用的 Docker 镜像名称。- 这个镜像包含了 RocketMQ 的安装和运行环境,官方维护的镜像通常会包含 NameServer、Broker 等组件的运行脚本。
sh mqnamesrv
sh mqnamesrv
是容器启动后要执行的命令。- 这个命令启动一个
sh
进程,并执行mqnamesrv
脚本来启动 RocketMQ 的 NameServer。mqnamesrv
是 RocketMQ 启动 NameServer 的命令。通常,RocketMQ 镜像包含这个命令,它会启动 NameServer 服务并监听在指定的端口(这里是 9876)。
4.启动Broker
docker run -d --name rmqbroker --network rocketmq-network \-p 10911:10911 \-e "NAMESRV_ADDR=rmqnamesrv:9876" \-v /opt/rocketmq/conf/broker.conf:/opt/rocketmq/conf/broker.conf \rocketmqinc/rocketmq \sh mqbroker -c /opt/rocketmq/conf/broker.conf
参数解释:
docker run
docker run
命令用于创建并启动一个新的容器。
-d
-d
选项表示“分离模式”(detached mode),即在后台运行容器。
--name rmqbroker
--name rmqbroker
为容器指定一个名称,这里将容器命名为rmqbroker
。- 使用自定义名称可以方便地管理和引用该容器。
--network rocketmq-network
--network rocketmq-network
指定容器要连接的 Docker 网络,这里是rocketmq-network
。- 这允许容器在这个网络中与其他容器(如 NameServer)通过容器名称进行通信。
-p 10911:10911
-p 10911:10911
将主机的10911
端口映射到容器的10911
端口。- 10911 端口通常用于 RocketMQ Broker 的外部通信(如消息存储的物理 I/O 操作)。
-e "NAMESRV_ADDR=rmqnamesrv:9876"
-e
选项用于设置环境变量。在这里,设置了NAMESRV_ADDR
环境变量。NAMESRV_ADDR=rmqnamesrv:9876
指定了 NameServer 的地址为rmqnamesrv:9876
,其中rmqnamesrv
是 NameServer 容器的名称,端口号为9876
。- 这使得 Broker 容器可以在启动时注册到指定的 NameServer。
-v /opt/rocketmq/conf/broker.conf(主机文件路径):/opt/rocketmq/conf/broker.conf(容器文件路径)
-v
选项用于将主机文件或目录挂载到容器内。在这里,/opt/rocketmq/conf/broker.conf
文件被挂载到容器的相同路径。- 这意味着你可以在主机上编辑
broker.conf
文件,容器内的配置将会实时更新,避免了每次更改配置都要重新构建容器的麻烦。
rocketmqinc/rocketmq
rocketmqinc/rocketmq
是所使用的 Docker 镜像名称。- 这个镜像包含了 RocketMQ 的安装和运行环境,包括 Broker、NameServer 等组件。
sh mqbroker -c /opt/rocketmq/conf/broker.conf
sh mqbroker
是容器启动后要执行的命令,启动一个sh
进程并执行mqbroker
命令来启动 RocketMQ 的 Broker 服务。-c /opt/rocketmq/conf/broker.conf
指定了 Broker 的配置文件路径为/opt/rocketmq/conf/broker.conf
。这个文件路径与通过-v
选项挂载的配置文件一致。
注:在执行此指令之前我们需要创建Broker的配置文件,如果没有创建直接启动Broker 会报错,报错信息可以通过一下操作查看:
# 查看所有镜像
docker ps -a# 输出结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df6d3071e300 rocketmqinc/rocketmq "sh mqbroker -c /opt…" 4 seconds ago Up 3 seconds 9876/tcp, 10909/tcp, 0.0.0.0:10911->10911/tcp, :::10911->10911/tcp rmqbroker
332a6a49ef2f rocketmqinc/rocketmq "sh mqnamesrv" 7 minutes ago Up 7 minutes 10909/tcp, 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp, 10911/tcp # 查看Broker日志
docker logs df6d3071e300 (对应的镜像ID)
在没有配置broker.conf前日志中会出现:
java.io.FileNotFoundException: /opt/rocketmq/conf/broker.conf
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:128)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
配置broker.conf(如果已有则跳过此步骤):
# 创建所有缺少的目录
sudo mkdir -p /opt/rocketmq/conf# 创建文件
sudo touch /opt/rocketmq/conf/broker.confvim /opt/rocketmq/conf/broker.conf# 配置文件
# RocketMQ Broker配置文件
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
#brokerIP1=127.0.0.1 推荐不设置 此ip可以为镜像名或者使用ping镜像名获取具体IP填写,并非为127.0.0.1
# NameServer地址
namesrvAddr=rmqnamesrv:9876
# 数据存储路径
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
# 设置 Broker ID 和集群名称
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC
在这里额外多说几句,大家可以看到,配置中namesrvAddr 的值按道理来说应该是具体的IP+PORT但是我这里却使用的是rmqnamesrv,其实仔细联系上下文可以发现,这里的rmqnamesrv就是nameServer的镜像名,那为什么在这里可以配置镜像名呢?这便涉及到了Docker的DNS解析如下:
在 Docker 中,如果不指定
--network
选项,Docker 默认会为每个容器创建一个独立的网络。这意味着不同容器之间默认无法通过容器名称直接通信。因此,在这种情况下,配置namesrvAddr
为镜像名(即容器名)是无法通过 DNS 解析来自动找到对应的容器的,所以我们在开始便创建了自定义网络,这样将容器放置在同一个自定义网络中。这样,Docker 的内置 DNS 服务才能解析容器名称。
Docker 内部 DNS 解析
- Docker 的内置 DNS 服务器会自动为同一 Docker 网络中的容器提供名称解析。每个容器在其网络内部都可以使用其他容器的名字作为主机名。
- 当你在容器的配置中指定
namesrvAddr=rmqnamesrv:9876
时,Docker 网络的 DNS 服务会解析rmqnamesrv
为相应的容器的 IP 地址。服务发现
- 在 Docker 自定义网络中,Docker 会在网络内维护一个 DNS 解析服务,使容器可以通过名字互相发现和通信。容器名称(如
rmqnamesrv
)实际上是网络中容器的主机名。自动 IP 分配
- 当你启动容器时,Docker 会自动为每个容器分配一个 IP 地址,并将容器的名字注册到 Docker 内部的 DNS 服务器。这样,其他容器可以通过名字直接访问这个 IP 地址。
5.启动RocketMQ控制台
docker run -d --name rmqconsole --network rocketmq-network -p 8080:8080 -e "NAMESRV_ADDR=rmqnamesrv:9876" styletang/rocketmq-console-ng
参数解释:
--name rmqconsole
--name rmqconsole
为容器指定一个名称,这里将容器命名为rmqconsole
。- 使用自定义名称可以方便地管理和引用该容器。
--network rocketmq-network
--network rocketmq-network
指定容器要连接的 Docker 网络,这里是rocketmq-network
。- 这允许容器在这个网络中与其他容器(如 RocketMQ 的 NameServer 和 Broker)通过容器名称进行通信。
-p 8080:8080
-p 8080:8080
将主机的8080
端口映射到容器的8080
端口。- RocketMQ Console 默认在
8080
端口提供 Web 界面。通过这个映射,你可以从主机上访问 RocketMQ Console 的 Web 界面。
-e "NAMESRV_ADDR=rmqnamesrv:9876"
-e
选项用于设置环境变量。在这里,设置了NAMESRV_ADDR
环境变量。NAMESRV_ADDR=rmqnamesrv:9876
指定了 NameServer 的地址为rmqnamesrv:9876
,其中rmqnamesrv
是 NameServer 容器的名称,端口号为9876
。- RocketMQ Console 使用这个地址来连接和管理 RocketMQ 集群的 NameServer 和 Broker。
styletang/rocketmq-console-ng
styletang/rocketmq-console-ng
是所使用的 Docker 镜像名称。- 这个镜像包含了 RocketMQ Console 的安装和运行环境,它提供了一个 Web 界面,用于监控和管理 RocketMQ 集群,包括查看 Topic、Consumer、Producer 的状态等。
输出结果:
Unable to find image 'styletang/rocketmq-console-ng:latest' locally
latest: Pulling from styletang/rocketmq-console-ng
e12c678537ae: Pull complete
8d9ed335b7db: Pull complete
3318dd58ae60: Pull complete
624ba6156166: Pull complete
c7a02d193df7: Pull complete
813b62320378: Pull complete
49e2d6393f32: Extracting [=============> ] 34.54MB/130.1MB
0a2b7222259b: Download complete
478657249124: Download complete
5f8636e9fbb7: Download complete
执行完成后便可以使用我们映射的8080端口进行访问控制台至此便已经搭建完成。
集群版部署
1.启动NameServer
# 启动nameServer 1
docker run -d --name rmq-namesrv-1 --network rocketmq-network \-p 9876:9876 \rocketmqinc/rocketmq sh mqnamesrv启动nameServer 2
docker run -d --name rmq-namesrv-2 --network rocketmq-network \-p 9877:9876 \rocketmqinc/rocketmq sh mqnamesrv
2.配置broker.conf
broker1.con
ocketMQ Broker配置文件
brokerClusterName=DefaultCluster
brokerName=broker-a
# Master 的 brokerId 必须是 0
# Slave 的 brokerId 必须是正整数,且唯一
brokerId=0
brokerIP1=172.20.0.2
# NameServer地址
namesrvAddr=rmqnamesrv:9876;rmqnamesrv:9877
# 数据存储路径
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
# 设置 Broker ID 和集群名称
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC
broker2.conf
RocketMQ Broker配置文件
brokerClusterName=DefaultCluster
brokerName=broker-b
# Master 的 brokerId 必须是 0
# Slave 的 brokerId 必须是正整数,且唯一
brokerId=1
brokerIP1=172.20.0.3
# NameServer地址
namesrvAddr=rmqnamesrv:9876;rmqnamesrv:9877
# 数据存储路径
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
# 设置 Broker ID 和集群名称
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC
3.配置文件说明
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
4.启动Broker
# 切换到配置文件目录下
cd /opt/rocketmq/conf# 启动Broker1
docker run -d --name rmq-broker-a --network rocketmq-network \-p 10911:10911 -p 10909:10909 -p 10912:10912 \-v $(pwd)/broker-a.conf:/opt/rocketmq/conf/broker-a.conf \rocketmqinc/rocketmq \sh mqbroker -c /opt/rocketmq/conf/broker-a.conf# 启动Broker2
docker run -d --name rmq-broker-b --network rocketmq-network \-p 20911:20911 -p 20909:20909 -p 20912:20912 \-v $(pwd)/broker-b.conf:/opt/rocketmq/conf/broker-b.conf \rocketmqinc/rocketmq \sh mqbroker -c /opt/rocketmq/conf/broker-b.conf
5.启动控制台
docker run -d --name rmq-console --network rocketmq-network \-p 8080:8080 \-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmq-namesrv-1:9876;rmq-namesrv-2:9876" \styletang/rocketmq-console-ng
总结
使用 Docker 和 rocketmqinc/rocketmq
镜像成功部署了一个完整的 RocketMQ 集群。此集群在同一个Docker容器中搭建,包括多个 NameServer、多个 Broker 实例以及一个管理控制台,适用于开发、测试和学习场景。如果你有足够的容器也可以进行多容器部署。