팀프로젝트를 하면서 개발용 서버와 프론트와 통신하는 서버(EC2)를 분리하여 작업을 하였다.
EC2의 프리티어 용량을 8기가로 적게만들기도 했고, 통신도 많이하다보니 쉽게 로그파일이 많이 쌓였다. 또 내가 실수로 쌓여져 있는 로그파일들을 관리하려다가 EC2를 잘못 건드리기도 하여 EC2 삭제와 종료를 수없이 반복하였다.
EC2를 생성하여 가상화환경 세팅하고 Django를 설치하여 RDS 다시 연동하여 배포하는 이과정을 자동화해보고자 Docker를 이용한 배포를 해보겠다.
인터넷에 도커를 치면 컨테이너 기반의 오픈소스 가상화 플랫폼이라고 나온다.(무슨말인지..)
한마디로 컨테이너 기반의 가상화 환경을 OS 위에 올려둔다는 의미이다. 그럼으로써 위의 과정(가상화 환경 세팅하고 Django 설치하고 설정값 세팅 등..)을 하나의 이미지로 만들어 EC2서버 위에서 컨테이너 기반의 가상화 서버를 두는 것이다.
이렇게 이미지를 이용하여 세팅된 가상화환경(컨테이너)을 원하는 서버에 올려둘 수 있어 편리한다.
도커에 빌드할 Python 패키지들을 한번에 설치하기 위해서 requirements.txt로 만들자 - > 자세한 내용은 요기에서
저 같은 경우에는 Django
를 gunicorn
으로 배포했기 때문에 gunicorn도 추가하여 만들었다.
참고로 나중에 도커 컨테이너를 빌드할때 Exited
에러가 나면 여기 Python 패키지들의 의존성 문제일 경우가 많으니 미리 requirements.txt에있는 패키지들로 runserver가 정상적으로 되는지 확인해보자.
도커파일이란?
도커 이미지를 생성하기 위한 DSL으로서 몇가지 명령어들 커스텀 이미지를 만들 수 있게 한다.
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"]
docker build `옵션` `도커에가입한 계정`/`프로젝트명`:`버전` `경로`
>>> docker build -t kdh92417/stockproject:0.1.0 .
참고로 .
은 현재 경로를 나타낸다.
build 하기전에 미리 docker login
을 하고나서 진행
이미지 생성 성공
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의 의존성을 다시한번 확인하길 바란다.
이제 로컬에서 빌드한 이미지를 정상적으로 컨테이너를 실행시켜 봤으니, EC2
에서 이미지를 받기위해 도커허브라는 곳에 이미지를 푸시 해보겠다. (Github 레파지토리에 푸시하는 거랑 비슷)
Github에 푸시하는 것과 똑같이 명령어만 docker로 변경하고 입력하면 된다.
>>> docker push '이미지명'
이제 도커허브에 이미지를 푸시했으니, EC2에서 도커이미지를 받아서 배포를 해보겠다.
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
참고로 저는 우분투로 EC2를 생성했기 때문에 sudo
로 root 권한으로 명령어를 쳐야 에러가 나지 않는다.
sudo docker login
도커허브 레파지토리에 푸시한 이미지를 pull
하여 이미지를 생성한다.
sudo docker pull kdh92417/stockproject:0.1.0
sudo docker run --name '컨테이너명' -d -p 8000:8000 kdh92417/stockproject:0.1.0
실행시킨 뒤 컨테이너가 잘 실행되어있는지 까지 확인해보자
sudo docker ps -a
정상적으로 잘 실행되어졌다.
이로써 수동으로 EC2 내에서 가상화환경을 설치하고 세팅하는 것을 도커를 이용하여 배포함으로써 반 자동화 시켰다.
보다가 궁금한 부분이 있어 댓글 남깁니다.
migrate 작업은 언제 진행하시는 건가요? 게시글은 잘 봤습니다 :D