프론트도 AWS Ec2에 배포해보자(3)

김동영·2023년 12월 29일
1

EC2

목록 보기
3/3

이번 포스트에서는 github action을 사용해 dockerhub에 푸시 -> EC2에서 self-hosted로 docker pull 받아서 CI/CD를 구축해보겠습니다.

들어가기에 앞서 간단하게 docker에 대해서 알아보겠습니다.

Docker란??

도커는 컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼입니다.
여기서 컨테이너는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 표준화된 유닛입니다.

즉 쉽게 말해서 도커는 독립된 환경을 만들어서 충돌없이 사용할 수 있게 만드는 프로그램이라고 할 수 있습니다.


Docker를 쓰는이유는??

  • 애플리케이션을 구동하기 위한 환경을 어떤 pc에서도 동일하게 구동하기 위해서 사용합니다.

  • vm과 달리 추가적인 os를 올리는것이 아니라 container engine을 설치해서 훨씬 가볍게 사용 할 수 있습니다.



Docker를 사용해 CI/CD

위의 이미지에 보이는거와같이 github repo에 push 될때마다 자동으로 CI/CD를 구축해보려고 합니다.

1. DockerFile 만들기

  • 프로젝트 root 디렉토리에 Dockerfile을 만듭니다.
  • Docker 이미지를 빌드하기 위해 Dockerfile 작성합니다.
# 가져올 이미지를 정의
FROM node

# 경로 설정하기
WORKDIR /app

# package.json 워킹 디렉토리에 복사 (.은 설정한 워킹 디렉토리를 뜻함)
COPY package.json .

# 명령어 실행 (의존성 설치)
RUN yarn

# 현재 디렉토리의 모든 파일을 도커 컨테이너의 워킹 디렉토리에 복사한다.
COPY . .


# 3000번 포트 노출
EXPOSE 3000

# yarn start 스크립트 실행
CMD ["yarn", "start"]

# 그리고 Dockerfile로 docker 이미지를 빌드해야한다.
# $ docker build . 이미지 생성 


그이후에 만들어진 이미지로 test로 컨테이너를 띄우려면 아래의 명령어대로 하면됩니다.
docker run -d -p 3000:3000 --name <container-name> <image-name>

명령어를 보면 -p 3000:3000을 볼 수 있는데 이 명령어는 로컬의 3000번 포트로 접근하는 모든 트래픽을 도커 컨테이너의 3000번 포트로 보낸다는 뜻으로 연결해준다고 볼 수 있습니다.



2. github action작성

이후 github action을 통해 CI/CD를 구축해야하기때문에 아래와 같이 작성해 보았습니다.

name: Test workflow                    # Workflow 이름
on:                                  # Event 감지
  push:
    branches:
      - develop
jobs:
  CI:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        
      - name: docker login
        uses: docker/login-action@v2
        with:
          username: ${{secrets.DOCKER_USERNAME}}
          password: ${{secrets.DOCKER_PASSWORD}}
          
      - name: docker image build
        run: docker build -t ${{ secrets.DOCKER_USERNAME }}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}} .

      - name: push image to Docker Hub
        run: docker push ${{secrets.DOCKER_USERNAME}}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}}
        
        
  deploy:
        needs: CI
        name: CD
        runs-on: self-hosted
        defaults:
          run:
              working-directory: ../..
              
        steps:
        - name: Log in to Docker Hub
          uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
          with:
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}

            
        - name: docker stop container
          run: |
            sudo docker stop $(sudo docker ps -aq) || true
        - name: pull image from docker hub
          run: |
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}}
        - name: docker run
          run: |
            docker run -d -p 3000:3000 ${{ secrets.DOCKER_USERNAME }}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}}
  • secrets 설정은 github 레포지토리에서 Settings > Secrets and variables > Actions > New repository secret을 눌러서 생성 할 수 있습니다.

yml파일을 하나하나 뜯어서 보자면

jobs:
  CI:
    runs-on: ubuntu-latest     
  • CI는 github-action에서 제공해주는 ubuntu로 진행

- name: docker login
        uses: docker/login-action@v2
        with:
          username: ${{secrets.DOCKER_USERNAME}}
          password: ${{secrets.DOCKER_PASSWORD}}
          
      - name: docker image build
        run: docker build -t ${{ secrets.DOCKER_USERNAME }}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}} .

      - name: push image to Docker Hub
        run: docker push ${{secrets.DOCKER_USERNAME}}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}}
  • docker hub 이미지를 push 하기위한 로그인
  • docker image build 및 push

deploy:
        needs: CI
        name: CD
        runs-on: self-hosted
        defaults:
          run:
              working-directory: ../..
        steps:
        - name: Log in to Docker Hub
          uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
          with:
            username: ${{ secrets.DOCKER_USERNAME }}
            password: ${{ secrets.DOCKER_PASSWORD }}
  • self-hosted로 CD 수행
  • docker hub 에서 image를 받아오기 위해 로그인

        - name: docker stop container
          run: |
            sudo docker stop $(sudo docker ps -aq) || true
        - name: pull image from docker hub
          run: |
            docker pull ${{ secrets.DOCKER_USERNAME }}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}}
        - name: docker run
          run: |
            docker run -d -p 3000:3000 ${{ secrets.DOCKER_USERNAME }}/${{secrets.IMAGE_NAME}}:${{secrets.IMAGE_TAG}}
  • 기존에 실행중인 컨테이너 중지
  • docker hub에서 image pull 받아서 container 실행

이후 self-hosted로 실행되는 ec2에 docker를 설치하고 도커를 실행할 권한을 줘야합니다.

1. 우분투 시스템 패키지 업데이트
sudo apt-get update

2. 필요한 패키지 설치
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-commonsudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

3. Docker의 공식 GPG키를 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. Docker의 공식 apt 저장소를 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

5. 시스템 패키지 업데이트
sudo apt-get update

6. Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io

#docker 로그인 할때 오류 발생
sudo usermod -a -G docker $USER

이후에는 EC2에서 docker hub에 login 해보고 image를 pull 받아서 실행시켜봐서 잘 동작하게 된다면 github-action에서 작성한 workflow도 실행 해 보면 시간이 오래 걸렸지만 아래와같이 성공적으로 배포가 완료됩니다.

이번 포스트에서는 docker를 사용해서 CI/CD를 구축해 보았습니다.

profile
안녕하세요 프론트엔드개발자가 되고싶습니다

0개의 댓글