본문 바로가기
Python

Django Docker 이용해서 배포하기

by Zih0 2021. 8. 8.

프로젝트가 아직 진행중이지만 API문서를 공유하기 위해 Swagger를 활용했습니다. 

API문서를 띄우기 위해 일단 배포를 해야 했습니다.

 

이전까지는 배포할 때, git clone으로 서버에 프로젝트를 저장하고 api 업데이트 시 git pull을 수동으로 하는 방식으로 진행했습니다.

하지만 이번엔 프로젝트 초기부터 배포를 진행하는 상황이라 위와 같은 경우는 비효율적으로 느껴져 도커를 사용해보기로 했습니다.

 

Github Actions를 활용해 deploy라는 브랜치가 push되면 도커 이미지를 빌드하고 배포하도록 했습니다.

 

우선 deploy라는 브랜치를 만들고, requirements.txt 파일을 생성했습니다.

$ pip freeze > requirements.txt

그리고 requirements.txt에 수동으로 gunicorn을 기입해주었습니다.

gunicorn==20.1.0

 

다음으로는 Dockerfile을 생성했습니다.

FROM python:3.8
ENV PYTHONUNBUFFERED=1
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN apt-get update \
  && apt-get install -y \
  python3 python3-pip python3-dev python3-venv build-essential libpq-dev \
  && rm -rf /var/lib/apt/lists/*
RUN pip install -r requirements.txt
RUN chmod +x /app/run.sh
EXPOSE 8000

ENTRYPOINT ["/app/run.sh"]

도커 컨테이너에 파이썬과 패키지들을 설치하고, run.sh파일을 실행시킵니다.

 

run.sh는 아래와 같이 작성했습니다.

#!/bin/bash

rm ./server/migrations/0001_initial.py

python manage.py makemigrations

python manage.py migrate

python manage.py collectstatic

gunicorn config.wsgi -b 0.0.0.0:8000

migrations 파일쪽에서 에러가 발생해서 해당 파일을 삭제하고 다시 마이그레이션 후, 서버를 실행시키도록 하는 shell을 작성했습니다.

 

 

그리고 이제 빌드를 해주고 이미지를 push 하겠습니다.

$ docker build -t DOCKER_USERNAME/IMAGE_NAME

$ docker login -u DOCKER_USERNAME -p DOCKER_PASSWORD

$ docker push DOCKER_USERNAME/IMAGE_NAME

 

 

이제 GCE(Google Compute Engine)에 접속해서 docker-compose 를 설치해주었습니다.

설치법은 아래 블로그를 참고했습니다.

ref: https://psychoria.tistory.com/651

 

.env 파일을 생성해 프로젝트에서 사용했던 그대로 환경변수를 설정해주었습니다.

그리고 docker-compose.yml 파일을 생성했습니다.

version: "3.8"
services:
  web:
    env_file:
      - .env
    image: DOCKER_USERNAME/IMAGE_NAME
    ports:
      - 8000:8000

 

그리고 이제 도커가 잘 실행되는지 테스트해보고, -d 옵션을 추가해 백그라운드에서 돌아가게 했습니다.

$ sudo docker-compose up

 

 

마지막으로 Github Actions를 활용해 자동으로 도커 이미지를 배포하는 방법입니다.

Github Actions에 들어가서 new workflow를 클릭합니다.

 

그리고 set up a workflow youreself를 클릭합니다.

그리고 아래와 같이 작성했습니다.

name: Docker Publish

on:
  push:
    branches:
      - deploy

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Docker build
        run: docker build -t ${{ secrets.DOCKER_USERNAME }}/image-name .

      - name: Docker Login
        run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}

      - name: Docker Push
        run: docker push ${{ secrets.DOCKER_USERNAME }}/image-name

github에 해당 파일이 저장되기 때문에 민감한 정보는 github secret에 입력해서 위와 같이 사용했습니다.

 

secrets는 github settings > secrets 에서 설정 가능합니다.

New repository secret 을 클릭해서 생성하면 됩니다.

 

그러면 이제 deploy에가 push될 때마다 수정한 코드를 자동으로 빌드해서 도커에 배포하게 됩니다.!

 

 

댓글