Record

이스터에그 (인프라 프로젝트5 / CD , AWS, docker hub 연결) 본문

프로젝트

이스터에그 (인프라 프로젝트5 / CD , AWS, docker hub 연결)

now-record 2025. 11. 15. 21:13
반응형

저번에는 CI(지속적 통합) 단계인 git에서 push를 하면 이미지 빌드를 해서 도커 허브에까지 올리는 과정을 진행했다.

이번에는 CD(지속적 배포) 단계를 해보려고 한다.

현재 구조는 도커허브에 올린 이미지를 EC2에서 pull해서 도커컨테이너로 올리는 과정을 하려고 한다.

 

이 하나의 과정을 git action을 통해서 진행한다고 생각하면 편하다. 

 

[ git action ] - 도커허브에 올리기, EC2에 접속해서 도커허브 pull 당겨와서 docker로 올리기

이걸 이해하기 편하려면 먼저 script를 보는게 편할꺼 같다. 

 

name: Build and Push Docker image to Docker Hub

on:
  push:
    branches: [ "main" ]
  workflow_dispatch: # GitHub 화면에서 수동 실행도 가능하게

jobs:
  build-and-push:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v6
        with:
          context: ./back
          file : ./back/Dockerfile
          push: true
          tags: |
            ${{ secrets.DOCKERHUB_USERNAME }}/easter-egg:latest
            ${{ secrets.DOCKERHUB_USERNAME }}/easter-egg:${{ github.sha }}

  deploy-to-ec2:
    needs: build-and-push            # 위 job 성공 후에만 실행
    runs-on: ubuntu-latest

    steps:
      - name: Deploy to EC2 via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.EC2_HOST }}        
          username: ${{ secrets.EC2_USER }}    
          key: ${{ secrets.EC2_SSH_KEY }}      
          script: |
            docker pull ${{ secrets.DOCKERHUB_USERNAME }}/easter-egg:latest
            docker rm -f easter-egg || true
            docker run -d --name easter-egg -p 80:8000 ${{ secrets.DOCKERHUB_USERNAME }}/easter-egg:latest

 

스크립트에 deploy-to-ec2가 추가 되었고, 현재 내가 vscode로 ssh접속 하듯이 host, username, key를 주어서 ec2에 접속하게 해준다. 

 

그러면 저번과 같이 

 

 

secreat value로 setting을 해준다. ssh_key의 경우 EC2를 생성할때 주었던 .pem key를 활용했다. 

 

 

그리고 현재 인바운드(클라이언트가 접속할때) 규칙인 http의 포트를 80으로 열어놨기 때문에 docker를 실행할때 80:8000으로 바인딩 해준다. 

 

 

그 후 깃으로 push를 하면 actions 탭에 이렇게 진행이 되는걸 확인할 수 있다. 

 

그러면 내가 컨테이너를 키지 않더라도 자동으로 컨테이너가 켜진다. 

 

 

이제 공인 IP주소로 나의 홈페이지로 접속할 수 있다. 

 

 

이제 깃으로 push만 하면 서버에 자동 배포되는걸 알 수 있다. 이후에는 Prometheus / Grafana / node_exporter를 사용해보고자 한다.