前言
从 macOS 的 Docker Desktop 启动 k8s,并设置了 ingress 做 app 的访问测试时,发现宿主机访问不了目标 url,开始以为是 ingress 没设置好,经过排查之后发现是网络不通。
问题所在
在查找了 Docker Desktop 的相关文档后,看到这段说明:
Because of the way networking is implemented in Docker Desktop for Mac, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.
由于网络是在 Mac 的 Docker Desktop 中实现的,所以在主机上看不到 docker0 接口。这个接口实际上在虚拟机中。
这里解释为在「虚拟机」中,即,实际上 macOS 上运行的 Docker 是虚拟机架构的,通过虚拟机 Linux 的 Namespace、CGroups 等资源来实现在 macOS 上运行 Docker,结构如下图:
故此,宿主机与 Docker 及 K8s 中的网段是不相通的。
解决
在 Github 上找到一种解决办法——在 Docker 中启用 SOCKS 服务。在此之间留意自己的 Docker 版本,该功能发布的版本:Version 18.03.0-ce-rc2-mac56 (23206)
需要使用 jq
命令,若无,可用 brew
安装
$ brew install jq
首先关闭 Docker,编辑文件启用 SOCKS Server
$ cd ~/Library/Group\ Containers/group.com.docker/
$ mv settings.json settings.json.backup
$ cat settings.json.backup | jq '.["socksProxyPort"]=8888' > settings.json
修改完成后重启 Docker & k8s,重启完成后开始设置代理,依次打开:系统偏好设置 -> 网络 -> 高级 -> 代理,设置 SOCKS Server 信息。
网页中再访问 ingress 目标 url 时,便能正常访问了。
注意:在网络设置的 SOCKS 代理,会影响你的网络从而上不了网,当不需要连通 Docker 网络的时候,得把这个代理设置给取消掉。笔者为了省事,不直接在网络设置中设置代理,而是用了另外一个浏览器单独设置代理来进行调试(主力 Firefox,所以这里用 Firefox Nightly 版来调试)
仅 Firefox Nightly 中可访问,且不影响本机的网络环境:
如终端需要使用代理时,编辑 ~/.zshrc
加入代理配置即可:
$ vim ~/.zshrc
export all_proxy=socks5://127.0.0.1:8888
$ source ~/.zshrc
参考自:
https://docs.docker.com/docker-for-mac/networking/#there-is-no-docker0-bridge-on-macos
https://github.com/docker/for-mac/issues/2670