docker环境下安装rockermq以及rockermq-console

docker环境下安装rockermq以及rockermq-console

文章目录

1、下载rocketmq的镜像

docker pull apacherocketmq/rocketmq

2、启动NameServer

docker run --name rmqnamesrv -p 9876:9876 \
-v /Users/liqi/docker-compose/rocketmq/data/namesrv/logs:/home/rocketmq/logs \
-d apacherocketmq/rocketmq sh mqnamesrv

上面的指令就不解释了,都是非常简单的指令

3、启动broker

docker run --name rmqbroker \
-p 10909:10909 \
-p 10911:10911 \
-p 10912:10912 \
-v /Users/liqi/docker-compose/rocketmq/data/broker/logs:/home/rocketmq/logs \
-v /Users/liqi/docker-compose/rocketmq/data/broker/store:/home/rocketmq/store \
-v /Users/liqi/docker-compose/rocketmq/data/broker/broker.conf:/home/rocketmq/rocketmq-4.6.0/conf/broker.conf \
-d apacherocketmq/rocketmq \
sh mqbroker -n 10.192.53.197:9876 -c /home/rocketmq/rocketmq-4.6.0/conf/broker.conf 

说明:

3.1、关于文件或者目录挂载;

​ 上述的指令中的文件目录和文件,是我创建一个镜像的实例,并且成功后,去实例容器中,查看具体的目录,然后再做映射的;

​ 交互形式,进入容器;指令如下:rmqbroker是上面创建的镜像的实例名称,或者id也可以;

docker exec -it rmqbroker /bin/bash

docker环境下安装rockermq以及rockermq-console

可以看到,我当前的apacherocketmq/rocketmq:last版本,用的是4.6.0版本,配置文件的目录也是带有4.6,需要注意了;

日志文件存放目录,可以查看logback_broker.xml或者logback_namesrv.xml,主要看你上面启动的是broker服务,还是NameServer服务;

3.2、需要注意的是要把容器里的broker.conf内容,拷贝到物理机的相对应的目录下,或者在物理机的对应目录新建一个,也可以;

docker的拷贝指令:rmqbroker是上面创建的镜像的实例名称,或者id也可以

docker cp rmqbroker:/home/rocketmq/rocketmq-4.6.0/conf/broker.conf /Users/liqi/docker-compose/rocketmq/data/broker

3.3、修改物理机的broker.conf内容,新增brokerIP1=10.192.53.197指定成物理机的IP;

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=10.192.53.197 #新增brokerIP1配置,指定成物理机的IP

主要是因为启动的时候,默认brokerIP1取的本机ip,broker运行docker容器里,那么默认就是取的容器的IP,会导致使用的时候,连接超时。

3.4、上述指令最后一行

sh mqbroker -n 10.192.53.197:9876 -c /home/rocketmq/rocketmq-4.6.0/conf/broker.conf

-n :表示指定NameServer的IP和端口,注意要使用物理机的IP,不然NameServer和broker无法通信;主要是docker直接run指令,运行2个容器,2个容器实例,互相通信,应该是问题的;这个跟docker的网络模式有关系;Docker有三种网络模式,bridge、host、none,在创建的时候,不指定–network默认是bridge。

-c:是指定配置文件路径,注意是启动的broker实例中的路径,不是挂载到物理机的路径;

4、下载rockermq-console的控制台程序

4.1、下载镜像

docker pull styletang/rocketmq-console-ng

4.2、指令指令

docker run -p 8080:8080 --name rocketmq-console -d \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=10.192.53.197:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \
styletang/rocketmq-console-ng

主要注意的是,指令中的ip,需要指定物理机的IP和端口;

5、docker-compose.yml 脚本如下:

version: '3'
services:
  namesrv:
    image: apacherocketmq/rocketmq
    container_name: namesrv
    ports:
    - 9876:9876
    volumes:
    - ./data/namesrv/logs:/home/rocketmq/logs
    command: sh mqnamesrv
  broker:
    image: apacherocketmq/rocketmq
    container_name: rmqbroker
    ports:
    - 10909:10909
    - 10911:10911
    - 10912:10912
    volumes:
    - ./data/broker/logs:/home/rocketmq/logs
    - ./data/broker/store:/home/rocketmq/store
    - ./data/broker/broker.conf:/home/rocketmq/rocketmq-4.6.0/conf/broker.conf
    command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
    depends_on:
    - namesrv
  rmqconsole:
    image: styletang/rocketmq-console-ng
    container_name: rmqconsole
    ports:
    - 8080:8080
    environment:
      JAVA_OPTS: -Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
    depends_on:
    - namesrv

运行结果如下:

docker环境下安装rockermq以及rockermq-console

使用默认的java测试案例,测试也正常

 public static void main(String[] args) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer("test_group_name");
        // 设置NameServer的地址
        producer.setNamesrvAddr("localhost:9876");
        // 启动Producer实例
        producer.start();
        for (int i = 0; i < 100; i++) {
            // 创建消息,并指定Topic,Tag和消息体
            Message msg = new Message("test_topic" /* Topic */, "TagA" /* Tag */,
                    ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
            );
            // 发送消息到一个Broker
            SendResult sendResult = producer.send(msg);
            // 通过sendResult返回消息是否成功送达
            System.out.printf("%s%n", sendResult);
        }
        // 如果不再发送消息,关闭Producer实例。
        producer.shutdown();
    }

案例参考详细 https://github.com/apache/rocketmq/blob/master/docs/cn/RocketMQ_Example.md

docker部署,参考https://github.com/apache/rocketmq-docker

上一篇:CentOS系统中使用docker安装RocketMQ中间件


下一篇:RocketMQ操作记录