Docker를 통한 AWS EC2 Server 배포

haejun-kim·2020년 9월 13일
2
post-thumbnail

RDS 연동

local 환경의 DB에서 사용하던 Data를 AWS의 RDS를 사용하여 연동해야한다. 그래야 내가 가지고 있던 DB를 고대로 사용할 수 있다. 그러기 위해선 local 환경의 DB를 dump 를 실행해야한다.

dump

mysqldump -u root -p db명 > db명.sql

먼저 내 localhost의 mysql을 들어가는 명령어인 -u root -p 명령어를 사용해야한다.
위의 명령어는 내 local의 mysql을 dump를 뜰건데, local에 있는 'a'라는 이름을 가진 db를 > 'a'.sql 이라는 이름의 파일로 dump 파일로 만들어줘! 라는 의미이다.
dump 파일의 이름은 어떤 이름으로든 상관없지만, 어떤 db의 dump 파일인지 인지하기 편하기 위해선 사용하던 이름을 고대로 입력해 주는것이 좋다.
(어차피 RDS DB에도 같은 DB 이름으로 DB를 생성할테니)

dump 파일을 RDS database에 밀어 넣기

mysql -h host address -u root -p database이름 < dump file이름 (airbnb.sql)
hostaddress는 아마존에 엔드포인트 주소를 넣을 것.

이 작업을 하기 전에 필요한 사전작업이 있다. RDS로 연동한 MySQL로 들어가서 데이터베이스를 먼저 만들어줘야한다. 그렇게 하지 않으면 해당 sql 파일을 어떤 db에 넣을지 모르거나, 내가 입력한 db가 host mysql에 존재하지 않기 때문에 데이터가 들어가지 않는다.

DB를 만들어주었다면 위의 명령어를 사용해주자. host address는 AWS의 RDS 페이지에 들어가면 엔드포인트 주소라고 나온 부분이 있는데 그 주소를 사용해주면 된다. (RDS MySQL에 들어갈 때 사용하던 그 주소!)

주의할 점이라 한다면 위의 두가지 명령어를 사용할 때, > , < 의 방향에 주의해주도록 하자!
dump는 >
밀어 넣는건 < 이다.

Docker

Docker file만들기

vim Dockerfile

어렵지 않다. Dockerfiler 이라는 이름으로 하나의 파일을 만들어주면 된다. Dockerfile 이름을 인식하기 때문에 해당 이름으로 파일을 만들어주면 Dockerfile임을 인식해서 Docker Image file을 만들 수 있다.
생성 한 dockerfile에는 다음과 같이 입력해주자.

FROM python:3.8

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "beerbnb.wsgi:application"]

위의 내용을 해석하면 다음과 같다.
1. python 3.8 version을 사용할거고
2. docker container의 해당 위치에 설치해줘
3. requirements.txt 파일을 복사해서 현재 위치에 만들어주고
4. requirements.txt에 있는 파일 목록들을 설치해줘
5. 현재 파일에 있는 모든것들을 Docker container의 현재 위치에 복사해주고
6. Port는 8000번을 사용할게
7. port 8000번을 사용해서 gunicorn을 실행시켜 background로 실행시킬거야.

여기서 주의할 점은 마지막에 CMD 명령어를 각 단어별로 "" 로 묶어 String으로 인식시켜주어야한다.
따옴표를 묶어주지 않아서 한시간정도 고생 했다.🤣

의존성 문제를 생각해라.

주의할 점이라고 한다면 gunicorn같은것을 사용할 때, 의존성을 생각해야한다.
예를 들어서, 나의 서비스를 실행시키기 위해서는 gunicorn이 필요하다. 그렇다면 이 프로그램이 requirements.txt에 제대로 포함되어 있어야 image file을 실행 시킬 때 정상적으로 gunicorn을 설치를 할 것이고 정상적으로 background에서 gunicorn을 실행시킬 수 있다.
만약 local환경에서는 gunicorn이 설치되어 있는데, requirements.txt에 gunicorn이 없다면? docker image file을 받을 때, gunicorn이 설치되지 않기 때문에 정상적으로 background에서 동작 시킬 수 없을것이다.

my_settings.py의 데이터베이스가 local이 아닌 RDS여야한다.

Django를 초기 세팅 할 때, DB Setting에 대한 내용을 my_settings.py 등의 다른 파일에 setup을 해놓고, 해당 파일은 .gitignore에 추가하여 git에 올라가지 않도록 했을 것이다. 이 setting 내용을 local이 아닌 RDS의 host address를 넣어주어야 local DB가 아닌 RDS DB가 연동 된 상태로 배포가 된다.

Docker build

docker build -t dockerhub ID/project_name:0.1.0 .

이제 docker file을 build해보자. 위의 명령어를 입력해주면 손쉽게 할 수 있다.
위의 명령어는 docekr file을 build할건데, 내 docker hub ID는 ~이고, ~라는 프로젝트를 build할거야. 태그는 0.1.0의 버젼으로 build할 것이고, 현재 파일에 있는 모든 파일을 build 해줘! 라는 의미의 명령어이다.

이 명령어를 실행 하기 전 docker에 login을 꼭 먼저 해주자.

docker login

이미 로그인 한 적 있다면 캐시화 되어 있기 때문에 자동으로 로그인되고, 처음 로그인 하는 것이라면 docker hub의 id와 pw를 입력해주면 login success(?)의 메세지가 반환될 것이다.

Docker 실행시키기

docker run —name 컨테이너name -d -p 8000:8000 hubID/project_name:0.1.0

docker image file을 실행시키는 명령어이다. 해당 명령어를 입력해주면 된다. 명령어에 대한 설명은 위의 내용과 비슷하다.

정상적으로 이 과정까지 실행됐다면

docker ps

이 명령어를 쳐보자. 어떤 컨테이너가 잘 표시되었고, TAG, PORT, STATUS가 제대로 표시 되었다면 정상적으로 실행이 된것이다.
localhost에서 httpie를 사용해서 작성 한 API를 실행시켜보면 정상적으로 동작이 될 것이다.

Docker hub push

docker push hubID/project_name:0.1.0

위의 명령어를 통해 local에서 생성 한 docker image file을 docker hub로 push할 수 있다.
이렇게 push를 하고 나면 AWC의 EC2 Server(ubuntu)로 들어갔을 때, Docker hub에서 pull 받아서 배포 할 수 있게 된다.


위의 과정까지 에러 없이 잘 실행 됐다면 이제 AWS의 EC2 Server로 접근해서 마지막으로 실행시켜주면 된다.

우선 ubuntu server에 docker를 설치해주자. ubuntu에 docker를 설치할 때는 mac에서 설치할 때보다 까다롭다.

ubuntu에서 docker 관련 된 명령어는 모두 sudo 를 써서 관리자 권한으로 실행시켜주어야 정상적으로 실행된다.

Ubuntu docker install

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https:download.coker.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

위의 명령어를 한 줄 한 줄 복사해서 실행시켜주면 별 문제 없이 설치가 완료될것이다.

docker pull

sudo docker login

먼저 docker에 로그인을 해 주고,

sudo docekr pull hubID/project_name:TAG

docker hub에 올린 내용을 pull 받아오도록 한다.

docker run

docker run —name 컨테이너name -d -p 8000:8000 hubID/project_name:TAG

위의 명령어까지 정상적으로 실행된다면 배포가 완료된다.

배포가 완료됐음은 sudo docker ps 명령어를 통해 확인할 수 있다.

0개의 댓글