Docker 部署 RocketMQ

761 阅读6分钟

1. 镜像制作

1.1 克隆 rocketmq-docker 代码

git clone https://github.com/apache/rocketmq-docker.git 

2. 构建镜像

2.2 rocketmq 镜像构建

cd image-build
sh build-image.sh 4.5.2 centos
# sh build-image.sh RMQ-VERSION BASE-IMAGE

2.3 rocketmq-dashboard 镜像构建

cd imgae-build
sh build-image-dashboared.sh 1.0.0 centos
sh build-image-dashboard.sh dashboard-VERSION BASE-IMAGE
​
# 因官方的dashboard-docker镜像没有配置用户登录,故建议使用dockerhub镜像 apacherocketmq/rocketmq-dashboard:1.0.0

3. docker-compose 单机部署 rocketmq

3.1 配置docker挂载路径

mkdir -p ./data/namesrv/logs
mkdir -p ./data/broker/logs
mkdir -p ./data/broker/store
mkdir -p ./etc/broker
mkdir -p ./data/console/data
​
chmod -R 777 ./data
chmod -R 777 ./etc

3.2 broker 配置文件

vim ./etc/broker/broker.conf
#所属集群名字
brokerClusterName = DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName = broker-a
#0 表示 Master,>0 表示 Slave
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole = ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType = ASYNC_FLUSH
# Docker环境需要设置成宿主机IP
#brokerIP1 = {docker宿主机IP}
brokerIP1 = 172.16.28.97

3.3 rocketmq-dashboard 开启用户登录功能

挂载的 data 目录下,创建 users.properties 文件

# =============用户名和密码规则「用户名=密码,权限」,这里的权限为1表示管理员,为0表示普通用户=============
# 例如:admin=admin123,1
admin=admin,1
user=user,0

3.4 编写 docker-compose

version: '3'
services:
  namesrv:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rocketmq-namesrv
    ports:
      - 9876:9876
    environment:
      - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
    volumes:
      - ./data/namesrv/logs:/root/logs
    command: sh mqnamesrv

  broker:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rocketmq-broker
    links:
      - namesrv
    depends_on:
      - namesrv
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
    environment:
      - NAMESRV_ADDR=namesrv:9876
      - JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
    volumes:
      - ./data/broker/logs:/home/rocketmq/logs
      - ./data/broker/store:/home/rocketmq/store
      - ./etc/broker/broker.conf:/home/rocketmq/conf/broker.conf
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf

  dashboard:
    image: apacherocketmq/rocketmq-dashboard:1.0.0
    container_name: rocketmq-dashboard
    ports:
      - 18090:8080
    links:
      - namesrv
    depends_on:
      - namesrv
    environment:
      - JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=true
    volumes:
      - ./data/console/data:/tmp/rocketmq-console/data

运行命令:

docker-compose -f ./docker-compose.yml up -d

4. docker-compose 部署 rocketmq 集群(双主双从)

4.1 配置文件

4.1.1 创建配置文件目录

mkdir -p ./data/namesrv/{logs-m,logs-s}
mkdir -p ./data/broker/{logs-a,logs-a-s,logs-b,logs-b-s,store-a,store-a-s,store-b,store-b-s}
mkdir -p ./conf/broker
touch ./data/broker/conf/{broker-a.conf, broker-b.conf, broker-a-s.conf, broker-b-s.conf}
touch ./docker-compose.yml

4.1.2 broker-a.conf

#所属集群名字,同一个集群名字相同
brokerClusterName=rocketmq-cluster
#broker名字
brokerName=broker-a
#0表示master >0 表示slave
brokerId=0
#删除文件的时间点,凌晨4点
deleteWhen=04
#文件保留时间 默认是48小时
fileReservedTime=168
#异步复制Master
brokerRole=ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘 
flushDiskType=ASYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=10911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35

4.1.3 broker-b.conf

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=168
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘 
flushDiskType=SYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=11911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35

4.1.4 broker-a-s.conf

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=168
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=SLAVE
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘 
flushDiskType=SYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=12911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35

4.1.5 broker-b-s.conf

brokerClusterName=rocketmq-cluster
brokerName=broker-b
#slave
brokerId=1
deleteWhen=04
fileReservedTime=168
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=13911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35

4.2 编写 docker-compose.yml

version: '3'
services:
  namesrv1:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rmq-namesrv1
    ports:
      - 9876:9876
    environment:
      - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
    volumes:
      - ./data/namesrv/logs-m:/root/logs
    command: sh mqnamesrv

  namesrv2:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rmq-namesrv2
    ports:
      - 9877:9876
    environment:
      - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
    volumes:
      - ./data/namesrv/logs-s:/root/logs
    command: sh mqnamesrv

  broker-a-m:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rmqbroker-a-m
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
    environment:
      - NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
      - JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
    volumes:
      - ./data/broker/logs-a:/home/rocketmq/logs
      - ./data/broker/store-a:/home/rocketmq/store
      - ./conf/broker/broker-a.conf:/home/rocketmq/conf/broker.conf
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - namesrv1
      - namesrv2

  broker-b-m:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rmqbroker-b-m
    ports:
      - 11909:10909
      - 11911:10911
      - 11912:10912
    environment:
      - NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
      - JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
    volumes:
      - ./data/broker/logs-b:/home/rocketmq/logs
      - ./data/broker/store-b:/home/rocketmq/store
      - ./conf/broker/broker-b.conf:/home/rocketmq/conf/broker.conf
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - namesrv1
      - namesrv2

  broker-a-s:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rmqbroker-a-s
    ports:
      - 12909:10909
      - 12911:10911
      - 12912:10912
    environment:
      - NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
      - JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
    volumes:
      - ./data/broker/logs-a-s:/home/rocketmq/logs
      - ./data/broker/store-a-s:/home/rocketmq/store
      - ./conf/broker/broker-a-s.conf:/home/rocketmq/conf/broker.conf
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - namesrv1
      - namesrv2
  broker-b-s:
    image: apacherocketmq/rocketmq:4.5.2
    container_name: rmqbroker-b-s
    ports:
      - 13909:10909
      - 13911:10911
      - 13912:10912
    environment:
      - NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
      - JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
    volumes:
      - ./data/broker/logs-b-s:/home/rocketmq/logs
      - ./data/broker/store-b-s:/home/rocketmq/store
      - ./conf/broker/broker-b-s.conf:/home/rocketmq/conf/broker.conf
    command: sh mqbroker -c /home/rocketmq/conf/broker.conf
    depends_on:
      - namesrv1
      - namesrv2

  dashboard:
    #image: apache/rocketmq-dashboard:1.0.0-centos
    image: apacherocketmq/rocketmq-dashboard:1.0.0
    container_name: rocketmq-dashboard
    ports:
      - 18090:8080
    environment:
      #- NAMESRV_ADDR=namesrv:9876
      - JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.2.35:9876;192.168.2.35:9877 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=true
    volumes:
      - ./data/console/data:/tmp/rocketmq-console/data

运行命令:

docker-compose up -d

浏览器访问:http://192.168.2.35:18090

5. FAQ

部署双主双从集群时,broker配置宿主机IP和端口时,只有10911端口的broker能启动,其它的连接失败,注释掉以下两行则集群正常启动

#Broker 对外服务的监听端口
listenPort=13911
#设置BrokerIP
brokerIP1=192.168.2.35

\