카테고리 없음

Blue/Green 배포

Raconer 2024. 9. 8. 19:49
728x90

Blue Green 배포 

Blue/Green 배포를 해야 할 일이 생겨서 한번 정리 해 보았다.
Docker를 사용하여 개발을 진행 하였지만 실질적으로는 배포를 1개 더해서 도메인 port를 변경하는 방식이다.
개념적인 내용은 하단에 링크를 남겨 놓았고 필요시 GitHub에 Project가 있으니 확인 하면 좋을거 같다.

프로젝트 구성

blue-green
    │   # 실제 배포 Shell 파일
    ├─  deploy.sh 
    │   # 이미지 생성 Dockerfile
    ├─  Dockerfile 
    │   # docker-compose
    ├─  docker-compose.blue.yml 
    ├─  docker-compose.green.yml
    │   # nginx.conf 파일
    ├─  nginx-blue.conf
    ├─  nginx-green.conf
    │   # Gradle 파일
    ├─  build.gradle.kts
    ├─  logs
    │     ├─ blue-green.log
    │     └─ blue-green.log.2024-09-07.0.gz
    ├─src
    │  ├─ main
    │  │  └─ kotlin
    │  │      └─ com
    │  │          └─ bg
    │  │              └─ bluegreen
    │  │                  ├─  BlueGreenApplication.kt
    │  │                  └─  controller
    │  │                        └─ IndexController.kt
    │  └─resources
    │      ├─ application.yml
    │      ├─ static
    │      └─ templates
    └─test
        └─ kotlin
            └─ com
              └─ bg
                  └─ bluegreen
                      └─  BlueGreenApplicationTests.kt

 

Deploy 설명

#!/bin/bash

# Restart Application With Docker
echo ":::: BLUE/GREEN Deploy START ::::"

IMAGE_NAME="blue-green-image"
CONTAINER_NAME="blue-green-container"

echo "Delete Image"
sudo docker rim $IMAGE_NAME:latest

echo "Create Image"
sudo docker build -t $IMAGE_NAME .

echo "Check Docker Running '$CONTAINER_NAME'"

# 1. Blue 를 기준으로 현재 떠있는 컨테이너를 체크한다.
CONTAINER_ID=$(sudo docker ps -q -f name=${CONTAINER_NAME}-blue)

if [ -n "$CONTAINER_ID" ]; then  # 2. IF BLUE RUN -> GREEN RUN
  echo "START GREEN"
  sudo docker compose -f docker-compose.green.yml up -d
  BEFORE_COMPOSE_COLOR="blue"
  AFTER_COMPOSE_COLOR="green"
else # 2. IF BLUE NOT RUN -> RUN BLUE
    echo "START BLUE"
    sudo docker compose -f docker-compose.blue.yml up -d
    BEFORE_COMPOSE_COLOR="green"
    AFTER_COMPOSE_COLOR="blue"
fi

# 어떤 배포가 실행 되는지 확인
echo  "$BEFORE_COMPOSE_COLOR -> $AFTER_COMPOSE_COLOR"

# 3. 새로운 컨테이너가 제대로 떴는지 확인
# EXIST_AFTER=$(sudo docker ps -q -f name=${CONTAINER_NAME}-${AFTER_COMPOSE_COLOR})
EXIST_AFTER=$(docker ps -q -f name=${CONTAINER_NAME}-${AFTER_COMPOSE_COLOR})

if [ -n "EXIST_AFTER" ]; then
  #  nginx 설정 제거후 재실행	
  echo "SET NginX ${AFTER_COMPOSE_COLOR}"
  sudo cp ./nginx-${AFTER_COMPOSE_COLOR}.conf /opt/homebrew/etc/nginx/nginx.conf
  sudo nginx -s reload

  echo "DOWN Container : docker-compose.${BEFORE_COMPOSE_COLOR}.yml"
  # docker compose -p ${CONTAINER_NAME}-${BEFORE_COMPOSE_COLOR} -f docker-compose.${BEFORE_COMPOSE_COLOR}.yml down
  docker compose -f docker-compose.${BEFORE_COMPOSE_COLOR}.yml down

  # 4. 불필요 서버 제거
  # 미사용 이미지 삭제
  # docker image prune -a -f
  # 미 사용 컨테이너 삭제
  docker container prune -f
  # 미 사용 네트워크 삭제
  docker network prune -f
  # 미 사용 볼륨 삭제
  docker volume prune -f

  echo "$BEFORE_COMPOSE_COLOR down"
fi

echo ":::: BLUE/GREEN Deploy END ::::"

실행 순서

1. 실행 서버 확인 (Blue/Green 인지 확인)
2. Blue면 Green, Green이면 Blue 서버 실행
3. 실행 확인
4. nginx로 접근 port 변경
5. 기존 서버 종료

 

https://github.com/Raconer/blue-green-deploy

 

GitHub - Raconer/blue-green-deploy: Blue/Green 배포

Blue/Green 배포 . Contribute to Raconer/blue-green-deploy development by creating an account on GitHub.

github.com

 

 

https://raconer.tistory.com/entry/%EB%A1%A4%EB%A7%81-%EB%B0%B0%ED%8F%AC-Rolling-Deployment-vs-%EB%B8%94%EB%A3%A8-%EA%B7%B8%EB%A6%B0-%EB%B0%B0%ED%8F%AC-Blue-Green-Deployment-vs-%EC%B9%B4%EB%82%98%EB%A6%AC-%EB%B0%B0%ED%8F%AC-Canary-Deployment

 

롤링 배포 (Rolling Deployment) vs 블루-그린 배포 (Blue-Green Deployment) vs 카나리 배포 (Canary Deployment)

1. 롤링 배포 (Rolling Deployment)설명:점진적 업데이트: 전체 시스템을 동시에 업데이트하지 않고, 시스템의 일부 인스턴스에서만 새 버전을 점진적으로 배포합니다.작업 방식: 기존 인스턴스를 하

raconer.tistory.com

 

728x90