第二节 Docker安装RocketMQ

亮子 2025-10-22 14:41:07 59 0 0 0

好的,使用 Docker 安装 RocketMQ 是一种非常便捷的方式,可以避免复杂的环境配置。下面我将提供两种最常用、最可靠的方法:一种是使用官方镜像手动部署,另一种是使用 Docker Compose 一键部署。

方法一:使用 Docker 命令手动部署(适合理解架构)

这种方式需要你分别启动 NameServer 和 Broker。

1. 启动 NameServer

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 服务的命令。

2. 启动 Broker

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。

3. (可选)启动 RocketMQ 控制台

控制台可以让你可视化地查看和管理 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 即可打开控制台。


方法二:使用 Docker Compose 一键部署(推荐)

这种方式更简单,所有配置都在一个 YAML 文件中,易于管理和维护。

1. 创建 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

2. 创建 Broker 配置文件

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}

3. 启动所有服务

在包含 docker-compose.ymlbroker.conf 的目录下执行:

# 启动服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 停止服务
docker-compose down

验证安装

  1. 检查容器状态:使用 docker ps 确保三个容器(rmqnamesrv, rmqbroker, rmqconsole)都处于 Up 状态。
  2. 查看日志:如果启动失败,使用 docker logs rmqbroker 等命令查看具体日志。
  3. 访问控制台:浏览器打开 http://{YOUR_HOST_IP}:8080,如果能看到控制台界面,并且 Cluster 页面显示了一个 Broker 节点,说明安装成功。

重要提示与故障排除

  • brokerIP1 是关键:这是最常见的错误来源。必须设置为客户端能访问到的 IP。在云服务器上,请设置为公网 IP。
  • 防火墙/安全组:确保宿主机防火墙或云服务商的安全组开放了 9876(NameServer)、10911(Broker)和 8080(控制台)端口。
  • 资源不足:如果宿主机内存不足,Broker 可能启动失败。可以尝试调低 MAX_POSSIBLE_HEAP 环境变量的值。
  • 版本一致性:确保你使用的镜像版本是稳定的,如 4.9.4,而非 latest,以避免兼容性问题。

按照以上步骤,你应该可以成功使用 Docker 安装并运行 RocketMQ。Docker Compose 方式是更推荐的生产环境实践。