Networking

當你讓一個程序監聽 0.0.0.0 而不是 127.0.0.1 時,為什麼 docker 工作仍然很困惑

  • November 30, 2021
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 時,它現在連接到容器而不是我的本地電腦?

謝謝你。

docker 是“另一台機器”,您的機器在 localhost 上獲得了一個埠轉發到該機器。

因此,當 docker 內的應用程序偵聽僅在該機器內部有效的 127.0.0.1 時,要從“外部”連接到它,您需要偵聽該any地址。

所以有2個不同的127.0.0.1

如果您收聽any(0.0.0.0),那麼它也可以在 127.0.0.1 以及機器上的所有其他介面/IP 上使用。

引用自:https://serverfault.com/questions/1084915