【发布时间】: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