본문 바로가기
Docker

Docker를 활용한 서버 배포 (4) : Docker-Compose로 Django 배포하기

by Byeong 2024. 12. 31.

 

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가 무엇인지 알아보고 어떻게 작동하는지 이해하는 좋은 기회였다. 다음에는 자동 배포와 테스트를 자동적으로 하는 방법에 관해 공부를 진행해 봐야겠다.