如何在 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。)
我正在尝试这样做:
- 运行 直接在我的 mac 端口 8080 上的 docker-registry 进程(它不是真正的 docker-registry,而是看起来像 registry 的东西,所以没关系)没有 HTTPS
- 运行 我的 mac 上的 mitmproxy 直接在端口 5000 上(拦截请求)
- 配置docker-引擎使用mitmproxy这样我就可以窥探请求
- 启动一个
docker pull
到我的本地注册表,以便在我的注册表上触发一些请求,我可以在 mitmproxy 上监视这些请求。
情况 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 实际连接到本地主机以访问注册表。
(我将 Docker 用于 Mac 版本 2.0.0.3 (31259),它具有 docker-engine 18.09.2。)
我正在尝试这样做:
- 运行 直接在我的 mac 端口 8080 上的 docker-registry 进程(它不是真正的 docker-registry,而是看起来像 registry 的东西,所以没关系)没有 HTTPS
- 运行 我的 mac 上的 mitmproxy 直接在端口 5000 上(拦截请求)
- 配置docker-引擎使用mitmproxy这样我就可以窥探请求
- 启动一个
docker pull
到我的本地注册表,以便在我的注册表上触发一些请求,我可以在 mitmproxy 上监视这些请求。
情况 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 实际连接到本地主机以访问注册表。