티스토리 뷰

서론

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명령어를 통해 이미지들을 컨테이너로 적재합니다. 잘 수행되었다면 아래와 같이 종료되는 컨테이너 없이 정상적으로 작동하는 것을 확인할 수 있습니다.

결론

인터넷에 나와 있는 것들과 환경이나 기타 여러 사항들이 다른 점이 많아서 로컬라이징 하는 과정에서 많은 어려움이 있었습니다. 그래도 도커 컨테이너 사이의 네트워크나 볼륨과 같은 공유자원에 대한 이해를 높일 수 있어서 제법 좋았던 경험이었습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함