-
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가 통신하는 방법
두 가지의 방법이 있다.
- 다른 public IP 에서 실행되는 서버로 통신하기
- docker network 로 묶어서 통신하기
나는 2번을 이용해서 통신해보았다. 2번은 nest.js 앱과 MongoDB 앱을 실행하고 있는 Container들을 하나의 network에 연결시켜 서로 통신할 수 있도록 실행시켰다.
'개발' 카테고리의 다른 글
WebRTC 찍어먹기 (0) 2024.05.01 AWS ec2에 wireguard로 VPN 구축하기 (0) 2023.07.25 크롬 익스텐션의 CORS (0) 2023.01.30 소득 분위 10분위가 전북대에서 1500만원 받고 학교 다니는 방법 (0) 2022.12.02 첫 오픈소스 기여로 배운 점 (1) 2022.11.06