Docker Compose搭建RocketMQ服务

326 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

最新镜像

目前官方最新的RocketMQ镜像版本是4.9.4,小伙伴可前往docker官网查看:hub.docker.com/r/apache/ro…

NameServer服务与Broker服务的启动都是同一个镜像,只不过启动命令不同。

编写docker-compose文件

根据上面找到的最新镜像,我们可以开始编写docker-compose.yaml文件。

  • NameServer配置
version: "3.1"
services:
namesrv:
  image: apache/rocketmq:4.9.4
  container_name: mqnamesrv
  ports:
    - "9876:9876"
  environment:
    JAVA_OPT: -server -Xms512m -Xmx512m
  command: sh mqnamesrv
  volumes:
    - "./rocketmq/namesrv/logs/rocketmqlogs:/home/rocketmq/logs/rocketmqlogs"

上面的这个配置NameServer的配置,主要是设置了开放端口、配置JVM启动参数以及映射对应的日志文件。NameServer实例的启动命令是sh mqnamesrv;因为NameServer比较简单,所以配置项不是很多。

  • Broker配置
version: "3.1"
services:
mqbroker1:
  image: apache/rocketmq:4.9.4
  container_name: mqbroker1
  ports:
    - "10911:10911"
    - "10909:10909"
    - "10912:10912"
  environment:
    JAVA_OPT_EXT: -server -Xms512M -Xmx512M -Xmn256m
  command: sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf
  depends_on:
    - namesrv
  volumes:
    - "./rocketmq/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf"
    - "./rocketmq/broker/logs/rocketmqlogs:/home/rocketmq/logs/rocketmqlogs"
    - "./rocketmq/broker/store:/home/rocketmq/store"

broker服务需要开放三个端口,10911是处理消费者请求的,10909处理生产者请求,10912用于broker之间的主从同步;启动命令一定要指定配置文件broker.conf,前提是该配置文件通过volumes挂载到容器中;另外需要注意的是需要额外把存储文件也挂载出来,否则容器被删后,数据文件就丢失了。

部署过程中,比较重要的就是配置文件broker.conf

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
brokerIP1 = 注册到nameserver的ip
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr = nameserver的ip:9876
autoCreateTopicEnable = false
storePathRootDir = /home/rocketmq/store
storePathCommitLog = /home/rocketmq/store/commitlog
storePathConsumeQueue = /home/rocketmq/store/consumequeue
storePathIndex = /home/rocketmq/store/index
storeCheckpoint = /home/rocketmq/store/checkpoint
abortFile = /home/rocketmq/store/abort

上面配置中,需要修改的就是brokerIP1namesrvAddr两个参数,需要根据实际情况来做调整。如果不设置

brokerIP1,那么注册到NameServer上面的broker就是容器内的ip,那么很可能应用服务是无法访问的,所以这个ip地址一定要应用服务能够访问。namesrvAddr指定的是NameServer服务所在机器的ip和端口。

注意

启动后可能broker服务会启动失败,很有可能是因为挂载的文件夹权限不够造成的,因为broker服务需要对/home/rocketmq/store文件夹有写的权限。