프로세스가 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은 작동하지 않습니다. 나는 도커 컨테이너가 거의 자체 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) 을 듣는 경우 any127.0.0.1 및 시스템의 다른 모든 인터페이스/IP에서도 사용할 수 있습니다.

::요즘에는 IPv6 변형이 무엇인지 확인해야 하지만 v4도 포함해야 합니다. 현재 표준을 사용하면 향후 문제가 줄어들 것입니다.

관련 정보