目前我正在体验 Docker Engine API 并尝试构建一个简单的映像。 我有带有 WSL2 的 Windows 10,我可以通过 unix 套接字 (
/var/run/docker.sock
) 或通过 TCP 端口 2375 上公开的守护进程来调用 API。
我调用的端点是 /build 端点。我正在使用
remote
查询参数,因此守护进程将尝试获取此远程地址的内容并使用它来构建图像。我还创建了一个小型 NodeJS 服务器,它提供一个文本文件(Dockerfile),它的唯一端点将是我的 Docker 构建的远程地址。
首先,我使用简单的 npm start 命令在主机上启动 Node 服务器。然后我为 /build 端点提供了本地端点地址(类似于
http://localhost:4000/Dockerfile
),但它失败了,原因如下:
{
"message": "error downloading remote context http://localhost:4000/Dockerfile: Get http://localhost:4000/Dockerfile: dial tcp localhost:4000: connect: connection refused"
}
然后我也尝试使用 Docker 化版本的 Node 服务器进行相同的操作(只需从我的代码构建一个映像并将其暴露到相同的主机端口)。这次它工作完美,具有完全相同的远程参数:
http://localhost:4000/Dockerfile
。
此时,我对我的解决方案感到满意,因为我无论如何都想在容器内运行节点服务器。但是,我也想了解发生了什么以及为什么会发生?我可以看出,这是因为某种网络。我假设将我的 Node 服务器放入容器后,它就成为网络的一部分(我认为它应该是 Docker 的默认
bridge
网络),之后我的 Docker 守护进程可以访问它,但我不确定,因为我不能在互联网上找不到任何有关它的信息。或者也许 Docker 守护进程运行在特定网络中,无法访问主机上的地址?
更新#1
我的调查进展甚微。我仍然不知道为什么当我切换到 Node 服务器的 Docker 化版本时,
localhost
地址仍然有效,但我找到了远程地址的 2 个替代方案。
关键是,我发现当我使用
npm start
启动节点服务器时,我可以使用两个不同的 IP 地址访问它,具体取决于我在哪个终端中执行命令。我的 Windows 上安装了常规 Windows 终端,并且安装了 Node,而且我还有 WSL 终端,其自己安装了 Node。
如果我在这些终端内运行
ipconfig
/ifconfig
命令,我还会获得不同的以太网地址,例如:对于 Windows 为 192.168.1.110
,对于 WSL 为 192.168.106.100
。当我使用这些 IP 地址时(取决于我启动 Node 服务器的位置),我的 Docker 守护进程可以到达端点。但是如果我不从 Docker 启动 localhost 解决方案仍然无法工作。
在您的本地计算机上,
localhost
指向您的本地计算机(原文如此!)。但如果您在 Docker 容器中运行应用程序,则地址 localhost
指向容器环境。
但是有一个简单的解决方案:只需使用
host.docker.internal
。 Docker 将此地址映射到您的本地计算机。
今天也发生了类似的事情,我试图从 localhost 容器注册表中进行 docker pull,但失败了,但我能够将其列入白名单并从 host.docker.internal 中进行拉取,也许容器工具也使用 docker 网络接口。
希望这对某人有帮助。