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 |
---|
댓글