Docker-compose로 db 구성 시, Error: connect ECONNREFUSED 127.0.0.1:5432 at TCPConnectWrap.afterConnect 발생

 

$ Docker-compose up을 실행할 때, NestJS에서 Error: connect ECONNREFUSED 127.0.0.1:3301로 데이터베이스와 연동이 되지않는 이슈가 발생했다. Postgresql 연동 에러인데 에러 로그의 포트 번호가 3301 인 이유는 Docker-compose.yml 파일에서 아래와 같이 5432에서 3301로 포트 포워딩을 했기 때문이다.

 

 postgresql:
    container_name: db
    image: postgres:latest
    networks:
      - app-tier
    volumes:
      - ./postgresql/db:/var/lib/postgresql/data/
    environment:
      // 환경변수 값
    ports:
      - "3301:5432"
    restart: always

 

해당 에러가 왜 골치아픈 문제였냐면, 로컬에서도 연동되지 않고, Docker compose 환경에서도 연동되지 않았다면, 상관이 없는데 로컬 환경에서는 정상적으로 접근이 가능하지만, Docker 환경에서의 NestJS에서만 연동 에러가 발생하였기 때문이다.

 

로컬 환경에서는 정상적으로 Initialized 로그가 출력된다.

구글링을 해보니 https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers

 

ECONNREFUSED for Postgres on nodeJS with dockers

I'm building an app running on NodeJS using postgresql. I'm using SequelizeJS as ORM. To avoid using real postgres daemon and having nodejs on my own device, i'm using containers with docker-compos...

stackoverflow.com

의 답변처럼 127.0.0.1이나 localhost 대신 데이터베이스 host 주소에 데이터베이스 컨테이너 이름을 넣어보았다.

출처) https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers

 

그래도 여전히 db를 찾을 수 없다는 에러가 출력되었다.

 

db에 연결할 수 없다

 

출처) https://stackoverflow.com/questions/33357567/econnrefused-for-postgres-on-nodejs-with-dockers

 

해당 스택오버 플로우의 두 번째 답변에 맥 환경에서 도커를 사용하면 localhost나, 127.0.0.1 대신 host.docker.internal을 사용하라고 적혀있었다. 링크되어있는 도커 문서를 읽어보니 첫 번째 답변처럼 host에 컨테이너 명을 입력하면 host에 존재하는 docker0라는 인터페이스 브릿지가 연결해주는 듯 하였다. 하지만 맥 환경에서는 Docker Desktop의 구현 방식으로 인해 docker0 bridge가 존재하지 않아서 host.docker.internal을 명시해야 된다고 되어있다.

 

macOS에는 docker0 bridge가 없다....!
host.docker.internal을 사용하면 된다!

db 호스트 명을 host.docker.internal으로 변경한 후, 아래처럼 정상적으로 TypeOrmModule이 Initialized 됨을 볼 수 있다.