今天想docker启动试用apollo配置中心,用的系统是macos,从apollo网站下载docker-compose文件启动后,可以正常登录portal,但是在使用程序连接的时候,发现连接不通。大概分析了一下,apollo将configservice的IP注册到eureka,注册的是docker ip,而macos是没有办法直接连接docker ip的。
原因分析
在linux系统下,宿主机和容器是通过docker0网桥进行通讯。所有容器网段的请求都会经由docker0。
容器的网卡和docker0上有一对Veth Pair 设备,从容器网卡的数据包会直接出现在docker0的端口上,连接在 docker0 网桥上的容器,就可以通过它来进行通信。
宿主机的路由规则中如果172.17.0.*的数据包会转到docker0,docker0再转到具体端口。
但是在macos的docker desktop 是先启动一个linux虚拟机,然后上面的整个网络架构在虚拟机里。macos到linux是联通的,但是没有路由规则到docker。
解决方案
网上有很多方案,但是相对都比较复杂,那些自己创建虚拟机再在vm里装docker配路由的,更是麻烦。
github上找到一个相对比较简单的方法:https://github.com/chipmk/docker-mac-net-connect
具有以下优点:
- L3 连接:实现容器和宿主机直连
- 轻量:基于WireGuard (built-in to Linux kernel)
- 方便:一次安装,不用每次重启Mac和Docker都重复配置
- 简洁:所有都打包成一个二进制文件,没有额外依赖
安装非常简单,难点是要有个🪜。
# Install via Homebrew
$ brew install chipmk/tap/docker-mac-net-connect
# Run the service and register it to launch at boot
$ sudo brew services start chipmk/tap/docker-mac-net-connect
安装完成后,就可以在宿主机直接访问container IP。(docker inspect *** 可以查看到IP地址)
注意:docker desktop 要低于 4.15 版本,高版本的还不支持。另外docker-mac-net-connect 要sudo启动。
具体原理参考下图,有兴趣的到github有详细介绍。