Docker ⎮ Container + RDS 조합 EC2 배포

Chris-Yang·2021년 11월 10일

Docker

목록 보기
1/1
post-thumbnail

🤗 본 글은 Docker 위주로 작성하였으며 EC2와 RDS는 Docker를 이용한 배포와
관련된 내용만을 다루겠습니다.


> In the local

우리의 프로젝트를 local에서 docker 이미지로 만들어 docker hub에 올린 후
EC2에서 내려받아 실행해하기 까지의 과정을 거쳐야 합니다.

그리고 내 로컬 컴퓨터에서 테스트하고 이상이 없을 시에 EC2와 RDS에서
구동하는 것이 안정적입니다.


▶︎ Dockerfile

Dockerfile을 작성하여 프로젝트 최상위 루트에 위치시켜야 합니다.

나만의 이미지를 생성하기 위해 설정해주는 것이 Dockerfile의 역할입니다.

❗️ 첫 글자를 대문자로 쓰지 않으면 에러가 발생하니 주의해야 합니다.


파일의 내용은 다음과 같습니다.

# 장고를 기준으로한 내용입니다.

# 기반이 될 이미지
FROM python:3.8
# 디렉토리(default)설정
WORKDIR /usr/src/app

# Install packages: 현재 패키지 설치 정보를 도커 이미지에 복사
COPY requirements.txt ./
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

# Copy all src files: 현재경로에 존재하는 모든 소스파일을 이미지에 복사
COPY . .

# 8000번 포트를 외부에 개방하도록 설정
EXPOSE 8000

# gunicorn을 사용해서 서버를 실행하는 경우의 옵션
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "최상위_앱_이름.wsgi:application"]

💡 CMD:
CMD는 docker run, docker start 명령어로 해당 컨테이너가 시작되었을 때
스크립트나 명령을 실행합니다.


▶︎ 이미지 build

Dockerfile을 통해 해당 프로젝트를 이미지로 만들어줄 수 있습니다.

터미널에서 Dockerfile이 위치한 프로젝트 최상위 루트로 이동하여
다음과 같은 명령어를 입력하고 실행합니다.(m1은 스크롤을 좀 더 내려보세요)

💡 맨 끝의 .은 Dockerfile의 위치를 의미하므로 반드시 Dockerfile이
위치한 곳에서 해야할 필요는 없습니다.

# docker build -t 도커id/이미지이름:이미지버전 .
docker build -t chrisyang256/freshcode:0.1.0 .

이미지 이름은 보통 프로젝트 이름을 넣으며 이미지 버전은 임의로
작성할 수 있는 부분입니다.


작성일 기준 애플실리콘(m1)의 경우 다음과 같이 --platform=linux/amd64
추가해야 합니다.

docker build --platform=linux/amd64 -t chrisyang256/freshcode:0.1.0 .

그렇지 않으면 컨테이너 실행 시 다음과 같은 에러가 발생합니다.

ran v0.38.6 on Apple Silicon chip, observed error/warning : 
The requested image's platform (linux/amd64) does not match 
the detected host platform (linux/arm64/v8) and no specific 
platform was requested

💡 docker iamges 명령어로 이미지가 생성된 것을 확인할 수 있습니다.
(Docker Desktop의 images에서도 확인 가능합니다.)

위와 같은 결과가 나왔다면 성공적으로 이미지를 생성하셨습니다!😃

💡 이미지를 지우고싶다면 터미널에서 docker rmi 이미지id를 실행하거나
Docker Desktop에서 지우실 수 있습니다.
(전부삭제: docker rmi $(docker images -q))


▶︎ Local Test

방금 우리가 만든 이미지가 잘 실행되는지 테스트할 필요가 있습니다.

문제가 없어야 EC2에서도 잘 작동하기 때문입니다.

다음은 Docker에서 말하는 바로 그 컨테이너라는 것을 조작하는 단계입니다.

아래 명령어를 실행하면 컨테이너가 생성 / 실행됩니다.

# docker run -d -p 호스트_포트:컨테이너_포트 --name 컨테이너_이름 도커id/이미지_이름:이미지_버전
docker run -d -p 8000:8000 --name fcp chrisyang256/freshcode:0.1.0


# 애플실리콘(m1)의 경우 --platform linux/amd64 추가
docker run --platform linux/amd64 -d -p 8000:8000 --name fcp chrisyang256/freshcode:0.1.0

정상적으로 실행되었다면 다음과 같이 해쉬값이 출력됩니다.


💡 -d는 demon의 약자로 사용자와 상호작용하지 않고
뒤에서 프로그램을 실행시킵니다.

💡 -p는 port번호를 말합니다.
host port는 현재 운영체제의 port를, container port는 해당 container의
port를 말하고 이 둘은 host의 port로 들어온 요청을 container의 port로
연결시켜주는 역할을 하며 둘의 번호는 다를 수 있습니다.

컨테이너 이름은 임의로 설정할 수 있습니다.


이제 터미널에 docker ps를 입력하면 정상적으로 연결이 컨테이너가 실행된 경우
아래와 같이 컨테이너가 실행되고 있는 것을 확인할 수 있습니다.


정상적으로 출력되었다면 관련 코드가 잘 실행될 것입니다! 👏 🎉

만약 실행되고 있는 컨테이너가 없다면 docker ps -a를 입력해 본 후
관련 컨테이너 내용이 있고 STATUSExited를 포함한 내용이 있다면
정상적으로 실행되지 않은 경우입니다.

💡 컨테이너를 삭제하려면 터미널에 docker rm 컨테이너_이름을 입력하면 됩니다.
(전부삭제: docker rm $(docker ps -a -q))

💡 docker stop 컨테이너_이름, docker start 컨테이너_이름등으로
컨테이너를 멈추거나 가동할 수 있습니다.

💡 실행중인 컨테이너에 접속하려면 docker exec -it 컨테이너_이름 /bin/bash
입력하고 docker run -it 계정id/이미지_이름:이미지_버전 /bin/bash
입력하면 실행과 동시에 컨테이너에 접속할 수 있습니다.


▶︎ Docker hub에 이미지 push

이제부터 EC2에 배포하기 위해 해당 docker 이미지를 온라인으로 보내야 합니다.

그러기 전에 터미널에서 docker login을 입력해 docker hub와
나의 컴퓨터를 연결시켜줘야 합니다.

도커 id와 비밀번호를 요구할 수도 있습니다.


로그인이 잘 됐다면 터미널에 아래 명령어를 입력하여 docker hub에 이미지를 업로드합니다.
# docker push 계정id/이미지_이름:이미지_버전
docker push chrisyang256/freshcode:0.1.0

https://hub.docker.com/repositories 에 접속하여 위와 같이 업로드된 이미지를
확인할 수 있습니다.

docker는 마치 github처럼 이미지를 push하고 pull 할 수 있습니다.





> In the EC2

이제부터 EC2에 컨테이너를 올리는 작업을 할 것입니다.

앞선 과정을 잘 수행하셨다면 사실 이제 별로 할 일이 없으니 금방 끝난답니다!

우리는 RDS를 사용할 것이기 때문에 프로젝트에서 DB연결을 하는 경우
host에 RDS의 endpoint를 이미지 생성 시에 잘 넣어두었어야 합니다.

그렇지 않으면 DB와 연동되지 않으니 꼭 확인 후 진행하시면 좋겠습니다.


▶︎ Setting

터미널에서 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

▶︎ Docker image pull

sudo docker login을 입력해 docker hub와 연결합니다.

local에서 docker hub에 push한 이미지를 EC2 서버에 다운받아야 합니다.

로그인 되었다면 다음 명령어로 이미지를 pull 받습니다.

# sudo docker pull 계정id/이미지_이름:이미지_버전
sudo docker pull chrisyang256/freshcode:0.1.0

sudo docker images로 다운받은 이미지를 확인할 수 있습니다.


▶︎ Container Run

이제 로컬에서처럼 이미지를 실행시켜 컨테이너를 착륙시키면 됩니다!

아래 명령어를 실행시켜주세요.

# sudo docker run -d -p 호스트_포트:컨테이너_포트 --name 컨테이너_이름 도커id/이미지_이름:이미지_버전
sudo docker run -d -p 8000:8000 --name fcp chrisyang256/freshcode:0.1.0

# 애플실리콘(m1)의 경우
sudo docker run --platform linux/amd64 -d -p 8000:8000 --name fcp chrisyang256/freshcode:0.1.0

sudo docker ps로 컨테이너 활성화 여부를 확인합니다.

정상적으로 활성화 되었다면 배포!완료!!🕺


▶︎ 보너스

혹시 실행되는 컨테이너의 내부를 보고싶거나 코드를 수정하고 싶다면
로컬에서와 마찬가지로 sudo docker exec -it 컨테이너_이름 /bin/bash
docker run -it 계정id/이미지_이름:이미지_버전 /bin/bash를 입력하면
됩니다.

그리고 코드를 수정하기 위해 vi명령어를 쓴다면 아마 오류가 날 것입니다.

이유는 vi가 설치되어있지 않기 때문입니다.

  1. apt-get update를 통해 ubuntu의 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트합니다.
  2. apt-get install vim으로 vi를 설치합니다.
profile
sharing all the world

0개의 댓글