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