docker github도커 깃허브 연동Docker GitHub 설치Git docker imageGithub Action docker 배포

Docker와 GitHub를 이용한 CI/CD 파이프라인 구축 가이드

KUKJIN LEE
KUKJIN LEE
2024년 8월 19일
151

1. Dockerfile 작성

프로젝트 루트에 Dockerfile을 생성합니다.

일반적으로 Dockerfile은 확장자를 사용하지 않습니다. 즉, 파일 이름은 단순히 Dockerfile이 됩니다.

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

 

2. GitHub Actions 워크플로우 설정

.github/workflows/main.yml 파일을 생성합니다.

기타 GitHub Actions 워크플로우, 예를들어 특정 시간에 자동 배포 등 별도의 설정이 존재한다면 코드를 복사 붙여넣기 하시면 안됩니다.

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

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

    steps:
    - uses: actions/checkout@v2

    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14'

    - name: Install dependencies
      run: npm ci

    - name: Run tests
      run: npm test

    - name: Build and push Docker image
      env:
        DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
        DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
      run: |
        docker build -t $DOCKER_USERNAME/my-app:${{ github.sha }} .
        echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin
        docker push $DOCKER_USERNAME/my-app:${{ github.sha }}

    - name: Deploy to server
      env:
        PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
        HOST: ${{ secrets.SERVER_HOST }}
        USER: ${{ secrets.SERVER_USER }}
      run: |
        echo "$PRIVATE_KEY" > private_key && chmod 600 private_key
        ssh -o StrictHostKeyChecking=no -i private_key ${USER}@${HOST} '
          docker pull ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
          docker stop my-app || true
          docker rm my-app || true
          docker run -d --name my-app -p 3000:3000 ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}
        '

 

3. GitHub Secrets 설정

GitHub 레포지토리의 Settings > Secrets에서 다음 시크릿을 추가합니다.

  • DOCKER_USERNAME: Docker Hub 사용자명

  • DOCKER_PASSWORD: Docker Hub 비밀번호

  • SERVER_SSH_KEY: 배포 서버의 SSH 개인키

  • SERVER_HOST: 배포 서버의 IP 주소 또는 호스트명

  • SERVER_USER: 배포 서버의 SSH 사용자명

 

파이프라인 실행

  1. 코드를 변경하고 GitHub main 브랜치에 push합니다.

  2. GitHub Actions 탭에서 워크플로우 실행 상태를 확인합니다.

  3. 성공적으로 완료되면, 애플리케이션이 서버에 배포됩니다.

 

4. 단계 설명

  1. 코드 체크아웃: GitHub 레포지토리에서 최신 코드를 가져옵니다.

  2. 의존성 설치 및 테스트: Node.js 환경을 설정하고, 의존성을 설치한 후 테스트를 실행합니다.

  3. Docker 이미지 빌드 및 푸시: 애플리케이션의 Docker 이미지를 생성하고 Docker Hub에 푸시합니다.

  4. 서버 배포: SSH를 통해 원격 서버에 접속하여 최신 Docker 이미지를 pull하고 실행합니다.

 

CI/CD 파이프라인은 코드 변경사항을 자동으로 테스트하고 배포하여 개발 프로세스의 효율성과 신뢰성을 크게 향상시킬 수 있습니다.

관련 글

[SQL 입문] 필요한 데이터만 콕 집어 가져올 수 있는 WHERE 절

사용자는 테이블에 있는 모든 데이터를 다 보고 싶어 하지는 않습니다. 오히려 특정 항목에 대한 데이터만 가져오고 싶을 때가 훨씬 많습니다. 예를 들어, 어떤 사용자의 이메일이나 ID는 알고 있는데, 그 사람이 언제 우리 앱에 가입했는지 확인하고 싶다고 가정해 봅시다...

2026년 1월 27일10

SQL에서 SELECT란 무엇인가?

데이터베이스를 거대한 서류 보관함이라고 생각하면 됩니다. 보관함 안에는 수많은 데이터가 차곡차곡 쌓입니다. SELECT는 이 보관함에서 "내가 원하는 정보를 찾아줘!"라고 요청하는 명령어입니다. 이 과정을 전문 용어로 '쿼리(Query)'라고 부릅니다. &nbs...

2026년 1월 26일10

[SQL 기초] "언제 하나씩 다 넣어?" 데이터 한 번에 넣기

개발을 하다 보면 데이터베이스(DB)에 샘플 데이터를 대량으로 넣어야 할 때가 있습니다. 메뉴 100개를 추가해야 하는데 INSERT 문을 100번 쓰고 있다면? 너무 비효율적이죠! 오늘은 SQL에서 여러 데이터를 한 번에 넣는 '다중 삽입(Multiple Inse...

2026년 1월 21일13

SQL 데이터 삽입하기

데이터가 없는 데이터베이스는 연료 없는 로켓과 같습니다. 이제 'Missions' 테이블에 새로운 행(row)을 추가하는 방법을 알아보겠습니다. "삽입(Inserting)"은 '데이터 추가'를 의미합니다. 기존 Missions 테이블 ...

2026년 1월 20일12