인프런 커뮤니티 질문&답변

김제하님의 프로필 이미지
김제하

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

PostgreSQL DB와 연동하고 도커를 통해 마이그레이션 수행하기

django와 mysql container 연결하기

해결된 질문

작성

·

1.2K

0

안녕하세요!

도커 컨테이너로 mysql을 띄워놓고

local terminal에서 django 서버를 실행시킬려고 합니다.

하지만, 계속해서 아래와 같은 Unkown Mysql server host 'mysql' 에러 또는 Access denied 에러가 발생되어 여줘봅니다.

django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'mysql' (8)")

코드는 다음과 같습니다.

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "instagram",
        "USER": "project",
        "PASSWORD": "a1s2d3f4",
        "HOST": "mysql",
        "PORT": "3306",
    }
}

 

mysql은 docker compose 가 아닌 하나만 실행해서 다음과 같이 했습니다.

docker run -e MYSQL_ROOT_PASSWORD=a1s2d3f4 -e MYSQL_USER=project -e MYSQL_PASSWORD=a1s2d3f4 -e MYSQL_DATABASE=instagram -d -p 3310:3306 --name mysql mysql

제가 시도한 것들은 다음과 같습니다.

실행 후 컨테이너 생성을 확인했고, docker exec -it mysql bash 명령어로 접속하여 password, username, database name 다 확인되어 정상적으로 로그인 확인 되었습니다. 사용한 명령어는 mysql -u project -p 그리고 root로도 로그인 해서 확인 완료했습니다.

혹시 몰라서 django databases의 host를 0.0.0.0 으로 바꿔서 실행하면 django.db.utils.OperationalError: (1045, "Access denied for user 'project'@'localhost' (using password: YES)") 와 같은 에러가 발생됩니다. 이외에도 127.0.0.1 로도 바꿔서 해봤지만 동일한 에러가 뜹니다. 동일하게 localhost를 나타내는 IP 주소라서 그런 것 같습니다.

그래서 docker inspect <container name> 을 사용해서 확인되는 IP 주소로 바꿔도 연결이 되지 않습니다.

django server 실행 명령어는 다음과 같습니다.
python manage.py runserver --settings=config.settings.production 0.0.0.0:8000

settings는 settings directory 안에 base.py, developement.py, deployment.py 로 3개를 나눠서 하고 있습니다.

docker compose로 django app도 container로 띄우면 잘 작동됩니다. 도커 안에서라 그런지 잘 되는 것 같은데, localhost와 container로 하면 연결이 안됩니다.

이번 강의를 들으면서 IP와 PORT 가 문제인 것 같은데 어떻게 시도를 하면 될지 잘 모르겠습니다.

도와주시면 감사하겠습니다

 

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

아래 명령으로 도커로 MySQL 컨테이너를 생성하셨고,

docker run -e MYSQL_ROOT_PASSWORD=a1s2d3f4 -e MYSQL_USER=project -e MYSQL_PASSWORD=a1s2d3f4 -e MYSQL_DATABASE=instagram -d -p 3310:3306 --name mysql mysql

아래 내역으로 계정정보를 입력하셨는데요.

image

  • HOST는 MySQL 서버의 주소를 지정하는 것인데, MySQL은 로컬 컴퓨터에서 3310 포트로 listen하고 있는 상황입니다. 그러니 HOST는 localhost로 지정하시는 것이 맞습니다. // dcker run 시에 --name 으로 지정한 부분은 도커 컨테이너의 이름일 뿐입니다.

  • PORT는 3310 로 지정하셔야 합니다. -p 3310:3306 옵션을 지정하셨으니, 컨테이너 내의 3306 포트를 외부로 3310 포트로 노출한다의 의미입니다.

  • 그외 USER, PASSWORD, NAME 설정은 맞는 듯 합니다.

 

장고에서 접속 테스트 하시기 전에, 별도의 DB 클라이언트 프로그램으로 접속 테스트를 해보시는 것도 좋습니다.
아래는 PyCharm Professional에서 접속 테스트를 한 스크린샷입니다.

image차근차근 살펴보시고, 댓글 남겨주세요.

화이팅입니다. :-)

김제하님의 프로필 이미지
김제하
질문자

말씀해주신대로 3310으로 바꾸꼬 local terminal에서 python manage.py runsever 를 실행하니 잘 작동되는 군요!!

 

그렇다면 port 흐름을 http 부터 생각해보자면

http 80(chrome 브라우저의 포트) -> 8000(django app의 port) -> 3310(로컬 호스트의 port) -> 3306(mysql의 port)

이와 같나요?


또한 질문드릴게 django container를 docker-compose 가 아닌 따로 Dockerfile로서 docker build로 image를 생성하여 실행할 때 DATABASES HOST는 docker inspect 로 확인한 Networks -> bridge -> Gateway 로 입력하니 작동되던데 이 때 HOST를 만약 127.0.0.1 로 하게 된다면 django app을 담고 있는 container 자신을 가리키게 되서 작동하지 않는 건가요?

 

이진석님의 프로필 이미지
이진석
지식공유자

장고 서버는 8000 포트로 띄우셨으니, 처음에는 80이 아니라 8000 포트 접속부터 시작합니다.

8000 포트로 http 요청 -> 장고에서 요청을 받고, MySQL 3310 포트로 접속 -> MySQL의 3306 포트로 접속됨.

그리고, 도커 컨테이너는 가상으로 생성된 별도의 네트워크에 존재합니다. 127.0.0.1 은 loopback 주소라고 합니다. 이는 네트워크 인터페이스로부터 나가지 않고 동일한 시스템(로컬 호스트) 내에서 통신하기 위해 사용되는 가상적인 네트워크 주소입니다.

그러니 127.0.0.1로의 접속을 요청하는 주체에 따라, 127.0.0.1이 가리키는 대상은 달라지게 됩니다.

김제하님의 프로필 이미지
김제하

작성한 질문수

질문하기