如何在 macOS 上查询本地注册表 运行 时窥探来自 Docker 的 "docker pull" 对 Mac 的请求?

How to snoop on "docker pull" requests from Docker for Mac while it's querying a local registry running on macOS?

(我将 Docker 用于 Mac 版本 2.0.0.3 (31259),它具有 docker-engine 18.09.2。)

我正在尝试这样做:

情况 1:docker-engine

上未设置代理

所以正如我之前所说,我有一个服务器可以直接在我的 MacOS 上模仿 docker-registry v2 API 运行ning在端口 8080 上。所以我将 host.docker.internal:8080 添加为不安全的注册表:

如果我为docker-引擎设置代理,一切正常(docker-引擎可以访问我的本地注册表)。 例如,我可以做 docker pull host.docker.internal:8080/busybox 并且请求到达我的代理:

情况二:为docker引擎设置代理,从docker hub

拉取镜像

当我将 docker 引擎指向 mitmproxy (host.docker.internal:5000) 并执行 docker pull library/mysql 时,效果也很好(我可以看到对 [=79= 的请求])

情况三:为docker引擎设置代理,从docker hub

拉取镜像

因此,当我结合情况 #1+#2 时,它将 docker-engine 指向我笔记本电脑上的 mitmproxy 作为代理,然后尝试使用之前有效的 docker pull host.docker.internal:8080/busybox失败:

Server connection to ('host.docker.internal', 8080) failed: Error connecting to "host.docker.internal": [Errno 8] nodename nor servname provided, or not known

我的代理看到的错误是找不到 host.docker.internal。我不知道这是不是因为 mitmproxy 在我的 Mac 主机 OS 上 运行ning(而不是在 docker VM 内),这就是它无法解析的原因主持人。

我基本上无法使用 mitmproxy(在我的 Mac 主机 OS 上)窥探 docker-引擎请求以及 运行 注册表(在我的 Mac 主机 OS 上)同时。

我也尝试将注册表移动到容器中并将主机名更改为 gateway.docker.internal,但也没有成功。

有什么实现方法吗?

您是否尝试过将 127.0.0.1 host.docker.internal 添加到 mac 的 /etc/hosts? 它似乎对我有用。

  • Docker VM 将 host.docker.internal:5000 解析为 192.168.65.2:5000,这将它连接到在 Mac、
  • 上运行的 mitm 代理
  • 中间人代理不知道如何解析 host.docker.internal,因此 nodename nor servname provided, or not known 错误,
  • 通过将条目添加到 /etc/hosts,您告诉 mitm 实际连接到本地主机以访问注册表。