
🤗 본 글은 Docker 위주로 작성하였으며 EC2와 RDS는 Docker를 이용한 배포와
관련된 내용만을 다루겠습니다.
우리의 프로젝트를 local에서 docker 이미지로 만들어 docker hub에 올린 후
EC2에서 내려받아 실행해하기 까지의 과정을 거쳐야 합니다.
그리고 내 로컬 컴퓨터에서 테스트하고 이상이 없을 시에 EC2와 RDS에서
구동하는 것이 안정적입니다.
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 명령어로 해당 컨테이너가 시작되었을 때
스크립트나 명령을 실행합니다.
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))
방금 우리가 만든 이미지가 잘 실행되는지 테스트할 필요가 있습니다.
문제가 없어야 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를 입력해 본 후
관련 컨테이너 내용이 있고 STATUS에 Exited를 포함한 내용이 있다면
정상적으로 실행되지 않은 경우입니다.
💡 컨테이너를 삭제하려면 터미널에 docker rm 컨테이너_이름을 입력하면 됩니다.
(전부삭제: docker rm $(docker ps -a -q))
💡 docker stop 컨테이너_이름, docker start 컨테이너_이름등으로
컨테이너를 멈추거나 가동할 수 있습니다.
💡 실행중인 컨테이너에 접속하려면 docker exec -it 컨테이너_이름 /bin/bash를
입력하고 docker run -it 계정id/이미지_이름:이미지_버전 /bin/bash를
입력하면 실행과 동시에 컨테이너에 접속할 수 있습니다.
이제부터 EC2에 배포하기 위해 해당 docker 이미지를 온라인으로 보내야 합니다.
그러기 전에 터미널에서 docker login을 입력해 docker hub와
나의 컴퓨터를 연결시켜줘야 합니다.
도커 id와 비밀번호를 요구할 수도 있습니다.

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

https://hub.docker.com/repositories 에 접속하여 위와 같이 업로드된 이미지를
확인할 수 있습니다.
docker는 마치 github처럼 이미지를 push하고 pull 할 수 있습니다.
이제부터 EC2에 컨테이너를 올리는 작업을 할 것입니다.
앞선 과정을 잘 수행하셨다면 사실 이제 별로 할 일이 없으니 금방 끝난답니다!
우리는 RDS를 사용할 것이기 때문에 프로젝트에서 DB연결을 하는 경우
host에 RDS의 endpoint를 이미지 생성 시에 잘 넣어두었어야 합니다.
그렇지 않으면 DB와 연동되지 않으니 꼭 확인 후 진행하시면 좋겠습니다.
터미널에서 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을 입력해 docker hub와 연결합니다.
local에서 docker hub에 push한 이미지를 EC2 서버에 다운받아야 합니다.
로그인 되었다면 다음 명령어로 이미지를 pull 받습니다.
# sudo docker pull 계정id/이미지_이름:이미지_버전
sudo docker pull chrisyang256/freshcode:0.1.0

sudo docker images로 다운받은 이미지를 확인할 수 있습니다.
이제 로컬에서처럼 이미지를 실행시켜 컨테이너를 착륙시키면 됩니다!
아래 명령어를 실행시켜주세요.
# 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가 설치되어있지 않기 때문입니다.
apt-get update를 통해 ubuntu의 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트합니다.apt-get install vim으로 vi를 설치합니다.