docker에서 Nest서버와 mysql 연결 안되는 문제 -항해플러스

codeing999·2023년 7월 11일
2

NestJS

목록 보기
6/9

환경 : windows10, nestjs, docker, mysql

문제1

  • 먼저, 로컬에서 이미 mysql 로컬DB가 있어서 3306포트가 중복되어 도커에서 3306포트를 사용 못하는 문제가 있었는데 이는, docker-compose에서 다음과 같이 외부 포트를 3306이 아닌 다른 포트를 사용하도록 하여 해결 되었다.
ports:
      - '3307:3306'

문제2

  • 위의 문제는 해결되었지만 그래도 계속 연결이 되지 않았다. 계속 다음과 같이 연결 실패가 떴다.
ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
v0.2                | Error: connect ECONNREFUSED 127.0.0.1:3306
  • 연결 실패에는 호스트가 잘못됐을 수도 있고 포트번호가 잘못됐을 수도 있고 워낙 가능한 원인이 많아서 이것 저것 다 시도해보았는데, 저 3306포트로 연결시도를 하는 것이 계속 거슬렸다. 컨테이너에서 외부포트를 3307로 하도록 했는데, nest에서는 여전히 3306으로 시도하고 있는 것이 문제 같아 보였다.

  • db연결 설정하는 환경변수에서 포트를 3307로 바꿨는데도 여전히 3306으로 시도했다. 아무래도 .env를 읽지 않고 있는 것 같았다.

env_file:
      - .env

찾아보니 nest 컨테이너에 위와 같은 설정을 추가했더니 3307로 연결을 시도하기 시작하여서 이 문제는 해결되었다.

문제3

  • 포트번호도 해결됐는데 여전히 번호만 3307로 바뀐 채 똑같이 연결이 안되었다.
ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
v0.2                | Error: connect ECONNREFUSED 127.0.0.1:3307
  • 여기서 희안한 점은, 워크벤치로 로컬 3307포트로 연결 시도하면 연결이 성공한다는 것이었다. 127.0.0.1:3307이라는 mysql 컨테이너는 분명 잘 성생된 것이고, 이것에 nest가 연결을 못하는 것이 문제인 것으로 생각되었다.

  • 그리고 컨테이너 안의 db이지만 호스트 주소를 사용한다는 것도 일단 알게되었다.

  • 도커 컴포즈에서 두 컨테이너 간에 같은 네트워크를 사용하도록 하는 설정도 해보고, db 호스트명을 mysql로도 해보고 컨테이너 이름인 mysql-1로도 해보고 이것저것 다 해봤는데 다 안됐다.

DB_HOST=host.docker.internal
#172.17.0.1
172.17.0.1 is the IP-address of the host in Docker’s default network.
  • 도커에서 호스트주소가 172.17.0.1라고 하고 이걸 가리키는게 저 문자열인가보다.

연결 성공.

profile
코딩 공부 ing..

1개의 댓글

comment-user-thumbnail
2023년 8월 14일

감사합니다 :) 계속 삽질했는데 해결됐네요

답글 달기