프로젝트 한 것을 도커로 배포해보았다.
재밌다..
먼저, 로컬에서 할 일과 서버에서 할 일로 나누어보았다.
서버 Amazon EC2를 사용했다. DB는 RDS를 사용했다.
도커, EC2, RDS 콜라보,,
먼저 로컬에서,
➀도커 설치
➁도커 파일 만들기
➂이미지 빌드
➃도커허브 로그인
➄도커 푸시
다음은 EC2에서,
➀도커 설치
➁도커 로그인
➂이미지 풀받기
https://docker.com 사이트에 접속해서 회원 가입을 한다.
https://docker.com 에 접속해서 Get Started
버튼을 누르면 나오는
아래의 페이지에서 도커 데스크탑 프로그램을 다운로드 받고 설치한다.
우분투는 아래의 명령어들로 설치한다.
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 우분투에서도 사용된다.
터미널에서 docker
를 쳐서 명령어들이 좌르르륵 나온다면 설치가 잘 된거다.
git clone으로 프로젝트를 받는다.
내 프로젝트 : https://github.com/hyeyoonc/17-1st-TEAMCOOP-backend.git
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql',
'NAME' : 'RDS DB명',
'USER' : 'root',
'PASSWORD': 'RDS DB 비밀번호',
'HOST' : 'RDS 주소',
'PORT' : '3306',
'OPTIONS' : {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" # 이 OPTIONS는 추가해줘야한다!
},
}
}
SECRET_KEY = '비밀이다' #secret_key는 dictionary형태 말고 그냥 값으로!!
도커 이미지 내에 gunicorn이 설치되어있어야한다.
나는 gunicorn 설치를 하지않아서 쬐깐 헤맸다 헤헤^^
pip install gunicorn
하고 requirements.txt에 넣어준다.
pip freeze > requirements.txt
pip install -r requirements.txt
마지막으로 확인차 install 해준다!
본격적으로 도커 빌드 시작!💫
도커파일이란, 이미지를 만들때 참고하는 명령의 목록을 기록해놓는 파일로 설계도의 역할을 한다.
프로젝트 최상위 디렉토리에 Dockerfile
을 만들어준다.
#./Dockerfile
FROM python:3
#기반이 될 이미지
# 작업디렉토리(default)설정
WORKDIR /usr/src/app #내가 작업할 공간 , 위의 python3 이미지를 받아와서 실행됐을 때, 그 안에 있는 공간
## Install packages
#현재 패키지 설치 정보를 도커 이미지에 복사
COPY requirements.txt ./
#설치정보를 읽어 들여서 패키지를 설치
RUN pip install -r requirements.txt
## Copy all src files
#현재경로에 존재하는 모든 소스파일을 이미지에 복사
COPY . .
## Run the application on the port 8080
#8000번 포트를 외부에 개방하도록 설정
EXPOSE 8000
#CMD ["python", "./setup.py", "runserver", "--host=0.0.0.0", "-p 8080"]
#gunicorn을 사용해서 서버를 실행
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "프로젝트명.wsgi:application"]
docker build -t 아이디/이미지 명:0.1 .
-t
는 태그이다. 뒤의 0.1
이 그 태그인데 버전을 의미한다.
마지막 .
은 현재 경로에 있는 도커파일을 읽는다는 의미이다.
이미지 보기
docker images -a
docker run -d -p 호스트 포트:컨테이너 포트 --name 컨테이너이름 아이디/이미지명:태그
docker run -d -p 8000:8000 --name lucy_pj hyeyoon/project1: 0.1
-d
는 데몬으로 실행하기 위한 옵션.
데몬화란?
-백그라운드 프로세스로 실행시키기.
-p
:포트 포워딩,,
포트 포워딩이란?
-컴퓨터 네트워크에서 패킷이 라우터나 방화벽 같은 네트워크 게이트웨이를 통과하는 동안 네트워크 주소를 변환해주는 것
-쉽게 말하면, 외부에서 접속이 가능하도록 하는 것
=> 실행된 컨테이너의 해쉬값이 나온다.
docker ps -a
위 과정이 잘되었다면 HTTP로 8000번에 호출해보기
성공했다면 GOOOOD! 다음으로!
도커 허브에 로그인한다.
docker login
docker push hyeyoon/project1:0.1
도커 허브에 업로드한 이미지가 등록이 되었다.
여기까진 로컬에서 진행되었다.
다음부터는 EC2접속해서 진행한다.
EC2로 접속하고 나의 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
다시 로그인
sudo docker login
이미지를 pull받는다.
sudo docker pull hyeyoon/project1:0.1
이미지 확인
sudo docker images -a
서버 실행시켜보기
sudo docker run -d -p 8000:8000 --name lucy_pj hyeyoon/project1: 0.1
작동확인하기
sudo docker ps
status가 up이면 잘 실행되고 있는거고 exited면 스탑된거다.
빌드된 이미지에 이상이 있을 경우, status가 exited됐을것이다.
이는 서버가 실행되다 오류가 발생해서 문제가 되는 경우가 많아
docker run -it hyeyoon/project:0.1 /bin/bash
명령어를 실행하여 이미지 기반으로 바로 컨테이너를 실행하여 접속한다.
process등 여러가지를 살펴보면서 현재 서버에 어떤 문제가 있는지 알 수 있다.
하지만 수정은 컨터에너에서 하지 못하고 이미지를 다시 빌드해야한다. ㅜㅜ
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)