仍然困惑為什麼當你讓一個進程監聽 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}/`);
});

當我對這個應用程式進行 dockerize 並在容器中運行它時,主機名稱 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。嘗試使用當前標準將減少未來的問題。

相關內容