[PROJECT] AIRBNB CLONING #6

도커(Docker) 컨테이너는 소프트웨어를 개발, 배포, 운영하기 위한 단순하면서 빠르고 강력한 방법을 제공해주는 컨테이너 가상화기술 입니다. 이번 블로그에서는 docker image를 생성하여 Docker Container를 활용해 배포 해보겠습니다.

Docker

Install Docker

다음 페이지에서 도커를 설치합니다. brew를 통해서도 설치가 가능합니다.

Setting

RDS를 생성하고 RDS mysql 서버에 접속합니다.
mysql -h 'RDS Database Endpoint 주소' -u root -p

그리고 데이터베이스를 생성합니다.
mysql> create database 'DATABASE 이름' character set utf8mb4 collate utf8mb4_general_ci;

데이터베이스를 생성한 후에 RDS 데이터베이스에 맞게 DATABASES의 정보를 수정합니다.

DATABASES = {
    'default' : {
        'ENGINE'   : 'django.db.backends.mysql',
        'NAME'     : 'DATABASE 명',
        'USER'     : 'DB 접속 계정명',
        'PASSWORD' : 'DB 접속 비밀번호',
        'HOST'     : 'RDS Database Endpoint 주소',
        'PORT'     : 'DB PORT'
    }
}

setting_up.sh 을 생성합니다.

# !/bin/sh

# create conda virtual environment
echo y | conda create -n docker_train python=3.9 && conda activate docker_train

# install dependency packages
pip install -r requirements.txt

# create table
python manage.py migrate

# upload dependency data
python db_upload/db.py

# find server IP Address
echo 'ip주소 입력'
# echo  | ipconfig getifaddr en0

# runserver
python manage.py runserver 0:8000

setting_up.sh 을 실행하면 테이블 및 데이터를 생성합니다.

서버에 http request를 보내서 RDS MySQL 서버에 데이터가 잘 들어갔는지 확인합니다.

Create Docker Image

DockerFile 작성
Docker image를 생성하기 위한 Dockerfile를 현재 프로젝트 폴더 안에 작성합니다.

# 기반이 될 이미지
FROM python:3 

# 작업디렉토리(default)설정
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
# 8000번 포트를 외부에 개방하도록 설정
EXPOSE 8000   

# gunicorn 사용해서 서버를 실행
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "'프로젝트명'.wsgi:application"]

마지막에 gunicorn을 사용해서 서버를 실행하는데 "'프로젝트명'.wsgi:application"python manage.py startproject '이름'에서 '이름'에 해당하는 내용이 입력되어야 합니다. 그렇지 않으면 gunicorn이 파일을 찾지 못해 다음과 같은 에러를 냅니다.

따라서 다음과 같이 입력해줍니다. 프로젝트 이름은 config입니다. CMD ["gunicorn", "--bind", "0.0.0.0:8000", "config.wsgi:application"]

Build Image
Dockerfile을 이용해 image를 build합니다.
docker build -t 'DockerHub username'/'image name(project name)':'version' 'Dockerfile path' .

예) docker build -t robbins4bos/yhim2:0.1.0 .

Push Image

DockerHub에 다음의 명령어로 이미지를 푸쉬합니다.
docker push robbins4bos/yhim2:0.1.0

EC2 배포

다음의 과정을 진행합니다.
EC2에 접속해 Docker install
우선 EC2 instance에 접속합니다.

# 생성한 EC2 instance 접속

# get-docker.sh 다운로드
$ curl -fsSL https://get.docker.com -o get-docker.sh

# ll 명령어로 현재 디렉토리에 get-docker.sh 파일 확인
$ ll

# get-docker.sh 실행하여 Dokcer 설치
$ sh get-docker.sh

처음 EC2에 ssh 접속할 때 Permission Error가 발생한다면 다음과 같이 해결합니다.

# 해당 에러는 pem 파일이 너무 많은 권한 설정이 되어있어 발생함
# pem 파일을 최소한의 권한으로 설정
$ sudo chmod 400 'Key 이름'.pem

또는 sudo chmod 666 /var/run/docker.sock을 입력해 파일의 권한을 666으로 변경해 그룹 내 다른 사용자도 접근 가능하게 변경합니다. 해당 블로그를 참고하였습니다.

Docker Image Pull

docker pull robbisn4bos/yhim2:0.1.0

Docker Container 실행

아래와 같은 명령어를 입력할 시 local에서 image를 먼저 찾아본 뒤, 없으면 DockerHub에서 자동으로 image를 찾습니다. 그 후 곧바로 image를 불러와 명령어가 실행됩니다. (바로 컨테이너를 실행하기 위해선 Pull 명령어가 필요없습니다.)

docker run --name api -p 8000:8000 robbisn4bos/yhim2:0.1.0
--name옵션을 붙여주어 해당 이름으로 컨테이너를 만든 후에 실행합니다.이미 컨테이너가 생성된 경우 docker run -p 8000:8000 robbisn4bos/yhim2:0.1.0과 같이 실행합니다.

Error

도커 배포 끄읕~!

도커 배포 꼭 하고 싶어서 멘토님 잡고 여쭤본 흔적...!

짜릿해

좋은 웹페이지 즐겨찾기