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
可以看到,我当前的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
运行结果如下:
使用默认的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