Docker Compose로 DB와 백엔드 연동하기

ERROR 내용

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 99] Cannot assign requested address)")
  • Web(프론트+백)과 MySQL을 묶어서 한번에 실행하기 위해 Docker를 사용하면서 굉장히 많은 시행착오를 겪었다.

  • MySQL은 Docker 이미지를 받아왔고 Web은 HTML+CSS+JavaScript 와 FastAPI 를 사용했다.

  • ORM이라고 부를 수 있는지 모르겠지만 DB와의 연동으로는 pymysql을 사용했다.

  • 이제 다음과 같은 아주 단순한 구조를 로컬에서 구현하기 위한 시도를 했다.


  • Docker로 MySQL 이미지를 받아서 띄우는 건 성공했다.

  • 터미널에서 Web을 직접 실행 후 DB와 연결 테스트는 성공!

  • 이제 Web도 Docker로 말아서 Docker Compose 로 실행 시도.

  • 여기서 문제의 에러를 만나게 된다.


  • JavaScript 모듈이 없다? 뭐 이런 내용인거 같아 검색을 해봤다.
1. 인터넷 연결 문제
2. 크롬 문제
  • 라고 나와서 껐다 켜보고 인터넷이 잘 돌아가는지(?) 확인도 했다.

  • 여전히 안되지만 MySQL Container는 정상적으로 실행되는 것을 DBeaver에 연결해보고 알았다.

  • Web Container만 종료하고 다시 터미널에서 Web 실행해보니 잘된다.

  • 여기에서 Web Docker 에 문제가 있다는 것을 인지했다.

  • Docker Hub의 MySQL 페이지를 유심히 보면서 솔루션을 찾아 다녔다.

  • 이 과정에서 Docker Desktop에서 로그를 볼 수 있고 Container 별로 터미널이 있다는 것을 발견했다.

  • 로그에서 에러를 발견했다.


  • 뭔가 pymysql로 DB에 연결이 안된다는 내용인거 같다. 그래서 구글링 시작!

  • 여기서 부터 굉장한 삽질이 시작됐다.

서버 문제라서 3306 포트를 확인해야 된다?

  • 사실 네트워크에 대해서는 잘 몰라서 이것저것 찾아보면서 포트 확인을 했는데 큰 소득이 없었다.

실행 순서가 꼬여서 그럴 수 있다?

  • Docker Compose 옵션중에 depends_on 이라는 옵션이 있다.

  • 종속관계를 만들어줘서 container 의 실행 순서를 지정해줄 수 있다.

  • 하지만 정답은 아니었다.

네트워크 연결을 해줘야 된다?

  • Container는 각각의 객체? 이고 Docker Compose를 사용하면 결국 두개의 Container를 실행하는 것이기 때문에 연결이 필요하다고 한다.

  • Dcoker docs 에서 network를 다루는 부분이 있어서 열심히 읽어봤다.

  • https://docs.docker.com/compose/networking/

  • Docker Compose 파일에 link 와 network 를 지정하면서 하는 방법이었다. 물론 실패했다.

  • 다시 읽어보니 가장 윗줄에 dafault 로 하나의 네트워크로 설정된다고 써있었다.


  • 사실 여기에 이미 정답이 나와있었는데 부족한 영어실력으로 인해 삽질을 끝내지 못했다.

포트 문제?

  • 포트에 대한 개념이 부족해서 여기서 조금 당황했다.

  • ’local 포트:container 포트’ 로 구성되어 있는데, 여기저기 건드려보고 내용도 찾아보면서 포트가 어떤식으로 연결되는지 약간 이해할 수 있었다. 물론 문제는 해결하지 못했다.

컨테이너에 연결할 때, 그 컨테이너의 고유 IP로 연결해야 된다?

  • Container 마다 IP주소가 따로 있는줄은 몰랐다.

  • Container를 만들고 터미널에 다음과 같이 명령어를 입력하면 볼 수 있다.

docker inspect "컨테이너 명"


  • 저 IP주소를 호스팅으로 해서 pymysql 접속을 시도… 실패!

컨테이너 이름을 입력하면 된다?


  • 화면에 있는 test-mysql, test-mysql:3306 이런 것을 시도해봤지만 되지않았다.

  • 다시보니 여기서 앞서 살펴본 Docker docs 에서도 container name 을 넣어주면 된다고 나와있었다.

  • docker compose 파일을 살펴보자


  • 옵션도 아주 직관적이다.

  • 바로 연결 시도…. 실패!

  • 이때부터 도저히 안되겠어서 오픈카톡방에도 질문하고 다른 사람들의 코드를 찾아다녔고 내가 작성한 것과 비교를 해보기 시작했다.

  • 그리고 정답을 발견했다!!


해결 방법


  • service 명으로 들어가는 저것이 host name 이었다.

  • 약 10시간을 삽질하면서 네트워크에 엄청난 비밀이 있는줄 알았지만… 허무했다.

  • 그래도 이 문제를 고민하면서 Docker와 조금 더 친해진 것 같다.


하루 뒤… 문제발생 (2023-01-13)

  • local에서는 분명히 잘 동작한다.

  • 그런데 GCP VM 인스턴스로 옮기니까 똑같은 에러가 발생한다.

  • 당연히 외부에서 DBMS를 이용해서는 접속이 잘 된다.

  • 그러나.. 분명 잘 써줬는데… 왜 안되는지?

  • local과 VM에서는 또 다른가??

  • 방법을 찾으면 다시 내용 추가할 예정