Django : Docker로 배포하기

Daehwi Kim·2021년 6월 3일
9
post-thumbnail

Why Docker?


팀프로젝트를 하면서 개발용 서버와 프론트와 통신하는 서버(EC2)를 분리하여 작업을 하였다.

EC2의 프리티어 용량을 8기가로 적게만들기도 했고, 통신도 많이하다보니 쉽게 로그파일이 많이 쌓였다. 또 내가 실수로 쌓여져 있는 로그파일들을 관리하려다가 EC2를 잘못 건드리기도 하여 EC2 삭제와 종료를 수없이 반복하였다.

EC2를 생성하여 가상화환경 세팅하고 Django를 설치하여 RDS 다시 연동하여 배포하는 이과정을 자동화해보고자 Docker를 이용한 배포를 해보겠다.

Docker 란?


인터넷에 도커를 치면 컨테이너 기반의 오픈소스 가상화 플랫폼이라고 나온다.(무슨말인지..)

한마디로 컨테이너 기반의 가상화 환경을 OS 위에 올려둔다는 의미이다. 그럼으로써 위의 과정(가상화 환경 세팅하고 Django 설치하고 설정값 세팅 등..)을 하나의 이미지로 만들어 EC2서버 위에서 컨테이너 기반의 가상화 서버를 두는 것이다.

이렇게 이미지를 이용하여 세팅된 가상화환경(컨테이너)을 원하는 서버에 올려둘 수 있어 편리한다.

도커의 자세한 설명

1. 로컬에서 도커 빌드

1. requirements.txt 만들기

  • 도커에 빌드할 Python 패키지들을 한번에 설치하기 위해서 requirements.txt로 만들자 - > 자세한 내용은 요기에서

  • 저 같은 경우에는 Djangogunicorn으로 배포했기 때문에 gunicorn도 추가하여 만들었다.

  • 참고로 나중에 도커 컨테이너를 빌드할때 Exited 에러가 나면 여기 Python 패키지들의 의존성 문제일 경우가 많으니 미리 requirements.txt에있는 패키지들로 runserver가 정상적으로 되는지 확인해보자.

2. Docker File 작성

도커파일이란?
도커 이미지를 생성하기 위한 DSL으로서 몇가지 명령어들 커스텀 이미지를 만들 수 있게 한다.

  1. 내 프로젝트 최상단 루트(manage.py 파일이 있는 곳)에서 Dockerfile 을 작성한다.
    • 여기서 Dockerfile의 확장자는 없다
    • 자세한 Dockerfile 의 명령어는 여기
# ./Dockerfile 
FROM python:3
WORKDIR /usr/src/app

## Install packages
COPY requirements.txt ./
RUN pip install -r requirements.txt

## Copy all src files
COPY . .

## Run the application on the port 8080
EXPOSE 8000

# gunicorn 배포 명령어
# CMD ["gunicorn", "--bind", "허용하는 IP:열어줄 포트", "project.wsgi:application"]
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "stock.wsgi:application"]

3. Docker Image 생성

docker build `옵션` `도커에가입한 계정`/`프로젝트명`:`버전` `경로`
>>> docker build -t kdh92417/stockproject:0.1.0 .
  • 참고로 .은 현재 경로를 나타낸다.

  • build 하기전에 미리 docker login 을 하고나서 진행

  • 이미지 생성 성공

4. 빌드한 이미지 실행시키기

docker run --name '컨테이너명' -d -p '호스트 포트':'컨테이너 포트'
docker run --name stock01 -d -p 8000:8000 kdh92417/stockproject:0.1.0

  • -d : 지속적으로 실행한다는 옵션
  • -p : 포트포워딩 한다는 옵션
  • 호스트 포트 : 내가 열어줄 포트의 번호
  • 컨테이너 포트 : Dockerfile 에 명시한 포트번호

정상적으로 컨테이너가 실행됐는지 확인

>>> docker ps -a

위의 사진처럼 STATUS에 Up면 정상적으로 컨테이너가 작동되고있다는 뜻이다.
만약 STATUS에 Exited가 뜬다면 잘못 빌드한 것이다. Dockerfile의 명령어와 requirements.txt의 의존성을 다시한번 확인하길 바란다.

5. 도커이미지를 도커허브에 푸시하기(git push랑 비슷)

이제 로컬에서 빌드한 이미지를 정상적으로 컨테이너를 실행시켜 봤으니, EC2 에서 이미지를 받기위해 도커허브라는 곳에 이미지를 푸시 해보겠다. (Github 레파지토리에 푸시하는 거랑 비슷)

Github에 푸시하는 것과 똑같이 명령어만 docker로 변경하고 입력하면 된다.

>>> docker push '이미지명'

2. EC2에서 도커로 배포

이제 도커허브에 이미지를 푸시했으니, EC2에서 도커이미지를 받아서 배포를 해보겠다.

1. EC2내에서 docker를 설치한다.

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" 
sudo apt update 
apt-cache policy docker-ce
sudo apt install docker-ce

2. Docker 로그인을 한다.

참고로 저는 우분투로 EC2를 생성했기 때문에 sudo 로 root 권한으로 명령어를 쳐야 에러가 나지 않는다.

sudo docker login

3. 도커 이미지 Pull하기

도커허브 레파지토리에 푸시한 이미지를 pull 하여 이미지를 생성한다.

sudo docker pull kdh92417/stockproject:0.1.0

4. 도커 이미지 실행시키기

sudo docker run --name '컨테이너명' -d -p 8000:8000 kdh92417/stockproject:0.1.0

실행시킨 뒤 컨테이너가 잘 실행되어있는지 까지 확인해보자

sudo docker ps -a

정상적으로 잘 실행되어졌다.

이로써 수동으로 EC2 내에서 가상화환경을 설치하고 세팅하는 것을 도커를 이용하여 배포함으로써 반 자동화 시켰다.


로컬에서 도커이미지 생성 후 EC2 배포과정

profile
게으른 개발자

1개의 댓글

comment-user-thumbnail
2021년 11월 22일

보다가 궁금한 부분이 있어 댓글 남깁니다.
migrate 작업은 언제 진행하시는 건가요? 게시글은 잘 봤습니다 :D

답글 달기