ㅁㄴㅇㄻㄴㅇㄹ

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 'db' (115)")

hanbin8269 2021. 5. 31. 19:11

docker-compose로 개발환경을 구축하기 위해 아래와 같이 docker-compose.dev.yml 파일을 작성했었다.

version: "2"

services:
  db:
    image: mysql:5.7.34
    container_name: dorandoran_db

    ports:
      - "7001:3306"
    environment:
      - MYSQL_DATABASE=dorandoran_dev_db
      - MYSQL_USER=devuser
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=password
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  web:
    build:
      context: .
      dockerfile: ./compose/develop/Dockerfile-dev
    volumes:
      - ./:/app/
    command:
      - bash
      - -c
      - |
        python dorandoran/manage.py migrate
        python dorandoran/manage.py runserver 0.0.0.0:8000
    container_name: dorandoran_web
    env_file:
      - dev.env
    depends_on:
      db:
        condition: service_healthy
    restart: always
    ports:
      - "8000:8000"

분명 webdb에 의존하고 있음을 명시하고 healthcheck까지 붙여줬는데 왜 안되는지 이해가 안됐다.

문제는 dev.env 파일에 있었다.

DJANGO_DB_HOST=db
DJANGO_DB_PORT=7001  # 이곳
DJANGO_DB_NAME=dorandoran_dev_db
DJANGO_DB_USERNAME=root
DJANGO_DB_PASSWORD=password

web 컨테이너가 db 컨테이너에 접근 할 때의 포트를 외부 포트(7001)로 지정해 줬던 것이다.
내부 포트인 3306으로 바꾸니 제대로 동작하였다.

DJANGO_DB_HOST=db
DJANGO_DB_PORT=3306  # 잘 된다!
DJANGO_DB_NAME=dorandoran_dev_db
DJANGO_DB_USERNAME=root
DJANGO_DB_PASSWORD=password