티스토리 뷰

그동안

  • Docker를 로컬/ec2 인스턴스에서 적용해본다거나
  • Docker Compose를 로컬에서 띄워본다거나
  • 동시에 3개의 app을 클러스터링 해본다거나

등등은 해보았으나

CI/CD까지 구성해보진 못했었다.

 

이번 글에서는

test용 인스턴스 생성

-> test용 repository 생성 + NestJS 코드 import

-> Dockerizing (Dockerfile 만들기) + 이미지 생성

-> CI/CD 구성하여 인스턴스에 자동 배포

순서로 해보려고 하고, 

 

github repo, github action, ec2 instance, ECR, NestJS 등등을 사용한다.

 

test용 인스턴스 생성

 

test용 repository 생성 + NestJS 코드 import

내 팀 깃허브에 레포를 하나 만들었다.

https://github.com/neordinary/test-docker-nest

테스트용으로 우리가 배포해야할 NestJS 코드를 넣어두었다.

 

Dockerizing (Dockerfile 만들기) + 이미지 생성

FROM node:16-alpine asbase
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3232
CMD["npm", "run", "start"]

Dockerfile을 작성했다.

NestJS를 배포하는 방식대로 npm install 후 build 하여 그를 3232 포트로 실행하여 배포한다.

NestJS 코드와 Dockerfile이 정상인지 확인하기 위해

로컬에서 docker container를 실행시켜 보았다.

Docker에 들어가보니 잘 실행되는 컨테이너

혹시 통신은 잘 되나 확인해보니 NestJS로 제작된 api 통신도 잘 되고 있다.

 

CI/CD 구성하여 인스턴스에 자동 배포

대뜸 yaml 코드를 작성하려니까 어느 범위까지 Dockerfile에 넣어야하고 어느 범위까지 workflow에 넣어야 할까, 

어떤 내용으로 코드를 작성해야할까 머리가 어지러웠다.

 

그래서 미리 시나리오를 세워 그에 맞는 코드를 작성하기로 했다.

 

[CI/CD 예상 시나리오]

  1. Dockerfile로 이미지 빌드
  2. ECR에 push
  3. AWS EC2 인스턴스 접속
  4. ECR URI로 이미지 pull
  5. 기존에 띄워져있던 컨테이너 죽이기
  6. 이미지로 컨테이너 실행

github action의 workflow에서 docker image로 제작한다.

 

docker-image.yaml 코드를 작성하면서 발생한 오류들은 아래의 글에서 확인할 수 있다.

https://dev-dorydory.tistory.com/54

 

Docker CI/CD 구성하여 자동배포중 발생한 오류 모음 (EC2, Github Action, NestJS, ECR)

 

dev-dorydory.tistory.com

 

name: Docker Image CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-2
        
    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1
      
    - name: Build, tag, and push image to Amazon ECR
      id: build-image
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        ECR_REPOSITORY: "test-docker-nest"
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker buildx build --platform=linux/amd64 -t $ECR_REGISTRY/$ECR_REPOSITORY:latest .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:latest"

    - name: SSH Commands
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.AWS_SSH_HOST }}
        username: ${{ secrets.AWS_SSH_USERNAME }}
        key: ${{ secrets.AWS_SSH_KEY }}
        port: ${{ secrets.AWS_SSH_PORT }}
        script_stop: true
        script: |
          sudo aws ecr get-login-password --region ap-northeast-2 | sudo docker login --username AWS --password-stdin 647180380627.dkr.ecr.ap-northeast-2.amazonaws.com
          sudo docker pull 647180380627.dkr.ecr.ap-northeast-2.amazonaws.com/test-docker-nest:latest
          counter=`sudo docker container ls -a | sudo grep -c "test-docker-nest"`; if [ $counter -eq 1 ]; then sudo docker container rm -f "test-docker-nest"; else echo "false" ;fi
          sudo docker container run -p 3232:3232 -d --name test-docker-nest 647180380627.dkr.ecr.ap-northeast-2.amazonaws.com/test-docker-nest:latest

작성된 .yaml 코드 및 secrets 설정 다 잘 해주면 정상적으로 배포되어 EC2 인스턴스에 코드가 잘 돌아가는 것을 확인할 수 있다.

 

 

이렇게 github action과 docker를 사용하여 NestJS application을 EC2 인스턴스에 자동 배포 구축하였고, 

이 과정속에서 ECR로 이미지 관리를 하였다.

 

 

다음시간에는 Docker Compose까지 적용을 해볼것이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함