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 挂载的文件

 

原文地址:https://www.cnblogs.com/herenwei-wayne/p/14768193.html