• MAC OS使用docker部署RocketMQ,解决宿主机无法访问broker


    背景

    本地通过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
  • 相关阅读:
    解决react样式组合时css module动态样式失效的问题
    Android Studio Bumblebee (2021.1.1) 稳定版正式发布
    logicFlow 流程图编辑工具使用及开源地址
    java项目——CRM客户管理系统(SpringBoot+MyBatis)
    堆叠式自动编码器(SAE)--学习笔记
    NumPy 通用函数(ufunc):高性能数组运算的利器
    The Sandbox 正在 Polygon 网络上进行部署
    踩坑——ArrayList使用HashSet去重无效(已解决)
    RedisTemplate实战应用--队列等
    理论修炼---JVM之内存结构
  • 原文地址:https://blog.csdn.net/UCLoveLikeTheWind/article/details/126408849