为什么Docker daemon无法访问localhost地址?

问题描述 投票:0回答:2

目前我正在体验 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 解决方案仍然无法工作。

docker containers daemon
2个回答
1
投票

在您的本地计算机上,

localhost
指向您的本地计算机(原文如此!)。但如果您在 Docker 容器中运行应用程序,则地址
localhost
指向容器环境。

但是有一个简单的解决方案:只需使用

host.docker.internal
。 Docker 将此地址映射到您的本地计算机。


0
投票

今天也发生了类似的事情,我试图从 localhost 容器注册表中进行 docker pull,但失败了,但我能够将其列入白名单并从 host.docker.internal 中进行拉取,也许容器工具也使用 docker 网络接口。

希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.