Docker 安装 RocketMq
docker安装rocketmq
前提
- 电脑安装有docker
- 会基本的docker指令
本地docker是安装在虚拟机中192.168.37.147中
步骤
docker pull foxiswho/rocketmq:server
# rocketmq由server + broker组成,因此下载两个镜像
# 下载docker镜像,官方文档 https://github.com/foxiswho/docker-rocketmq
# pull 拉取镜像
docker pull foxiswho/rocketmq:broker
docker pull styletang/rocketmq-console-ng
# 安装过后需要下载客户端,检测mq的数据
# 启动rmqserver
docker run -d -p 9876:9876 --name rmqserver --restart=always foxiswho/rocketmq:server
# 启动broker
docker run -d -p 10911:10911 -p 10909:10909 --name rmqbroker --restart=always --link rmqserver:namesrv -e "NAMESRV_ADDR=namesrv:9876" -e "JAVA_OPTS=-Duser.home=/opt" -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m" -v /root/rocketmq/broker.conf:/etc/rocketmq/broker.conf foxiswho/rocketmq:broker
--link docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。
-e 设置环境变量 -e username="ritchie": 设置环境变量;
--restart=always 跟随docker一起启动
--volume , -v: 绑定一个卷
# 启动 rocketmq-console-ng
docker run -d --name rmqconsole -p 8180:8080 --restart=always --link rmqserver:namesrv -e "JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -t styletang/rocketmq-console-ng
跟随docker自动启动
docker update --restart=always xx
启动后可以再windows电脑中访问
http://192.168.37.147:8180/#/
遇到的问题
Java代码无法访问docker
DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr("192.168.37.147:9876"); producer.start(); for (int i = 0; i < 10; i++) { //消息子类型用tags来标识 Message msg = new Message("TopicTest", "", ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)); //每个消息在业务局面的唯一标识码,要设置到keys字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引(哈希索引),应用可以通过topic,key来查询这条消息内 容,以及消息被谁消费。由于是哈希索引,请务必保证key尽可能唯一,这样可以避免潜在的哈希冲突。 //订单Id String orderId = "20034568923546"; message.setKeys(orderId); msg.setKeys("key-" + i); SendResult sendResult = producer.send(msg); // SEND_OK 消息发送成功 // // FLUSH_DISK_TIMEOUT 消息发送成功,但是服务器刷盘超时,消息已经迕入服务器队列,只有此时服务器宕机,消息才会丢失 // // FLUSH_SLAVE_TIMEOUT 消息发送成功,但是服务器同步到 Slave时超时,消息已经迕入服务器队列,只有此时服务器宕机,消息才会丢失 // // SLAVE_NOT_AVAILABLE 消息发送成功,但是此时 slave 不可用,消息已经迕入服务器队列,只有此时服务器宕机,消息才会丢失 //对于消息不可丢失应用,务必要有消息重发机制,例如如果消息发送失败,存储到数据库,能有定时程序尝试重发,或者人工触发重发。 System.out.printf("%s%n", sendResult); } producer.shutdown();
需要在宿主机中修改broker.conf,地址在/root/rocketmq/broker.conf,就是-v 挂载的文件