仍然不明白为什么当你让一个进程监听 0.0.0.0 而不是 127.0.0.1 时 docker 可以工作

仍然不明白为什么当你让一个进程监听 0.0.0.0 而不是 127.0.0.1 时 docker 可以工作
const hostname = '0.0.0.0'; // << This is where I'm confused
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

当我将此应用程序 docker 化并在容器中运行时,主机名 0.0.0.0 可以工作,但 127.0.0.1 不起作用。我理解原因是因为 docker 容器几乎都有自己的 IP。

因此,当我将主机名变量设置为 127.0.0.1 并构建并运行容器时,然后在浏览器上访问 127.0.0.1,我连接的不是容器的 IP 地址,而是我的本地机器。

但是为什么当我在 0.0.0.0 上运行容器化应用程序并在浏览器上访问 127.0.0.1 时,它现在连接到容器而不是我的本地机器?

谢谢。

答案1

docker 是“一台不同的机器”,并且您的机器在本地主机上将端口转发到该机器。

因此,当 docker 内部的应用程序监听 127.0.0.1 时,该地址仅在该机器内部有效,要从“外部”连接到它,您需要监听该any地址。

因此有 2 个不同127.0.0.1

如果您监听any(0.0.0.0),那么它也可应用于 127.0.0.1 以及机器上的所有其他接口/IP。

现在你应该确保了解::IPv6 变体,但它也应该包括 v4。尝试使用当前标准将减少未来的问题。

相关内容