티스토리 뷰

정중한 지적은 언제나 환영합니다!
댓글로 편히 남겨주세요

 

 2편 에 이어서 S3 저장소 대신 컨테이너를 활용해서 배포를 해보겠다.

 

도커 환경을 이용할 것이고, AWS ECR(Elastic Container Registry) 서비스를 이용할 것 이다.

 

도커 기본 개념에 대해 이해를 하고 싶다면 아래 공식 문서를 첨부하겠다.

 

https://docs.docker.com/engine/

 

Docker Engine

Find a comprehensive overview of Docker Engine, including how to install, storage details, networking, and more

docs.docker.com

 

다시 한번 필자의 프로젝트 스펙을 적어본다.

서버 : express (node)
vpc : default 
security group : custom (db, express 등의 포트는 뚫어주세요)
ec2 : t2micro (연습용) 
rds : db.t4g.micro (연습용) 

 

 

이제 시작하겠다.

 

목차는 다음과 같다.

 


1. Dockerfile 파일 추가

2. .dockerignore 파일 추가

3. Dockerrun.aws.json 파일 추가

4. deploy.yml 파일 수정


 

1. Dockerfile 파일 추가

먼저, Dockerfile에 대해 작성해 줄 것이다. 

Dockerfile은 어떤 역할을 하는 것일까

 

Dockerfile은 쉽게 말해 프로젝트(애플리케이션)를 컨테이너로 배포하기 위해 Docker 이미지를 생성하는데 필요한 파일이다.

 

컨테이너로 배포하기 위해선 프로젝트 -> Docker 이미지 -> 컨테이너 실행 과정을 거쳐야 하며

이미지를 생성하기 위해 Dockerfile이 필요하다.

 

필자는 멀티 스테이지 빌드를 사용하여 Dockerfile 을 작성했다.

# 1. Build Stage
FROM node:22 AS build

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install --production

COPY . .

# 2. Production Stage
FROM node:22-slim AS production

WORKDIR /usr/src/app

COPY --from=build /usr/src/app /usr/src/app

ENV PORT=3000

EXPOSE 3000

# 애플리케이션 실행
CMD ["node", "app.js"]

 

 

2. .dockerignore 파일 추가

이미지를 생성하는 데 있어 불필요한 파일은 이미지로 만들지 않는다. 이는 빌드 시간 단축, 용량 감소로 이어진다.

아래 4가지에 대해 작성해준다.

node_modules
.git
Dockerfile
.dockerignore

 

 

3. Dockerrun.aws.json 파일 추가

한 가지 더 중요한 것이 Dockerrun.aws.json 파일이다. 이는 AWS Elastic Beanstalk에서 Docker 애플리케이션을 배포하기 위해 사용하는 JSON 형식의 설정 파일이다. 

 

Elastic Beanstalk이 Docker 이미지를 빌드하고 실행하는 데 필요한 정보를 제공하는 역할을 한다.

 

Dockerrun.aws.json은 두 가지 버전이 있는데 이는 아래와 같다.

 

  • 버전 1: 단일 컨테이너 지원.
  • 버전 2: 다중 컨테이너(Docker Compose) 지원.

 

필자의 프로젝트는 다중 컨테이너를 띄울 필요가 없기에 버전 1을 택하였다. 

 

{
    "AWSEBDockerrunVersion": "1",
    "Image": {
      "Name": "${ECR_REGISTRY}/${ECR_REPOSITORY}:${IMAGE_TAG}",
      "Update": "true"
    },
    "Ports": [
      {
        "ContainerPort": "3000"
      }
    ]
  }

 

 

4. deploy.yml 파일 수정

마지막으로 기존의 ci-cd 스크립트인 deploy.yml 파일에서 S3 부분을 ECR 관련 명령어로 수정해줌으로서 S3->ECR로 전환이 가능하게 된다.

 

 # 3. Amazon ECR Public에 로그인
    - name: Login to Amazon ECR Public
      run: |
        aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/XXX

 # 4. Docker 이미지 빌드 및 푸시
    - name: Build, tag, and push image to Amazon ECR Public
      env:
        ECR_REGISTRY: public.ecr.aws/n1b7r8u0
        ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_NAME }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker build . -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

 

 

ECR

 

EB