Computer Science/Troubleshooting

[MySQL, Django, Docker compose] MySQL ERROR 2002

_혀니 2022. 8. 30. 20:25
728x90
반응형

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

 

이전 글과 같은 에러지만, 이번에는 장고 서버의 오류기 때문에 따로 글을 작성했다.

 

그래서 이 에러는 왜 나는 것이냐, 거두절미하고 원인부터 말하자면,

docker-compose 관계에서 데이터베이스의 host는 데이터베이스 컨테이너 이름이어야 한다!

그동안 host는 당연히 localhost를 써왔으니까.. 하하 당연히 localhost라고 생각했는데, db는 이제 db라는 컨테이너에서 따로 돌아가고 있기 때문에 host를 바꾸어야 하는 것이었다.

 

 

docker-compose.yml

db:
    image: mysql:8.0.22
    container_name: my01
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
    ports:
      - "3306:3306"
    volumes:
      - ./db/:/docker-entrypoint-initdb.d/
    environment: 
      MYSQL_ROOT_PASSWORD: "8de"
      MYSQL_DB: "8dedb"
    platform: linux/x86_64
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      interval: 1m30s
      timeout: 30s
      retries: 10
      start_period: 30s

server:
    build: 
      context: ./server
      dockerfile: ./Dockerfile
    container_name: dg01
    working_dir: /server
    command: sh entrypoint.sh
    volumes:
      - ./server/:/server
    expose:
      - "8000"
    depends_on:
      db:
        condition: service_healthy

전체 코드는 아니고, 참고를 위해 데이터베이스와 백엔드 서버 부분만 가져왔다.

데이터베이스 컨테이너는 db, 백엔드 서버 컨테이너는 server이다.

 

데이터베이스 컨테이너 이름이 db이다. 따라서 이걸 settings.py에서 어떻게 적용하냐면,

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdb',
        'USER': 'root',
        'PASSWORD': '1234',
        'HOST': 'db', # 로컬 개발환경에서는 'localhost'
        'PORT': '3306',
    }
}

Django의 setting.py에서 DATABASES 부분을 찾는다.

기본 sqlite에서 MySQL로 바꾸는 작업을 완료했다면 이러한 형식을 갖고 있을 것이고, 없으면 이 코드로 대체하면 된다.

단 NAME은 데이터베이스 이름이고 HOST가 이제 우리가 바꿔야 할 부분이다.

그동안 로컬에서 개발했을 터, 대부분은 localhost로 호스트명을 설정해둔다.

우리는 이것을 위와 같이 데이터베이스 컨테이너명으로 바꾸어야 한다.

 

이제 docker-compose --build로 다시 빌드하면 잘 실행될 것이다!

728x90
반응형