Docker로 배포하기

HYEYOON·2021년 5월 22일
0
post-thumbnail

프로젝트 한 것을 도커로 배포해보았다.
재밌다..

먼저, 로컬에서 할 일과 서버에서 할 일로 나누어보았다.
서버 Amazon EC2를 사용했다. DB는 RDS를 사용했다.
도커, EC2, RDS 콜라보,,

간략한 과정✌️

먼저 로컬에서,
➀도커 설치
➁도커 파일 만들기
➂이미지 빌드
➃도커허브 로그인
➄도커 푸시

다음은 EC2에서,
➀도커 설치
➁도커 로그인
➂이미지 풀받기

1. 도커 회원가입

https://docker.com 사이트에 접속해서 회원 가입을 한다.

2. 도커 설치

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 우분투에서도 사용된다.

3. 설치 확인

터미널에서 docker를 쳐서 명령어들이 좌르르륵 나온다면 설치가 잘 된거다.

4. 프로젝트 클론받기

git clone으로 프로젝트를 받는다.

내 프로젝트 : https://github.com/hyeyoonc/17-1st-TEAMCOOP-backend.git

5. 프로젝트 my_settings.py 변경하기

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형태 말고 그냥 값으로!!

6. gunicorn 설치

도커 이미지 내에 gunicorn이 설치되어있어야한다.
나는 gunicorn 설치를 하지않아서 쬐깐 헤맸다 헤헤^^
pip install gunicorn
하고 requirements.txt에 넣어준다.
pip freeze > requirements.txt
pip install -r requirements.txt
마지막으로 확인차 install 해준다!

7. Dockerfile 만들기

본격적으로 도커 빌드 시작!💫
도커파일이란, 이미지를 만들때 참고하는 명령의 목록을 기록해놓는 파일로 설계도의 역할을 한다.
프로젝트 최상위 디렉토리에 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"]  

8. 도커 이미지 빌드

docker build -t 아이디/이미지 명:0.1 .
-t는 태그이다. 뒤의 0.1이 그 태그인데 버전을 의미한다.
마지막 .은 현재 경로에 있는 도커파일을 읽는다는 의미이다.

이미지 보기
docker images -a

9. 빌드된 이미지 실행해보기

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! 다음으로!

10. 도커 로그인

도커 허브에 로그인한다.
docker login

11. 도커 이미지 푸시

docker push hyeyoon/project1:0.1
도커 허브에 업로드한 이미지가 등록이 되었다.

여기까진 로컬에서 진행되었다.
다음부터는 EC2접속해서 진행한다.

12. 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

13. 이미지 pull 받기

다시 로그인
sudo docker login

이미지를 pull받는다.
sudo docker pull hyeyoon/project1:0.1

이미지 확인
sudo docker images -a

14. 이미지 실행시키기

서버 실행시켜보기
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등 여러가지를 살펴보면서 현재 서버에 어떤 문제가 있는지 알 수 있다.
하지만 수정은 컨터에너에서 하지 못하고 이미지를 다시 빌드해야한다. ㅜㅜ

15. 그 외 명령어들

  • 컨테이너를 전부 삭제하는 명령어
    docker rm $(docker ps -a -q)
  • 이미지를 전부 삭제하는 명령어
    docker rmi $(docker images -q)
profile
Back-End Developer🌱

0개의 댓글