[MySQL, Django, Docker compose] MySQL ERROR 2002
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로 다시 빌드하면 잘 실행될 것이다!