Docker Compose로 MySQL+FastAPI 연동
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를 다루는 부분이 있어서 열심히 읽어봤다.
-
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에서는 또 다른가??
-
방법을 찾으면 다시 내용 추가할 예정