プロセスが 0.0.0.0 を listen するのに 127.0.0.1 を listen しないようにすると、docker が機能する理由がまだわかりません。

プロセスが 0.0.0.0 を listen するのに 127.0.0.1 を listen しないようにすると、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 は「別のマシン」であり、あなたのマシンは localhost 上のそのマシンへのポート転送を取得します。

したがって、Docker 内のアプリがそのマシン内でのみ有効な 127.0.0.1 をリッスンする場合、「外部」からそのアプリに接続するには、そのanyアドレスをリッスンする必要があります。

つまり、2つの異なる が存在します127.0.0.1

(0.0.0.0)を listen するとany、127.0.0.1 およびマシン上の他のすべてのインターフェース/IP でも利用できるようになります。

::最近では、どの IPv6 バリアントがどれであるかを必ず確認する必要がありますが、v4 も含める必要があります。現在の標準を使用することで、将来の問題を軽減できます。

関連情報