ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nest.js 와 MongoDB 를 AWS ec2 환경에 Dockerizing 해 Github Actions를 통해 자동화 배포 설정하면서 배운 점
    개발 2023. 7. 13. 15:14

    서론

    SW마에스트로 과정 중 프로젝트 진행을 위해 개발 환경 설정을 테스트 해봤다. 그 중 발생했던 나중에 까먹지 않기 위해 문제와 고민을 정리하고 기록한다.

    nest.js 프로젝트 Dockerize

    프로젝트 최상위 폴더에 Dockerfile 을 생성해준다.

    # 로컬 버전과 일치
    FROM node:18.12.1 # node:18.12.1 이미지 가져오기
    
    # 명령어를 실행할 워크 디렉토리 생성
    RUN mkdir -p /app # mkdir -p /app 커맨드 실행
    WORKDIR /app # /app로 디렉토리 이동
    # 프로젝트 전체를 워크 디렉토리에 추가
    ADD . /app/ # 프로젝트 파일을 모두 /app/ 경로로 복사
    
    # 프로젝트에 사용되는 의존성 설치
    RUN npm install
    
    # nest.js 빌드
    RUN npm run build
    
    # 포트 개방
    EXPOSE 3000 # 3000번 포트 개방
    
    # nest.js 실행
    ENTRYPOINT npm run start # docker를 실행했을 때의 EntryPoint를 설정
    docker build -t {생성할 이미지 이름} {Dockerfile 경로}

    를 통해 프로젝트를 Dockerize 한다.

    Github Actions main.yml 설정

    /.github/workflows/{workflow-name}.yml 파일 작성

    name: {project-name}
    
    on:
      push:
          branches: ["main"]
    env:
      REGISTRY: {registry-name}
      IMAGE_NAME: ${{ github.repository }}
      DOCKER_CONTAINER: {container-name}
    
    jobs:
      test:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout Source Code
            uses: actions/checkout@v3
          - name: Setup node.js 18.12.1
            uses: actions/setup-node@v3
            with: 
              node-version: 18.12.1
              registry-url: https://npm.pkg.github.com/
          - run: npm install
          - run: npm run test
      build:
        needs: test
        runs-on: ubuntu-latest
        steps:
          - name: Checkout Source Code
            uses: actions/checkout@v3
          - name: Set up docker build
            id: buildx
            uses: docker/setup-buildx-action@v2
          - name: Login to ${{ env.REGISTRY }}
            uses: docker/login-action@v2
            with:
              registry: ${{ env.REGISTRY }}
              username: ${{ github.actor }}
              password: ${{ secrets.QR_MENU_GHCR_TOKEN }}
          - name: Build and Push
            id: docker_build
            uses: docker/build-push-action@v3
            with:
              context: .
              push: true
              tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
      deploy:
        needs: build
        runs-on: [self-hosted, {self-hosted-label}]
        steps:
          - name: Login to ${{ env.REGISTRY }}
            uses: docker/login-action@v2
            with:
              registry: ${{ env.REGISTRY }}
              username: ${{ github.actor }}
              password: ${{ secrets.QR_MENU_GHCR_TOKEN }}
          - name: Stop and Remove running Containers and Images
            run:
              ( docker stop ${{ env.DOCKER_CONTAINER }} || true ) && ( docker rm ${{ env.DOCKER_CONTAINER }} || true ) && ( docker rmi ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest || true )
          - name: Run docker
            run:
              docker run --name ${{ env.DOCKER_CONTAINER }} -d -p 80:3000 --restart always ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
              docker image prune -af

    위에 작성된 내용대로 테스트 후 도커 이미지를 빌드해 registry에 push하고 원격 서버에 접속해 배포한다.

    Github Actions 과 AWS ec2는 어떻게 연결되는가?

    ssh 접속을 통한 방법도 있지만 키값을 github에 저장하는 게 불안해서 self-hosted라는 기능을 사용해 ec2와 연결을 했다. github repository > settings > actions > runner 에 들어가 원격 서버에 맞는 운영체제에 맞춰 설정을 해주면 원격 서버에 스크립트를 실행할 수 있다.

    self-hosted runner란?

    Github Actions에서 Software, Hardware, OS의 기능을 이용할 수 있게 하는 시스템이다. Github-hosted runner 보다 더 많은 기능을 제공한다. Github-hosted runner는 이미 짜여진 스크립트만 실행 가능하다. 그와 다르게 self-hosted runner 는 더 자유롭게 스크립트를 실행할 수 있다.

    Docker vs Docker Compose

    Docker는 이미지를 컨테이너에 올려 실행시키는 소프트웨어이다. 이를 Docker Compose 를 이용해 관리할 수 있다. Docker Compose는 Docker 컨테이너들을 관리하는 등 Kubernates와 비슷한 역할을 한다.

    container에서 실행되는 nest.js 와 MongoDB가 통신하는 방법

    두 가지의 방법이 있다.

    1. 다른 public IP 에서 실행되는 서버로 통신하기
    2. docker network 로 묶어서 통신하기

    나는 2번을 이용해서 통신해보았다. 2번은 nest.js 앱과 MongoDB 앱을 실행하고 있는 Container들을 하나의 network에 연결시켜 서로 통신할 수 있도록 실행시켰다.

    댓글

Designed by Tistory.