[인프라] CI/CD 깃허브 액션에 도커컴포즈 적용하기

2026. 5. 7. 01:56·CS/인프라

https://dev-dx2d2y-log.tistory.com/241

 

[인프라] CI/CD와 깃허브 액션

CI/CD수동배포에서의 업데이트https://dev-dx2d2y-log.tistory.com/240 [인프라] AWS란? (AWS 왕왕기초) + 수동배포AWS개발이 끝났다면 내가 만든 애플리케이션을 사용자들이 사용할 수 있도록 배포를 해야한다.

dev-dx2d2y-log.tistory.com

저번에는 깃허브 액션을 통한 CI/CD 파이프라인을 구축했다.

이번에는 여기에 도커컴포즈를 적용시켜보려한다.


도커컴포즈 문서작성하기

version: "3.8"

services:
  app:
    image: kdhyun422/conx-server:${IMAGE_TAG}
    container_name: conx
    ports:
      - "80:8080"
    restart: unless-stopped
    environment:
      - SPRING_PROFILES_ACTIVE=prod

루트 디렉토리에 다음과 같이 docker-compose.yml 파일을 작성하면 된다. 저게 하나의 컨테이너가 된다.

보면 이미지 이름과 태그이름 (태그이름은 환경변수를 통해 얻는 중이며, 보통 그 환경변수는 .env 파일에 있다.) 을 지정하고, 컨테이너 이름도 지정하고, 포트와 restart 기준을 지정한다.

 

즉, 저번에 다뤘던 CD 과정의 대부분을 이 docker-compose의 한 속성으로 관리 중이다.

version: "3.8"

services:
  app:
    image: kdhyun422/conx-server:${IMAGE_TAG}
    ports:
      - "80:8080"
    restart: unless-stopped
    environment:
      - SPRING_PROFILES_ACTIVE=prod

    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/health/ready" ]
      interval: 10s
      timeout: 3s
      retries: 5

  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD_ADMIN}
      MYSQL_DATABASE: conx
      MYSQL_USER: conx
      MYSQL_PASSWORD: ${DATABASE_PASSWORD_USER}
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

도커컴포즈에 mysql까지 추가한 모습. 로컬이나 테스트 환경에서는 mysql을 컨테이너에 띄워서 사용하기도하는데 운영 환경에서는 RDS를 주로 사용한다고하기 때문에... (레디스도 비슷한 상황이다) 간단하게만 구성했다.

 

이러면 전에는 매번 컨테이너를 빌드하고 띄운 다음에 EC2가 실행시켜야했지만.. 도커컴포즈 하나면 이 컨테이너들을 한 번에 실행시킬 수 있다. 추가로 healthcheck 속성을 통해서 빌드 후에 수행할 명령어를 입력할 수 있다. 위는 app 속성에 대해서 10초 간격으로 5회 반복 테스트를 수행, 3초를 타임아웃으로 지정한다.

 

name: CONX server CD
on:
  workflow_run:
    workflows:
      - "CI"
    types:
      - completed

jobs:
  deploy:
    if: >
      github.event.workflow_run.conclusion == 'success' &&
      github.event.workflow_run.event == 'push' &&
      github.event.workflow_run.head_branch == 'main'
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.event.workflow_run.head_sha }}

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

      - name: Login Docker
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Build and Push Docker Image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile
          push: true
          platforms: linux/amd64, linux/arm64
          tags: |
            kdhyun422/conx-server:latest
            kdhyun422/conx-server:${{ github.event.workflow_run.head_sha }}
      
      - name: Deploy to EC2
        uses: appleboy/ssh-action@v1.0.3
        with:
            host: ${{ secrets.EC2_HOST }}
            username: ubuntu
            key: ${{ secrets.EC2_KEY }}
            script: |
              IMAGE_TAG = ${{ github.event.workflow_run.head_sha }}
              echo "IMAGE_TAG=$IMAGE_TAG" > .env
              
              sudo docker compose pull
              sudo docker compose up -d              
              
              for i in {1..10}; do
                if curl -f http://localhost:80/health/ready; then
                  echo "Health Check passed"
                  break
                fi
                echo "Waiting for Service..."
                sleep 2
              done
  
              curl -f http://localhost:80/health/ready || exit 1
              
              sudo docker image prune -f

그럼 CD 파일도 이렇게 바뀐다.

매번 이미지를 띄우고 컨테이너를 실행시키는 것이 아니라 각 컨테이너의 속성을 도커컴포즈 파일에 적어놓기만하면 docker compose up 명령어만으로 여러 컨테이너를 일괄적으로 구동시킨다.

 

그리고 이전에는 컨테이너를 구동할 때 이미 돌고 있는 컨테이너가 있다면 끄고 구동했는데, 도커컴포즈를 사용하면 이 기능이 기본적으로 수행되기 때문에 딱히 컨테이너가 이미 돌고 있는지 검사할 필요가 없다고한다.

도커컴포즈 파일에 헬스체크 로직이 있지만 CD 쪽에서도 헬스체크 로직을 두는 것이 좋다고한다.

 

암튼 이렇게 도커컴포즈를 통해서 CI/CD를 구축하였다.

도커컴포즈를 사용해서 더 확장성이 높아졌다고 할 수 있다. 여러 개의 이미지와 컨테이너를 구동하는 것보다 도커컴포즈를 통해 한 번에 구동시킬 수 있기 때문이다.

'CS > 인프라' 카테고리의 다른 글

[인프라] 도전! 실전 깃허브 액션  (0) 2026.05.12
[인프라] CI/CD와 깃허브 액션  (0) 2026.05.07
[인프라] AWS란? (AWS 왕왕기초) + 수동배포  (0) 2026.05.06
[인프라] 도커란? (도커왕왕기초)  (0) 2026.05.06
'CS/인프라' 카테고리의 다른 글
  • [인프라] 도전! 실전 깃허브 액션
  • [인프라] CI/CD와 깃허브 액션
  • [인프라] AWS란? (AWS 왕왕기초) + 수동배포
  • [인프라] 도커란? (도커왕왕기초)
컬러잇
컬러잇
탄천러너지망생
  • 컬러잇
    Color it
    컬러잇
  • 전체
    오늘
    어제
    • 분류 전체보기 (235) N
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (72) N
        • JVM (12)
        • 인프라 (5)
        • 백엔드 (22) N
        • 논리회로 (5)
        • 언어구현 (1)
        • 인공지능 (1)
        • 코드설계 (3)
        • 컴퓨터구조 (9)
        • 데이터베이스 (4)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (65)
        • Java | Kotlin (49)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (4)
      • 고찰 (35)
        • CEOS 23기 회고록 (9)
  • 링크

    • 교양있는컬러잇
  • 최근 글

  • 인기 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.5
컬러잇
[인프라] CI/CD 깃허브 액션에 도커컴포즈 적용하기
상단으로

티스토리툴바