이번 포스트에서는 github action
을 사용해 dockerhub
에 푸시 -> EC2에서 self-hosted
로 docker pull 받아서 CI/CD를 구축해보겠습니다.
들어가기에 앞서 간단하게 docker에 대해서 알아보겠습니다.
도커는 컨테이너 기술을 기반으로 한 일종의 가상화 플랫폼입니다.
여기서 컨테이너는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 표준화된 유닛입니다.
즉 쉽게 말해서 도커는 독립된 환경을 만들어서 충돌없이 사용할 수 있게 만드는 프로그램이라고 할 수 있습니다.
애플리케이션을 구동하기 위한 환경을 어떤 pc에서도 동일하게 구동하기 위해서 사용합니다.
vm과 달리 추가적인 os를 올리는것이 아니라 container engine을 설치해서 훨씬 가볍게 사용 할 수 있습니다.
위의 이미지에 보이는거와같이 github repo에 push 될때마다 자동으로 CI/CD를 구축해보려고 합니다.
Dockerfile
을 만듭니다.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 . 이미지 생성
docker run -d -p 3000:3000 --name <container-name> <image-name>
명령어를 보면 -p 3000:3000
을 볼 수 있는데 이 명령어는 로컬의 3000번 포트로 접근하는 모든 트래픽을 도커 컨테이너의 3000번 포트로 보낸다는 뜻으로 연결해준다고 볼 수 있습니다.
이후 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
- 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}}
이후 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를 구축해 보았습니다.