도커 컨테이너로 빌드, 실행된 서버가 호스트에서 호출 실패할 때

byron1st·2021년 7월 11일
0

현상

제목이 간단하게 작성되지 못하는데는 이유가 있다. 현상이 매우 독특했기 때문이다. 우선 서버 코드부터 살펴보자.

import fastify from "fastify";

const server = fastify();

server.get("/ping", async (request, reply) => {
  return "pong\n";
});

server.listen(8080, (err, address) => {
  if (err) {
    console.error(err);
    process.exit(1);
  }
  console.log(`Server listening at ${address}`);
});

너무나도 간단한 fastify 서버 코드이다. 마지막 listen 함수에서 볼 수 있듯이 8080 포트에 바인딩 되어 있고, GET /ping 하면, pong 을 돌려주는 간단한 API가 한개 있다.

이를 도커 이미지로 빌드 한 후, 컨테이너를 실행하자 다음과 같은 현상이 발생했다.

  1. 호스트 머신에서 curl localhost:8080/ping 하면, curl: (52) Empty reply from server 이라고 응답한다.
  2. 컨테이너 내에서 curl localhost:8080/ping 하면, 정상적으로 pong 을 반환한다.
  3. 컨테이너의 포트 바인딩 자체는 잘 되어 있다.
lsof -i :8080
COMMAND     PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 13539 byron1st   63u  IPv6 0xaa8afebd03b2829f      0t0  TCP *:http-alt (LISTEN)

해결

위의 listen 함수에 첫번째 파라미터로 포트 넘버 값만을 주는데, 해당 부분을 아래와 같이 고친다.

server.listen({ host: "0.0.0.0", port: 8080 }, (err, address) => {
  ...
}

해결책의 이유에 대해서는 Docker: cannot open port 8080 질문글 답변의 일부를 옮김으로 대신한다.

...i assume it's just listening on the internal docker ip (172...) try listening on 0.0.0.0 to see if it works

지금껏 서버를 실행 시킬 때 한번도 호스트 값을 주어본 적이 없는데, 이런 문제가 생길 수 있다는 것을 알았다. 😅

profile
Fullstack software engineer specialized for Blockchain

2개의 댓글

comment-user-thumbnail
2022년 6월 10일

감사합니다 덕분에 헤맸는데 문제 해결했어요 ㅋㅋ

1개의 답글