• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

django와 mysql container 연결하기

23.06.29 16:15 작성 조회수 859

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차근차근 살펴보시고, 댓글 남겨주세요.

화이팅입니다. :-)

김제하님의 프로필

김제하

질문자

2023.06.30

말씀해주신대로 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이 가리키는 대상은 달라지게 됩니다.