如何将 RocketMQ 与可视化管理界面一同部署在 Docker 中?

369 阅读5分钟

首先下载镜像

docker pull rocketmqinc/rocketmq # rocketmq
docker pull apacherocketmq/rocketmq-dashboard # rocketmq 管理平台

创建自定义网络,用于容器通信

docker network create rocketmq-net

启动 mqnamesrv

docker run -d \
--name rmqnamesrv \  # 容器名称为 rmqnamesrv
--network rocketmq-net \  # 连接到自定义网络 rocketmq-net
-p 9876:9876 \  # 映射主机端口 9876 到容器端口 9876
-v /usr/local/docker/local/rocket/data/conf:/root/conf \  # 挂载配置文件目录
-v /usr/local/docker/local/rocket/data/store:/root/store \  # 挂载数据存储目录
-v /usr/local/docker/local/rocket/data/logs:/root/logs \  # 挂载日志目录
-e "MAX_POSSIBLE_HEAP=100000000" \  # 设置环境变量 MAX_POSSIBLE_HEAP
rocketmqinc/rocketmq \  # 使用 rocketmqinc/rocketmq 镜像
sh mqnamesrv  # 执行 sh mqnamesrv 启动 NameServer

启动 broker

创建配置目录和broker配置文件

mkdir -p /usr/local/docker/local/rocketbroker/conf
vi /usr/local/docker/local/rocketbroker/conf/broker.conf
mkdir -p /usr/local/docker/local/rocketbroker/logs
mkdir -p /usr/local/docker/local/rocketbroker/store

broker.conf

注意:brokerIP1 的地址,需要从命令 docker network inspect rocketmq-net 中查询

image.png

brokerClusterName = DefaultCluster
brokerName = rocket-broker-master-one
# Master=0,slave > 0
brokerId = 0
# 表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
# 在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
# 有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
# 刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
namesrvAddr = 127.0.0.1:9876
brokerIP1 = 172.19.0.3

启动 broker

docker run -d \
--name rocketbroker \                    # 容器名称为 rocketbroker
--network rocketmq-net \                 # 连接到自定义网络 rocketmq-net
-p 10911:10911 \                         # 映射主机端口 10911 到容器端口 10911
-p 10909:10909 \                         # 映射主机端口 10909 到容器端口 10909
-v /usr/local/docker/local/rocketbroker/logs:/root/logs \             # 挂载日志目录
-v /usr/local/docker/local/rocketbroker/store:/root/store \           # 挂载数据存储目录
-v /usr/local/docker/local/rocketbroker/conf/broker.conf:/opt/rocketmq/conf/broker.conf \    # 挂载配置文件
-e "NAMESRV_ADDR=rmqnamesrv:9876" \      # 设置 NameServer 地址
-e "MAX_POSSIBLE_HEAP=200000000" \       # 设置最大堆内存大小
rocketmqinc/rocketmq \                   # 使用 rocketmqinc/rocketmq 镜像
sh mqbroker -c /opt/rocketmq/conf/broker.conf  # 执行 sh mqbroker 启动 Broker

启动 rocketmq 的控制台

首先查看自定义网络的信息

docker network inspect rocketmq-net

下面图中是 namesrv 的地址

image.png

启动控制台

docker run -d \                          # 在后台运行容器
--name rocketmq-dashboard \              # 容器名称为 rocketmq-dashboard
--network rocketmq-net \                # 连接到自定义网络 rocketmq-net
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.19.0.2:9876" \   # 设置 RocketMQ NameServer 的地址
-p 8077:8080 \                          # 将容器的 8080 端口映射到主机的 8077 端口
apacherocketmq/rocketmq-dashboard       # 使用 apacherocketmq/rocketmq-dashboard 镜像启动容器

image.png

Docker Compose 部署

结构配置文件

image.png

broker

image.png

broker.conf

其中 brokerIP1 = broker 地址为 broker 是容器的名字

# 集群名称
brokerClusterName = DefaultCluster
# 节点名称
brokerName = broker-a
# broker id节点ID, 0 表示 master, 其他的正整数表示 slave,不能小于0 
brokerId = 0
# Broker服务地址 String 内部使用填内网ip,如果是需要给外部使用填公网ip
brokerIP1 = broker
# Broker角色
brokerRole = ASYNC_MASTER
# 刷盘方式
flushDiskType = ASYNC_FLUSH
# 在每天的什么时间删除已经超过文件保留时间的 commit log,默认值04
deleteWhen = 04
# 以小时计算的文件保留时间 默认值72小时
fileReservedTime = 72
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
namesrvAddr=127.0.0.1:9876
#是大写的IP一定要注意!!!修改成自己的IP地址
brokerIP1=192.168.200.130

namesrv

image.png

最后 yml文件信息

注意:最后的控制台容器中,java参数中的 namesrv 一定对应容器的名字。

version: '3'
services:
  # RocketMQ Namesrv 服务
  namesrv:
    image: rocketmqinc/rocketmq                 # 使用 RocketMQ 官方镜像
    container_name: mqnamesrv                    # 容器名称
    ports:
      - "9876:9876"                              # 映射容器端口到宿主机端口
    hostname: namesrv                            # 容器主机名
    volumes:
      - ./namesrv/conf:/root/conf                # 挂载 Namesrv 配置文件目录
      - ./namesrv/store:/root/store              # 挂载 Namesrv 存储目录
      - ./namesrv/logs:/root/logs                # 挂载 Namesrv 日志目录
    command: ["sh","mqnamesrv"]                  # 启动命令

  # RocketMQ Broker 服务
  broker:
    image: rocketmqinc/rocketmq                 # 使用 RocketMQ 官方镜像
    container_name: mqbroker                     # 容器名称
    ports:
      - "10911:10911"                            # 映射容器端口到宿主机端口
      - "10909:10909"
    restart: always                             # 总是重启容器
    privileged: true                            # 提供给容器访问主机的权限
    environment:
      - NAMESRV_ADDR=namesrv:9876                # 设置 Broker 的 NameServer 地址
      - MAX_HEAP_SIZE=512M                       # 设置最大堆内存大小
      - HEAP_NEWSIZE=256M                        # 设置新生代堆内存大小
    volumes:
      - ./broker/store:/root/store               # 挂载 Broker 存储目录
      - ./broker/logs:/root/logs                 # 挂载 Broker 日志目录
      - ./broker/broker.conf:/opt/rocketmq/conf/broker.conf  # 挂载 Broker 配置文件
    command: ["sh","mqbroker", "-c", "/opt/rocketmq/conf/broker.conf"]  # 启动命令
    depends_on:
      - 'namesrv'                               # 依赖于 Namesrv 服务

  # RocketMQ Dashboard 服务
  rmqdashboard:
    image: apacherocketmq/rocketmq-dashboard     # 使用 RocketMQ Dashboard 官方镜像
    container_name: rocketmq-dashboard           # 容器名称
    ports:
      - 8080:8080                                # 映射容器端口到宿主机端口
    restart: always                              # 总是重启容器
    privileged: true                             # 提供给容器访问主机的权限
    depends_on:
      - 'namesrv'                                # 依赖于 Namesrv 服务
    environment:
      - JAVA_OPTS= -Xmx256M -Xms256M -Xmn128M -Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false  # Java 启动参数