Computer Science/Troubleshooting

[Django, Docker] django.db.utils.operationalerror (2002 can't connect to mysql server on 'db' (115) )

_혀니 2022. 9. 26. 15:10
728x90
반응형

django.db.utils.operationalerror (2002 can't connect to mysql server on 'db' (115) )

Django db utils OperationalError 2002 Can 't connect to MySQL server on 'localhost' (10061)

django.db.utils.operationalerror: (2005, "unknown mysql server host 'db' (-2)")

 

이러한 에러를 보신건가요,

원인은 여러가지가 있으나 이번 포스트에서는 Docker의 특징으로 인해 발생한 경우에 대해 설명하고, 해결법을 알려드리려고 합니다.

 

원인

저는 이 에러를 장고 마이그레이션을 하는 부분에서 마주쳤습니다. 여러 이유가 있었지만, 이번의 이유는 도커의 특징 때문이었습니다.

장고의 migration과 같은 데이터베이스 활용 명령어는 Dockerfile이 아니라 docker-compose에서 command로 실행시켜야 순서에 맞게 실행합니다.

 

docker-compose.yml

  server:
    build: 
      context: ./server
      dockerfile: ./Dockerfile #도커파일 이용해서 빌드
    container_name: dg01
    working_dir: /server
    command: bash -c "
        python3 manage.py makemigrations account &&
        python3 manage.py makemigrations playlist &&
        python3 manage.py makemigrations model &&
        python3 manage.py migrate &&
        gunicorn --bind 0.0.0.0:8000 server.wsgi:application -t 240"
    volumes:
      - ./server/:/server
    expose:
      - "8000"
    depends_on:
      db:
        condition: service_healthy

docker-compose의 장고 서버 부분입니다.

 

docker-compose를보면 build가 있고 command가 있습니다.

그리고 build를 하는 과정에서 Dockerfile을 실행합니다.

하지만 마이그레이션 작업은 MySQL 컨테이너가 실행되고 있어야 가능한 작업이지요.

 

Docker는 모든 컨테이너를 빌드한 뒤, 순서대로 컨테이너를 실행합니다.

따라서 빌드 과정에서 실행되는 Dockerfile에 마이그레이션 명령어를 넣으면, 장고 내부 에러 메시지로 MySQL ERROR 2002같은 것이 발생하게 됩니다. 데이터베이스에 접속할 수 없다는 명령어입니다.

 

그러나 docker-compose의 command는 컨테이너를 실행하는 동안 수행하는 명령어입니다.

따라서 healthcheck를 정상적으로 완료한 뒤 MySQL 컨테이너가 잘 돌아가고 있으면, 마이그레이션 명령어가 문제 없이 실행됩니다.

해결 방법

위에 올린 docker-compose.yml 과 같이 빌드 과정에서 실행할 수 있는 명령어는 Dockerfile에, 다른 컨테이너와의 연결이 필요한 마이그레이션 명령어부터는 command에 배치합니다.

 

 

다른 문제 원인들

저는 동일한 에러를 여러 가지 이유로 겪었습니다. 이런 방법으로 다른 부분의 문제를 고쳤습니다.

 

- MySQL 컨테이너의 실행 순서 문제

https://yourhyeony.tistory.com/54

 

[MySQL, Docker] MySQL ERROR 2002/2003/2005

며칠간 삽질했다... 나는 백엔드로 Django를 사용하고, 데이터베이스로 MySQL을 사용하는 프로젝트를 하고 있었기 때문에 docker-compose를 이용해서 MySQL 컨테이너를 만들어야 했다. 그러나! docker-compose

yourhyeony.tistory.com

 

- Django 내 데이터베이스의 host 설정 문제

https://yourhyeony.tistory.com/55

 

[MySQL, Django, Docker compose] MySQL ERROR 2002

Django db utils OperationalError 2002 Can 't connect to MySQL server on 'localhost' (10061) 이전 글과 같은 에러지만, 이번에는 장고 서버의 오류기 때문에 따로 글을 작성했다. 그래서 이 에..

yourhyeony.tistory.com

 

728x90
반응형