Все еще не понимаю, почему Docker работает, когда вы заставляете процесс прослушивать 0.0.0.0, но не 127.0.0.1

Все еще не понимаю, почему Docker работает, когда вы заставляете процесс прослушивать 0.0.0.0, но не 127.0.0.1
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}/`);
});

Когда я докеризирую это приложение и запускаю его в контейнере, имя хоста 0.0.0.0 работает, но 127.0.0.1 не работает. Я понимаю, что причина в том, что контейнеры docker по сути получают свой собственный IP.

Поэтому, когда я создаю и запускаю контейнер, а затем устанавливаю переменную hostname на 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. Попытка использовать текущие стандарты уменьшит будущие проблемы.

Связанный контент