AWS EC2의 Ubuntu환경에서 Django 백앤드 서버를 Docker기반으로 배포해 보겠습니다.
지금 까지는 개발환경(runserver)에서 Docker를 통해 작동시켰다면 배포환경에서는 Gunicorn과 Nginx를 이용해야 한다.
Gunicorn
- WSGI (Web Server Gateway Interface) 서버로, Django와 같은 Python 웹 애플리케이션을 실행하는 역할.
- Django가 클라이언트 요청을 처리할 수 있도록 돕는다.
- 프로덕션 환경에서의 안정성 상승.
Nginx
- 도메인 라우팅을 관리(리버스 프록시).
- CSS, JS, 이미지와 같은 정적 파일을 빠르게 제공.
- 여러 Gunicorn 워커 프로세스 또는 서버에 요청을 분산.
- SSL/TLS 인증서를 통해 HTTPS를 지원하고, 클라이언트와 애플리케이션 간의 보안을 강화.
- DDoS 공격 방어, IP 제한 등 네트워크 트래픽 관리.
Gunicorn은 정적 파일(이미지, CSS, JS) 제공, SSL 인증 처리, 요청 분산과 같은 기능을 효과적으로 처리하지 못합니다. 이러한 이유로 Nginx를 통해 보완한다:
Gunicorn 적용
#dockerfile
...
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]
...
기존에 개발서버(runserver)로 작동하는 부분을 gunicorn으로 변경.
Nginx.conf 작성
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
배포 환경이라면 Demone 파일을 만들어 Nginx를 작동시켜줘야 한다.
하지만 우리는 Docker를 통해 배포를 진행 하고 있으므로 Docker-compose를 통해 작동시켜줘야 한다.
Docker-Compose
Docker-compose는 한 번에 다중 컨테이너를 작동시키 주는 역할을 한다. YAML 파일에 정의한 후, 단일 명령어로 애플리케이션의 컨테이너들을 생성, 시작, 중지할 수 있다. 이를 통해 복잡한 다중 컨테이너 애플리케이션을 간단하게 관리할 수 있다.
#dockeer-compose.yml
services:
backend:
container_name:projet_backend
build:
context: .
dockerfile: backend/dockerfile
volumes:
- ./backend/db.sqlite3:/app/db.sqlite3
- ./backend/secrets.json:/app/secrets.json
ports:
- "8000:8000"
restart: always
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
volumes:
- ./backend/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- backend
restart: always
디렉토리 구조
project/
├── backend/
│ └── dockerfile
│ └── nginx.conf
├── frontend/
└── docker-compose.yml
나는 backend서버만 배포를 해야 하기 때문에 docker-compose.yml파일에 backend 서버만 만들어 줬다.
volumes는 로컬 파일 시스템과 Docker 컨테이너 내부 파일 시스템을 연결하는 역할을 한다.
- 컨테이너를 중지하거나 재시작해도 데이터 손실 방지.
- 민감한 데이터(예: 환경 변수, 데이터베이스 파일)를 안전하게 관리.
docker-compose 실행하기
docker compose up -d
-d 옵션을 줘서 백그라운드에서 계속 작동시킨다. ( down 사용 시 컨테이너 정지 )
마무리
직접 실습을 통해 docker가 무엇인지 알아보고 어떻게 작동하는지 이해하는 좋은 기회였다. 다음에는 자동 배포와 테스트를 자동적으로 하는 방법에 관해 공부를 진행해 봐야겠다.
'Docker' 카테고리의 다른 글
Docker를 활용한 서버 배포 (3) : Dockerfile로 이미지 빌드 (0) | 2024.12.30 |
---|---|
Docker를 활용한 서버 배포 (2) : 이미지와 컨테이너 다루기 (1) | 2024.12.21 |
Docker를 활용한 서버 배포 (1) : Docker 이해 (1) | 2024.12.18 |