본문 바로가기
study/django

Django, Nginx, Gunicorn을 활용한 Docker(Docker Compose) 배포

by eunoia_DB 2024. 12. 13.

 

Docker를 통해 Django 프로젝트를 배포하는 과정을 정리했다.
Nginx와 WSGI로 Gunicorn을 사용했으며 로컬 환경에서 아주 간단하게 진행했다.

 

 

1. Django 프로젝트 생성 및 초기 작업

 

1) 프로젝트 생성

django-admin startproject djangoapp

 

생성한 프로젝트 가상환경 생성 후 활성화

python3 -m venv venv

source venv/bin/activate

 

2) Django, Gunicorn 설치

pip install django

pip install gunicorn

 

3) Static 파일 설정

settings.py에서 STATIC_ROOT를 추가하여 정적 파일 관리

실제 정적 파일을 관리할 폴더를 생성하여 해당 경로를 작성한다.

STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),  # 정적 파일 디렉토리 위치를 추가
]

 

static 파일 수집

아래 명령어를 실행하면 Django가 해당 파일들을 프로젝트의 STATIC_ROOT 경로로 수집한다.

이 경로는 보통 프로젝트의 루트 디렉터리에 생성되며, Nginx와 같은 웹 서버가 파일을 처리할 수 있도록 한다.

python3 manage.py collectstatic

 

4) requirements.txt 생성

프로젝트 내 설치된 패키지와 버전 정보를 파일로 생성한다.

pip freeze > requirements.txt

 

 

2. Dockefile 작성

EXPOSE와 CMD는 docker-compose.yml에 작성하여 관리했다.

FROM python:3.13.0

# 프로젝트 디렉토리 생성 및 이동
WORKDIR /app

# 필요한 패키지 설치
RUN pip install --upgrade pip
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# 코드 복사
COPY . /app/

 

 

3. Docker-compose.yml 작성

Dockerfile과 같은 위치에 Docker-compose 설정 yml 파일 작성

테스트로 배포할 서비스인 web, nginx 두 가지 설정 정보를 작성했다.

version: '3.8'

services:
  web:
    build: .
    volumes:
      - ./static:/app/static  # 정적 파일을 공유할 디렉토리
    expose:
      - "8000"
    ports:
      - "8000:8000"  # 컨테이너와 호스트 포트 매핑
    command: [ "gunicorn", "--bind", "0.0.0.0:8000", "djangoapp.wsgi:application" ]

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"  # 호스트 포트와 Nginx 컨테이너 포트 매핑
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf  # Nginx 설정 파일 마운트
      - ./static:/app/static  # 정적 파일을 공유할 디렉토리

 

 

4.nginx.conf 작성

config라는 별도의 설정 파일 관리 디렉터리를 만들어 작성했다.

위의 Docker-compose.yml을 보면 nginx volumes에 자신의 nginx.conf 파일 경로를 작성해 마운트 시켜주면 된다.

Docker Network를 설정하지 않았기 때문에 proxy location 설정 정보는 제외했다.

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name localhost;

        location /static {
            alias /staticfiles/;
        }
    }
}

 

 

5. Docker Compose 실행

docker-compose up --build

 

실행 후 결과

 

테스트 환경이기 때문에 settings.py에 아래와 같이 설정해 두었다.

ALLOWED_HOSTS = ['0.0.0.0', 'localhost']

 

http://0.0.0.0:8000 페이지 접속 시

 

 

컨테이너 조회 시 정상적으로 실행되어 있는 것을 볼 수 있다.

 

만약 컨테이너가 실행되자마자 Exited 되는 경우 해당 컨테이너를 조회하여 로그를 통해 해결할 수 있다.

docker ps -a

docker logs 'Container ID'

'study > django' 카테고리의 다른 글

DRF(Django REST Framework) - APIView  (0) 2024.12.22

댓글