티스토리 뷰
서론
Docker 컨테이너로 Django와 MySQL 혹은 MariaDB 를 올려서 연결하는 방법을 소개합니다.
본론
docker-compose.yaml
DB Image
version: "3.7"
services:
apop:
...
db:
# 이미지 이름과 버전을 명시
image: mariadb:11.1.3
# 꺼져도 다시 시작
restart: always
# 컨테이너 이름 -> settings.py에서도 사용
container_name: mariadb
# 마운트 이름 지정, docker desktop을 사용한다면 Volumnes에 해당 이름으로 저장
volumes:
- mariadb-data:/var/lib/mysql
# 네트워크 이름
networks
- network1
ports:
- "3306:3306"
# mariaDB 설정들, 만약 mysql을 사용한다면 MARIADB 부분만 MYSQL로 변경
environment:
MARIADB_DATABASE : apopdb
MARIADB_USER: example-user
MARIADB_PASSWORD: example-password
MARIADB_ROOT_PASSWORD: password
networks:
network1:
volumes:
mariadb-data:
docker compose 에서 DB Image는 위와 같이 작성할 수 있습니다. 지금은 MariaDB를 기준으로 작성하였으나 MySQL 또한 유사하게 사용할 수 있습니다. 만약 프로젝트에서 MySQL을 사용한다면 environment와 image만 적당히 수정하면 정상적으로 작동합니다.
Django Server Image
version: "3.7"
services:
# 서비스 이름(프로젝트 이름이 apop이라 apop으로 사용)
apop:
build:
context: .
dockerfile: Dockerfile
container_name: apop
networks:
- network
volumes:
- ./static:/djangoproject/static
# 컨테이너로 적재된 후 migrate를 진행
command: >
bash -c "
python3 manage.py migrate&&
gunicorn apop2.wsgi -b 0.0.0.0:8000"
ports:
- "8000:8000"
expose:
- "8000"
# migrate가 db 이미지가 적재된 후 진행되어야 함
# 따라서 depends_on에서 이미지 적재 순서 처리
depends_on:
- db
db:
...
networks:
network1:
volumes:
mariadb-data:
Django Server의 경우 위와 같이 작성할 수 있습니다. Django와 Nginx를 이용한 배포는 이전 포스팅을 참고하시면 좋을 것 같습니다.
DB가 만들어진 후 서버가 시작되어야 migrate가 정상적으로 수행될 수 있기 때문에 depends_on에 db가 존재한다는 것을 알 수 있습니다.
settings.py
docker compose를 통해 DB에 대한 설정을 마쳤으니 Django에도 이를 전달해 주어야 합니다. 설정 파일을 전달하는 방법도 있지만, 이번 포스팅에서는 settings.py의 DATABASES를 수정하는 방법을 소개합니다.
# settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "apopdb",
"USER": "example-user",
"PASSWORD": "example-password",
"HOST": "mariadb",
"PORT": "3306"
},
}
ENGINE
은 "django.db.backends.mysql"로 설정합니다. MySQL과 MariaDB 모두 같은 mysqlclient를 사용하기 때문에 걱정하지 않으셔도 됩니다.NAME
은 사용할 데이터베이스의 이름입니다. docker compose 에서 설정한 MARIADB_DATABASE 의 값을 적어주시면 됩니다.USER
는 DB에 접근할 유저이름입니다. MARIADB_USER의 값을 적어주시면 됩니다.PASSWORD
는 DB에 접근하는 유저의 비밀번호입니다. MARIADB_PASSWORD의 값을 적어주시면 됩니다.HOST
는 docker compose에서 설정한 db 서비스의 container_name 을 적어주시면 됩니다.
삽질 방지 1.
mysqlclient의 경우 공식문서에도 나와있지만 설치가 안될 경우 선행작업이 필요합니다.
https://pypi.org/project/mysqlclient/ 에서 제시하는 대로 OS별로 선행작업을 수행하면 됩니다.
삽질 방지 2.
settings.py에서 USER를 root로 하면 Connection Error를 맛볼 수 있습니다.
삽질 방지 3.
만약 Access Denine 오류가 발생한다면 오타를 확인해보시고 오타가 없다면 HOST를 0.0.0.0으로 변경해보세요.
실행 화면
모든 준비가 끝났다면 docker-compose.yaml 파일이 있는 디렉토리에서 docker compose up --build -d
명령어를 통해 이미지들을 컨테이너로 적재합니다. 잘 수행되었다면 아래와 같이 종료되는 컨테이너 없이 정상적으로 작동하는 것을 확인할 수 있습니다.
결론
인터넷에 나와 있는 것들과 환경이나 기타 여러 사항들이 다른 점이 많아서 로컬라이징 하는 과정에서 많은 어려움이 있었습니다. 그래도 도커 컨테이너 사이의 네트워크나 볼륨과 같은 공유자원에 대한 이해를 높일 수 있어서 제법 좋았던 경험이었습니다.
'개발자 > 파이썬(Python)' 카테고리의 다른 글
[Django] 조건부 CBV 만들기 (0) | 2024.01.19 |
---|---|
[Django] Docker 컨테이너에서 createsuperuser 사용 (0) | 2024.01.17 |
[Django] Docker로 Django 배포하기 (0) | 2024.01.15 |
[Django] static 파일 사용 (0) | 2024.01.15 |
[Django] CSV 파일 전송 뷰 만들기 (1) | 2024.01.03 |