当前位置:   article > 正文

MAC OS使用docker部署RocketMQ,解决宿主机无法访问broker_docker-connector

docker-connector

背景

本地通过docker启动了rocketMQ,用springboot项目连上mq的NameServer之后,发消息时提示无法连接Broker。

分析原因

代码debug

通过对代码的debug,找到了取Broker地址的代码是在这个位置,后续通过该地址连接的时候,提示无法连接。
在这里插入图片描述

地址分析

对brokerAddr字段进行查看,发现该地址指向172.16.0.XX,利用宿主机去ping该地址确实无法ping通,因为不在一个网络里。

原因分析

虽然利用docker启动容器,可以在启动的时候配置端口映射,利用127.0.0.1+映射端口的方式直接访问容器,但是在Broker的连接上,是通过NameServer来获取他的地址,并非通过自己的配置。而NameServer提供的是容器网络内的地址,所以导致在拿到Broker的地址后,无法通过宿主机连接。
场景描述

解决方案

这里只提供一个macos上我认为比较便利的方法

使用docker-connector

首先 Mac 端通过 brew 安装 docker-connector

brew install wenjunxiao/brew/docker-connector
  • 1

然后执行以下命令把 docker 的所有 bridge 网络都添加到路由中

docker network ls --filter driver=bridge --format "{{.ID}}" | xargs docker network inspect --format "route {{range .IPAM.Config}}{{.Subnet}}{{end}}" >> /usr/local/etc/docker-connector.conf
  • 1

路由配置
也可以手动修改 /usr/local/etc/docker-connector.conf 文件中的路由,格式是,加上配置后,就可以访问容器ip在这个网络下的容器

route 172.16.0.0/255 ==> route ip/子网掩码 
  • 1

配置完成,直接启动服务(需要 sudo,路由配置启动之后仍然可以修改,并且无需重启服务立即生效)

sudo brew services start docker-connector 启动
sudo brew services restart docker-connector 重启
  • 1
  • 2

然后使用以下命令在 docker 端运行 wenjunxiao/mac-docker-connector,需要使用 host 网络,并且允许 NET_ADMIN

docker run -it -d --restart always --net host --cap-add NET_ADMIN --name connector wenjunxiao/mac-docker-connector
  • 1

最后附上对应docker-compose文件报错NameServer、broker、console、docker-connect

version: '2'
services:
  namesrv:
    image: rocketmqinc/rocketmq
    container_name: rocketmq-nameserver
    ports:
      - 9876:9876
    networks:
      proxy:
        ipv4_address: 172.16.0.86
    command: sh mqnamesrv
  broker:
    image: rocketmqinc/rocketmq
    container_name: rocketmq-broker
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
    networks:
      proxy:
        ipv4_address: 172.16.0.87
    command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
    depends_on:
      - namesrv
    environment:
      - JAVA_HOME=/usr/lib/jvm/jre
  console:
    image: styletang/rocketmq-console-ng
    container_name: rocketmq-console-ng
    ports:
      - 8087:8080
    networks:
      proxy:
        ipv4_address: 172.16.0.88
    depends_on:
      - namesrv
    environment:
      - JAVA_OPTS= -Dlogging.level.root=info   -Drocketmq.namesrv.addr=rmqnamesrv:9876 
      - Dcom.rocketmq.sendMessageWithVIPChannel=false
  dockerconnect:
    image: wenjunxiao/mac-docker-connector
    container_name: docker-connect
    restart: always
    cap_add: 
      - NET_ADMIN
    network_mode: host
networks:
  proxy:
    ipam:
      config:
      - subnet: 172.16.0.0/24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/256799?site
推荐阅读
相关标签
  

闽ICP备14008679号