CentOS 8通过Docker-Compose部署RocketMQ 4.8.0(解决Broker启动的Exit 253问题)

1、docker-compose.yml

该文件创建在自己想要的目录中

version: "3.9" #我的Docker是20.0.+的,因此用最高的3.9
services:
  rmqnamesrv:
    image: foxiswho/rocketmq:4.8.0 #4.8.0没有区分namesrv和broker
    container_name: rmqnamesrv
    restart: always
    ports:
      - 9876:9876
    volumes:
      - /usr/local/soft/docker-containers/rocketmq-4.8.0/namesrv/logs:/home/rocketmq/rocketmq-4.8.0/logs
      - /usr/local/soft/docker-containers/rocketmq-4.8.0/namesrv/store:/home/rocketmq/rocketmq-4.8.0/store
    environment:
      JAVA_OPTS: "-Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms128M -Xmx128M -Xmn128m"
    command: ["sh","mqnamesrv"]
    networks: #指定容器连接哪个网络(自定义的rmq),自定义网络名称必须在下面定义
      rmq:
        aliases:
          - rmqnamesrv
  rmqbroker:
    image: foxiswho/rocketmq:4.8.0
    container_name: rmqbroker
    ports:
      - 10909:10909
      - 10911:10911
    volumes:
      - /usr/local/soft/docker-containers/rocketmq-4.8.0/broker/logs:/home/rocketmq/rocketmq-4.8.0/logs
      - /usr/local/soft/docker-containers/rocketmq-4.8.0/broker/store:/home/rocketmq/rocketmq-4.8.0/store
      - /usr/local/soft/docker-containers/rocketmq-4.8.0/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.8.0/conf/broker.conf
    environment:
      JAVA_OPTS: "-Duser.home=/opt"
      JAVA_OPT_EXT: "-server -Xms128M -Xmx128M -Xmn128m"
    command: ["sh","mqbroker","-c","/home/rocketmq/rocketmq-4.8.0/conf/broker.conf","-n","rmqnamesrv:9876","autoCreateTopicEnable=true"]
    depends_on: #broker依赖namesvr启动,docker-compose会通过依赖自动编排启动顺序,被依赖的先启动,因此不需通过wait-for-it.sh进行手动编排了
      - rmqnamesrv
    networks: #指定容器连接哪个网络(自定义的rmq),自定义网络名称必须在下面定义
      rmq:
        aliases:
          - rmqbroker

  rmqconsole:
    image: styletang/rocketmq-console-ng:latest
    container_name: rmqconsole
    ports:
      - 8180:8080
    volumes:
      - /usr/local/soft/docker-containers/rocketmq-4.8.0/console/tmp_data:/home/rocketmq/rocketmq-4.8.0/console/tmp_data
    environment:
      JAVA_OPTS: "-Drocketmq.namesrv.addr=192.168.75.128:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    depends_on:
      - rmqnamesrv
    networks: #指定容器连接哪个网络(自定义的rmq),自定义网络名称必须在下面定义
      rmq:
        aliases:
          - rmqconsole

networks: #定义网络,定义后上面才可使用,否则报错
  rmq:
    name: rmq
    driver: bridge

2、根据自己定义的数据卷创建相应目录

主要创建":"左边的,因为左边是宿主机的挂载目录,而右边是容器目录,docker-compose创建容器时会自动创建相应目录
怎么操作mkdir不用写吧…

3、在自定义的宿主机挂载目录中创建broker.conf

通过上方内容可知,我的broker.conf放在:

/usr/local/soft/docker-containers/rocketmq-4.8.0/broker/conf/

IP、名称用自己的,IP是CentOS的,名称自定义的

brokerIP1=192.168.xx.xxx
namesrvAddr=192.168.xx.xxx:9876
brokerName=broker_xx

4、遇见的Broker Exit 253问题

(1) 启动所有容器

docker-compose up -d

(2) 查看启动情况

docker ps -a

发现Broker总是Exit 253

(3) 查看启动日志(重点!!)

docker logs -f -t --tail 100 rmqbroker

输出:

2021-07-27T05:12:24.321722906Z ======================================
2021-07-27T05:12:24.321780102Z -server -Xms895M -Xmx895M -Xmn223M
-XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25
-XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0
-XX:SurvivorRatio=8 -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime
-XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:-UseBiasedLocking
-XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow
-XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=895M -XX:-UseLargePages
-Djava.ext.dirs=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64/jre/lib/ext
:/home/rocketmq/rocketmq-4.8.0/bin/../lib
-Duser.home=/opt -Xms128M -Xmx128M -Xmn128m -cp .:/home/rocketmq/rocketmq-4.8.0/bin/../conf:

5、解决Broker Exit 253

(1) 启动顺序没问题、内存有修改,这些没问题

(2) 观察输出的日志

仔细看了日志,发现问题可能出现在最后一行:

-Duser.home=/opt -Xms128M -Xmx128M -Xmn128m -cp .:/home/rocketmq/rocketmq-4.8.0/bin/../conf:

之中的:

/home/rocketmq/rocketmq-4.8.0/bin/../conf

猜想是宿主机和容器两者的broker.conf没有联系上,那我就把容器的挂载目录改了

但是,不能全抄上面的!

(3) 目录怎么改

得根据自己的容器挂载目录进行相应的修改,自己的容器挂载目录情况通过find可间接查到
观察这条日志输出的容器目录,发现中间夹了一个rocketmq-4.8.0的目录,那我就搜它一下:

find / -name rocketmq-4.8.0

此命令是搜出CentOS中所有的名为rocketmq-4.8.0文件夹与文件,容器中的东西也能给你搜出来(通过这种方法间接可查看到部分容器挂载目录情况),我的搜索结果的一部分是:
(中间那个看起来乱乱的数字应该是容器ID,原本很长,为了方便观看我把它们缩短了)

/var/lib/docker/overlay2/28ce88/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/a0b3b9/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/b1ddf0/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/9978aa/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/dbea08/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/d30ad6/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/785bd0/diff/home/rocketmq/rocketmq-4.8.0
/var/lib/docker/overlay2/844059/diff/home/rocketmq/rocketmq-4.8.0

进去这些文件里看一看(这时有第三方图形化界面就方便点)
然后我就找到了broker.conf,它们大体相同的目录结构:

/home/rocketmq/rocketmq-4.8.0/conf/broker.conf

至此,我决定用这条容器目录进行挂载(":"右边),同时,Broker通过配置文件启动的路径也要改成这个;修改后的docker-compose.yml就是上面一开始那个,已经修改完了的

最终我的猜想得到了印证,启动成功!


版权声明:本文为HellHellNo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。