【问题标题】:Why Docker daemon can not access localhost address?为什么 Docker 守护进程无法访问 localhost 地址?
【发布时间】:2020-12-27 20:56:31
【问题描述】:

目前我正在使用 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 服务器的 Dockerized 版本时,我仍然不知道为什么 localhost 地址可以正常工作,但我找到了远程地址的 2 个替代方案。

关键是,我发现当我使用npm start 启动我的节点服务器时,我可以使用两个不同的 IP 地址访问它,具体取决于我在哪个终端上执行了命令。我的 Windows 上安装了 Node 的常规 Windows 终端,我也有安装了自己的 Node 的 WSL 终端。

如果我在这些终端中运行ipconfig/ifconfig 命令,我还会得到不同的以太网地址,例如:192.168.1.110 用于 Windows,192.168.106.100 用于 WSL。当我使用这些 IP 地址时(取决于我启动 Node 服务器的位置),我的 Docker 守护程序可以到达端点。但是如果我不从 Docker 启动它,localhost 解决方案仍然无法正常工作。

【问题讨论】:

    标签: docker containers daemon


    【解决方案1】:

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

    但有一个简单的解决方案:只需使用host.docker.internal。 Docker 将此地址映射到您的本地计算机。

    【讨论】:

    • 感谢您的评论,但遗憾的是它没有回答我的问题。让我稍微改写一下。当我调用 Docker Engine API 的 /build 端点时,我使用了相同的远程地址 (http://localhost:4000/Dockerfile)。远程地址由我的小型 Node 应用程序提供。第一次,我在我的主机上使用 npm start 运行这个应用程序,但似乎守护进程无法访问这个地址。第二次,我在 Docker 容器中运行我的应用程序,守护程序可以毫无问题地访问它(我使用的是相同的远程地址)。有什么区别?为什么第二种解决方案有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2017-12-04
    • 2018-12-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多