Blue-Green Docker 배포 구조에서 사용 중이지 않은 Slot 안전하게 정리하기 (GitHub Actions 자동화)

안상운·2025년 6월 16일

OnTheTop - 프로젝트

목록 보기
11/12

✨ 목적

Blue-Green 배포를 사용하는 경우, 두 슬롯(blue/green)에 서로 다른 버전의 Docker 컨테이너가 동시에 떠 있는 상태에서 배포가 이루어집니다. 새 버전이 성공적으로 배포되고 안정성이 확인되면, 이전 버전은 삭제해주는 것이 좋습니다.
이 글에서는 GitHub Actions를 사용하여 확정된 버전만 남기고, 나머지 Docker 컨테이너를 자동으로 삭제(clean-up)하는 워크플로우를 소개합니다.


📌 핵심 아이디어

  • MIG로 운영 중인 GCP 인스턴스에 배포된 두 슬롯(blue/green)의 컨테이너 중에서 확정된 버전(confirm_version)과 일치하지 않는 컨테이너를 삭제합니다.
  • 두 슬롯 모두 같은 버전일 경우 → 현재 Nginx에서 사용 중인 슬롯만 유지하고 나머지는 삭제합니다.

🧱 Workflow 구조 요약

1. workflow_dispatch로 수동 실행

버전 입력을 직접 받기 위해 workflow_dispatch 이벤트 사용:

on:
  workflow_dispatch:
    inputs:
      confirm_version:
        description: '확정할 배포 버전 (예: 1.0.3)'
        required: true

2. GCP MIG 인스턴스의 IP 목록 조회

gcloud CLI를 통해 MIG에 속한 모든 인스턴스의 내부 IP를 추출합니다:

INSTANCE_NAMES=$(gcloud compute instance-groups managed list-instances ...)
...
gcloud compute instances describe "$INSTANCE" --zone "$TRY_ZONE"

3. SSH 접속 설정

Jump Host와 실제 인스턴스에 접근할 수 있도록 SSH 키 및 ProxyCommand 세팅:

ssh -o ProxyCommand="ssh -i ~/.ssh/jump_key -W %h:%p ubuntu@$JUMP_HOST" \
    -i ~/.ssh/dev_key ubuntu@$IP ...

4. 컨테이너 정리 로직 (서버 내부 실행)

다음 로직을 각 인스턴스에서 수행합니다:

  • 컨테이너 개수 확인 (2개 아닐 경우 에러 처리)
  • 두 컨테이너가 모두 동일 버전이면, Nginx 설정에서 어떤 슬롯을 쓰고 있는지 확인 후 그 슬롯만 남기고 삭제
  • 아니면 확정 버전(CONFIRM_VERSION)과 다른 컨테이너를 제거
ACTIVE_PORT=$(grep "proxy_pass" /etc/nginx/sites-enabled/backend | grep -oE '[0-9]+')
if [ "$ACTIVE_PORT" = "8080" ]; then
    ACTIVE_SLOT=blue
else
    ACTIVE_SLOT=green
fi

📋 정리 요약

  • ✅ 유지된 컨테이너, 🗑️ 삭제된 컨테이너, ❎ 존재하지 않은 슬롯을 Summary로 출력
  • docker rm -f를 사용해 실행 중인 컨테이너도 안전하게 강제 제거 가능

🔒 보안 및 권한 주의사항

  • 해당 스크립트는 Docker 컨테이너 강제 종료 및 삭제를 수행하므로 확정된 배포 버전인지 반드시 확인한 후 실행해야 합니다.
  • Nginx 설정 경로(/etc/nginx/sites-enabled/backend)는 환경에 따라 다를 수 있으므로 프로젝트에 맞게 수정하세요.

✅ 전체 Workflow 예시 파일

  • 확정용 파일

  • 도커 이미지 삭제

👉 전체 GitHub Actions workflow는 아래 Gist에서 확인할 수 있습니다:

(블로그에 올릴 때 Gist나 GitHub 링크 첨부하면 좋아요!)


필요하면 제목, 설명 부분 더 다듬어줄게.
마크다운 또는 Notion용 형식으로도 변환해줄 수 있어. 어떻게 보여줄까?

0개의 댓글