好的,使用 Docker 安装 RocketMQ 是一种非常便捷的方式,可以避免复杂的环境配置。下面我将提供两种最常用、最可靠的方法:一种是使用官方镜像手动部署,另一种是使用 Docker Compose 一键部署。
这种方式需要你分别启动 NameServer 和 Broker。
NameServer 是 RocketMQ 的注册中心,负责管理 Broker 的路由信息。
docker run -d \
--name rmqnamesrv \
-p 9876:9876 \
-v /your/local/data/namesrv/logs:/root/logs \
-v /your/local/data/namesrv/store:/root/store \
-e "MAX_POSSIBLE_HEAP=100000000" \
rocketmqinc/rocketmq:4.9.4 \
sh mqnamesrv
参数解释:
- -d
: 后台运行容器。
- --name rmqnamesrv
: 为容器指定一个名字。
- -p 9876:9876
: 将容器的 9876 端口(RocketMQ NameServer 默认端口)映射到宿主机。
- -v .../logs
和 -v .../store
: 数据持久化,将容器内的日志和数据目录挂载到宿主机,防止容器删除后数据丢失。
- -e "MAX_POSSIBLE_HEAP=100000000"
: 设置 JVM 最大堆内存(约100MB),对于 NameServer 来说足够了。
- rocketmqinc/rocketmq:4.9.4
: 使用的官方镜像和版本。
- sh mqnamesrv
: 在容器内启动 NameServer 服务的命令。
Broker 是消息中转角色,负责存储和转发消息。**Broker 需要配置并连接到 NameServer。**
首先,创建一个 Broker 的配置文件 broker.conf
。
# 在宿主机上创建目录和文件
mkdir -p /your/local/data/rocketmq/config
vim /your/local/data/rocketmq/config/broker.conf
在 broker.conf
文件中输入以下内容:
# Broker 集群名称,如果单机部署可以保持默认
brokerClusterName = DefaultCluster
# Broker 名称,Master 和 Slave 通过此名称配对
brokerName = broker-a
# Broker ID, 0 表示 Master,非 0 表示 Slave
brokerId = 0
# 删除消息时间点,默认是凌晨4点
deleteWhen = 04
# 消息保留时长,默认48小时
fileReservedTime = 48
# Broker 角色,ASYNC_MASTER 表示异步复制的Master
brokerRole = ASYNC_MASTER
# 刷盘方式,ASYNC_FLUSH 表示异步刷盘(性能更好),SYNC_FLUSH 表示同步刷盘(更可靠)
flushDiskType = ASYNC_FLUSH
# !!!最重要的一行:指定 NameServer 的地址
# 这里使用 Docker 的内部网络,用容器名“rmqnamesrv”访问
namesrvAddr = rmqnamesrv:9876
# !!!允许 Broker 被任意 IP 访问,这对于在 Docker 内运行至关重要
brokerIP1 = {YOUR_HOST_IP}
注意: 请将 {YOUR_HOST_IP}
替换为你的**宿主机(Host)的公网 IP 或局域网 IP**。这是为了让 Broker 在注册到 NameServer 时,使用一个外部客户端能够真正访问到的地址,而不是 Docker 容器内部的 IP。例如 brokerIP1 = 192.168.1.100
。
现在,启动 Broker 容器,并链接到 NameServer 容器。
docker run -d \
--name rmqbroker \
--link rmqnamesrv:rmqnamesrv \
-p 10911:10911 \
-p 10909:10909 \
-v /your/local/data/broker/logs:/root/logs \
-v /your/local/data/broker/store:/root/store \
-v /your/local/data/rocketmq/config/broker.conf:/opt/rocketmq/conf/broker.conf \
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
-e "MAX_POSSIBLE_HEAP=2000000000" \
rocketmqinc/rocketmq:4.9.4 \
sh mqbroker -c /opt/rocketmq/conf/broker.conf
参数解释:
- --link rmqnamesrv:rmqnamesrv
: 将 Broker 容器与 NameServer 容器连接,并为其设置一个主机名 rmqnamesrv
。这样在 broker.conf
中就可以用 rmqnamesrv:9876
来访问 NameServer。
- -p 10911:10911 -p 10909:10909
: 映射 Broker 的端口。
- -v .../broker.conf
: 将我们刚刚创建的配置文件挂载到容器内。
- -e "NAMESRV_ADDR=rmqnamesrv:9876"
: 另一种设置 NameServer 地址的方式(环境变量),但如果使用了自定义配置文件,则以配置文件为准。
- sh mqbroker -c /opt/rocketmq/conf/broker.conf
: 使用自定义配置文件启动 Broker。
控制台可以让你可视化地查看和管理 RocketMQ 集群。
docker run -d \
--name rmqconsole \
--link rmqnamesrv:rmqnamesrv \
-p 8080:8080 \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-t styletang/rocketmq-console-ng:latest
访问 http://{YOUR_HOST_IP}:8080
即可打开控制台。
这种方式更简单,所有配置都在一个 YAML 文件中,易于管理和维护。
docker-compose.yml
文件version: '3.8'
services:
namesrv:
image: rocketmqinc/rocketmq:4.9.4
container_name: rmqnamesrv
ports:
- 9876:9876
volumes:
- ./data/namesrv/logs:/root/logs
- ./data/namesrv/store:/root/store
environment:
- MAX_POSSIBLE_HEAP=100000000
command: sh mqnamesrv
networks:
- rmq
broker:
image: rocketmqinc/rocketmq:4.9.4
container_name: rmqbroker
ports:
- 10911:10911
- 10909:10909
volumes:
- ./data/broker/logs:/root/logs
- ./data/broker/store:/root/store
- ./broker.conf:/opt/rocketmq/conf/broker.conf
environment:
- NAMESRV_ADDR=namesrv:9876
- MAX_POSSIBLE_HEAP=2000000000
command: sh mqbroker -c /opt/rocketmq/conf/broker.conf
depends_on:
- namesrv
networks:
- rmq
console:
image: styletang/rocketmq-console-ng:latest
container_name: rmqconsole
ports:
- 8080:8080
environment:
- JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
depends_on:
- namesrv
- broker
networks:
- rmq
networks:
rmq:
name: rmq_network
driver: bridge
在 docker-compose.yml
同目录下,创建 broker.conf
文件:
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 使用 Compose 中的服务名“namesrv”访问
namesrvAddr = namesrv:9876
# !!! 替换为你的宿主机 IP !!!
brokerIP1 = {YOUR_HOST_IP}
在包含 docker-compose.yml
和 broker.conf
的目录下执行:
# 启动服务
docker-compose up -d
# 查看运行状态
docker-compose ps
# 停止服务
docker-compose down
docker ps
确保三个容器(rmqnamesrv
, rmqbroker
, rmqconsole
)都处于 Up
状态。docker logs rmqbroker
等命令查看具体日志。http://{YOUR_HOST_IP}:8080
,如果能看到控制台界面,并且 Cluster 页面显示了一个 Broker 节点,说明安装成功。brokerIP1
是关键:这是最常见的错误来源。必须设置为客户端能访问到的 IP。在云服务器上,请设置为公网 IP。9876
(NameServer)、10911
(Broker)和 8080
(控制台)端口。MAX_POSSIBLE_HEAP
环境变量的值。4.9.4
,而非 latest
,以避免兼容性问题。按照以上步骤,你应该可以成功使用 Docker 安装并运行 RocketMQ。Docker Compose 方式是更推荐的生产环境实践。