[AWS] Docker로 EC2, ECR, ECS 배포하기

사이드 프로젝트에 도커를 써서 배포해보기로 했다. 어떤 식으로 배포할 건지에 대해서 3가지 방안을 떠올려보았다.

  1. 도커파일을 만들어 도커허브에 올린다음에 EC2로 배포
  2. 도커파일을 ECR에 올리고 EC2로 배포
  3. 도커파일을 ECR에 올리고 ECS로 배포

호기심에 이 셋 모두를 해보게되었다.


이 셋의 차이는 무엇일까?

1번의 경우 도커허브에 내 도커 이미지를 올리게 되는데 도커허브는 퍼블릭이므로 누구나 다운받아 사용할 수 있다. 도커허브도 프라이빗 가능하나 무료 플랜에서는 계정당 1개만 사용할 수 있다. 기밀을 유지해야하는 기업에서는 프라이빗하게 도커 이미지를 올릴 수 있는 ECR를 사용한다. ECS에는 여러개의 컨테이너를 담기 용이하기 때문에 그런 니즈가 있는 기업에서 많이 쓰는 것 같다.


TIP

나는 윈도우를 이용하고 있기 때문에 특히 설정을 잡는게 까다로웠고 온갖 공식 문서, 스택 오버플로우, 블로그 등을 찾아보았다. 트러블슈팅을 너무 많이 해서 다소 중구난방일 수는 있으나 도커를 이용해 배포하고자하는 막막한 윈도우 유저들에게 조금은 도움이 되리라 싶다. 그래서 에러가 나는 부분도 캡쳐를 해서 트러블슈팅하는 모습도 공유하였다.

도커로 배포를 처음해보는 사람이라면, 로컬에서 작동하는지 확인을 한 후 AWS 서버에서도 적용해 작동하는지 확인을 하는 흐름으로 진행된다고 알려주고 싶다. 한마디로 일을 두번해야하는 걸 잊지 말아야한다.


Dockerfile

우선 도커파일을 작성해보았다. 우리 팀은 프런트로 React, 백으로 Django를 사용하고 있다. 그래서 백으로 이미지를 만들고 그 안에 프런트를 집어넣는 방식으로 도커파일을 만들기로 했다. docker-compose.yml 파일로 DB도 연결해서 넣어주고 싶었지만 잘 되지 않아서 DB는 RDS에 올리는 방향으로 가기로 했다.

FROM node:16-alpine as FRONTEND
COPY frontend /code/frontend/
WORKDIR /code/frontend

RUN yarn install \
    && yarn run build

FROM python:3.9-alpine

RUN mkdir /code
WORKDIR /code
COPY ./backend/ /code/
COPY --from=FRONTEND /code/frontend/src/App.tsx .


RUN apk add --no-cache gcc musl-dev postgresql-dev curl
RUN pip install -r /code/requirements/production.txt
EXPOSE 8000
RUN ["python", "manage.py", "makemigrations"]

RUN ["python", "manage.py", "migrate"]

ENTRYPOINT [ "python", "manage.py", "runserver", "0.0.0.0:8000" ]

RUN과 ENTRYPOINT의 차이:

  • ENTRYPOINT: 컨테이너가 생성되고 최초로 실행할 때 수행되는 명령어
  • RUN: 도커파일로부터 도커 이미지를 빌드하는 순간에 실행이 되는 명령어

1. 도커허브와 EC2로 배포하기

노트북에 이미 설치되어있는 우분투를 클릭해준다. CLI에서 다음과 같은 명령어를 실행해준다. 우분투 os가 설치된 컨테이너를 만들기 위해 docker pull을 이용해 우분투 이미지를 가져와준다.

docker pull ubuntu:22.04

docker run -it -d -p 5432:5432 —name postgres ubuntu:22.04
  • 우분투 이미지를 가져와서 포트번호를 5432로 지정해주고 이름을 postgres로 하고 우분투 이미지를 가지고 컨테이너를 만든다

  • -it 인터렉티브하게 실행한다 (bash shell같이 명령어를 주면 결과물을 보여준다)

  • -d 백그라운드에서
  • -p는 포트번호를 의미한다

vs code의 wsl에서 다음의 명령어를 실행해 이미지와 컨테이너가 생성한다

이미지 생성
**docker build -t christychoi/pribos:0.1 .**
컨테이너 생성
**docker run -it -d --name pribos -p 8000:8000 christychoi/pribos:0.1**
도커허브로 푸쉬
**docker push christychoi/pribos:0.1**
  • 맨마지막의 . 은 현재위치를 뜻한다

  • 이미지와 태그를 생성한다

  • 도커 데스크탑으로 이미지와 컨테이너가 생성되었는지 확인한다. 그냥 로그를 봐도 되고 CLI에 들어가서 ls -al로 와 cd 명령어로 폴더 위치가 제대로 된 장소에 생성되었는지 확인할 수 있다.


EC2 에 접속해서 도커를 설치한다

공식 참고: https://docs.docker.com/engine/install/ubuntu/


sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release


# 도커 설치
 sudo apt-get update
 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 도커 실행
sudo service docker start

Untitled.png

  • 퍼미션이 없다고 나온다
chmod ubuntu:docker
  • 오너가 root였는데 우린 ubuntu 이기 때문에 chown으로 바꿔주면 해결된다 ` chmod 775

  • 우린 chown 775의 권한을 주기로 했다 (앞자리가 7이면 일단 나에게 읽기r, 쓰기w, 실행x 권한을 다 준다)

docker exec -it pribos /bin/sh

Untitled (8).png

  • 도커 내부에서는 잘 돌아가는 걸 확인할 수 있다.

탄력적IP 받아서 연결

https://qwlake.github.io/django/aws/docker/2020/03/17/django-deploy-at-aws-with-docker/

탄력적 IP x.x.x.x:8000으로 크롬창에 치면 연결된다 화면이 뜨면 성공이다


2. ECR와 EC2로 배포하기

  1. 우선 로컬에 AWS cli 설치한다

공식참고: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

  • 여기서 파일을 설치해줘야한다

  • 설치 확인

  • window + R → CMD

aws --version
  1. ec2 내부에 awscli도 설치해줘야한다
sudo apt install awscli
aws configure

aws관련 키 넣어주기
  1. ECR 생성

ECR에 가서 repository를 만든다

Untitled (2).png

  • 여기 있는 명령어들을 차례대로 실행해줄건데 aws configure가 안 되어있으면 진행이 안되니 꼭 해준다

Untitled (4).png

공식참고: docs.aws.amazon.com/AmazonECR/latest/usergu..

  • 공식에서 빨간색으로 표시된 부분은 바꿔서 넣어주어야한다는 걸 알 수 있는데 결국 ECR생성 후 주는 명령어랑 같다
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

윈도우면 이 단계가 안 될 수도 있다. 그럴 땐 AWS Tools를 다운받아줘야하는데 로컬엔 윈도우 버전의 명령어, AWS에서는 리눅스 버전의 명령어를 입력해주어야한다.

공식 참고: https://aws.amazon.com/ko/powershell/

AWS Tools for PowerShell(모듈식, 권장) 다운로드

  • 공식에서 이 파일을 다운로드 받으면 된다

  • 다운 받고 AWS Tools가 설치된 해당 폴더로 가서 powershell 관리자 권한으로 명령어

Install-Module -Name AWS.Tools.Installer
Install-AWSToolsModule AWS.Tools.ECR
Get-ECRLoginCommand

https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up-windows.html#ps-installing-awstools

https://stackoverflow.com/questions/70393195/get-ecrlogincommand-is-not-recognized-as-the-name-of-a-cmdlet-function-scrip

Untitled (5).png

실행을 하면 이런 화면이 뜨는데 Command에 나오는 명령어를 복사한 다음에 한줄마다 있는 띄여쓰기들을 다 없애고, wsl에서 실행하면 Login Success가 뜬다

Untitled (6).png

EC2의 탄력적 IP를 크롬창에 치고 들어가 화면이 뜨면 성공이다


3.ECS로 배포하기

특징:

  • ecs-cli 를 사용한다
  • ec2의 묶음이다
  • ecs 우선은 디폴트로 만듦
  • 만들어놓은 ecr를 선택한다

Untitled (7).png

보안그룹 설정

  • 인바운드 HTTP 80, HTTPS 443 열기

  • 퍼블릭 IP로 들어가면 실행된다


FIN

맥을 안 쓰고 윈도우를 쓰고 있어서 설정을 잡는데 트러블 슈팅(=삽질)을 참 많이 했다. 도커 배포의 흐름을 알게 되어 좋은 경험이었다. 배포에 성공했다면 배포 자동화 포스팅도 확인해볼 수 있다 ->

Did you find this article valuable?

Support Christy Choi by becoming a sponsor. Any amount is appreciated!