티스토리 뷰

728x90
반응형

Docker를 이용해 동일한 환경에서 Django 프로젝트를 실습하고자 하는 경우, Docker Compose를 사용하면 쉽게 개발, 테스트, 배포 환경을 구성할 수 있다.

PyCharm을 이용해 Django 프로젝트를 Docker Compose로 설정하는 방법을 단계별로 살펴보자.

1. Docker Desktop 설치

2. 프로젝트 생성

  • 먼저 도커에서 실행할 Django 프로젝트 디렉토리가 필요하다.
  • 빈 디렉토리거나 기존에 작업 중인 프로젝트여도 상관없다.
  • 여기서는 djangoProject라는 빈 디렉토리를 사용하려고 한다.

2. Docker Compose를 실행하기 위한 파일 생성

  • requirements.txt
  • Dockerfile
  • docker-compose.yaml

파일 생성 완료 모습

1) requirements.txt

  • requirements.txt 파일에 프로젝트에 필요한 패키지를 명시한다.
  • Django 프로젝트를 구성할 때는 기본적으로 Django 패키지를 추가한다.
Django>=4.0,<5.0

2) Dockerfile

  • Dockerfile은 Docker 컨테이너 이미지가 빌드(build)될 때 거치는 단계들을 정의한 파일이다.
  • 이 파일을 통해 Django 프로젝트 환경을 설정할 수 있다.
# 1. python 3.11 버전을 사용한 기본 이미지
FROM python:3.11

# 2. 환경 변수 설정: Python 출력 버퍼링을 비활성화
ENV PYTHONUNBUFFERED 1

# 3. 작업 디렉토리 설정
WORKDIR /app

# 4. 의존성 파일을 복사하고 설치
COPY requirements.txt .
RUN pip install --upgrade pip && \
    pip install -r requirements.txt

# 현재 디렉토리의 모든 프로젝트 파일을 이미지 내의 작업 디렉토리로 복사
COPY . .

# 8000번 포트 개방
EXPOSE 8000
  • 모든 프로젝트 파일을 복사하기 전, 의존성 파일을 개별적으로 복사하고 설치하는 이유는 의존성이 변경되지 않는 한 이 단계까지의 캐시를 활용하여 더 빠르게 빌드할 수 있기 때문이다.

3) docker-compose.yaml

  • docker-compose.yaml 파일을 통해 여러 서비스를 하나의 파일로 정의할 수 있다.
  • 여기서는 Django 애플리케이션과 MySQL 데이터베이스를 구성한다.
services:
  # Django 애플리케이션 서비스의 이름
  app:
    # 현재 디렉토리에 있는 Dockerfile을 기반으로 이미지 빌드 즉, 빌드할 Dockerfile이 있는 위치를 알려줌
    build: .
    # 컨테이너가 시작될 때 실행할 명령어를 설정
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000" 
    # 로컬 디렉토리를 컨테이너 내의 /app 디렉토리로 마운트
    volumes:
      - .:/app
    # 호스트의 8000번 포트를 컨테이너의 8000번 포트와 연결
    ports:
      - "8000:8000"
    # 아래에 정의된 db 서비스가 시작된 후 이 서비스를 시작
    depends_on:
      - db

  # MySQL 서비스의 이름
  db:
    # MySQL 8.0 이미지를 사용해 컨테이너 생성
    image: mysql:8.0
    # 컨테이너가 종료되면 자동으로 재시작하도록 설정
    restart: always
    # 데이터베이스 환경 변수 설정
    environment:
      MYSQL_ROOT_PASSWORD: rootpw
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypw
    # 포트 연결
    ports:
      - "3306:3306"
  • Note: Django는 기본적으로 SQLite를 사용한다. 하지만 이 예시에는 MySQL을 사용해 데이터베이스를 설정했으며, 이처럼 별도의 데이터베이스가 필요한 경우 db 서비스 구성을 조정하여 다른 데이터베이스 시스템도 사용할 수 있다.
  • 종료시 데이터 손실을 방지하려면 db 서비스에 volumes를 설정해주어야 한다.
services:
  db:
    ...
    volumes:
      - db_data:/var/lib/mysql  # MySQL 데이터가 저장될 볼륨 설정

volumes:
  db_data:  # MySQL 데이터를 저장할 외부 볼륨

3. 이미지 빌드

  • Docker Compose 파일에 정의된 서비스 이미지를 빌드한다.
docker-compose build

4. Django 프로젝트 생성

  • Docker Compose를 사용해 컨테이너를 실행하고 Django 프로젝트를 생성한다.
  • 아래 명령어의 결과로 app 폴더 안에 Django 프로젝트 디렉토리(app, manage.py, db.sqlite3)를 생성한다.
docker-compose run --rm <서비스명> django-admin startproject <프로젝트 폴더명> <프로젝트 생성위치>
docker-compose run --rm app django-admin startproject config .
  • 위 명령어는 docker-compose.yml 파일에 정의된 app 서비스의 새로운 컨테이너를 생성하고,
  • 현재 디렉터리(.)에 config라는 폴더를 생성하여 Django 프로젝트의 기본 파일 구조를 설정한 뒤,
  • 작업이 완료된 후 컨테이너를 자동으로 제거하겠다는 의미이다.
  • --rm 옵션은 명령어 실행이 완료되었을 때, 컨테이너를 자동으로 삭제하는 옵션이다.
    불필요한 컨테이너가 시스템에 남지 않기에 클린한 환경을 유지할 수 있다.

5. Docker 컨테이너 실행 및 Django 확인

  • Django 프로젝트를 Docker 컨테이너로 실행한다.
docker-compose up
  • -d 옵션을 통해 백그라운드 실행을 할 수 있다.
  • --remove-orphans 옵션을 사용해 더이상 사용되지 않는 컨테이너를 정리할 수 있다. 

6. 브라우저에서 Django 확인

  • 브라우저에서 http://localhost:8000으로 접속하면 Django 프로젝트가 실행 중인 것을 확인할 수 있다.

728x90
반응형
댓글