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
롤링 배포 (Rolling Deployment) vs 블루-그린 배포 (Blue-Green Deployment) vs 카나리 배포 (Canary Deployment)
1. 롤링 배포 (Rolling Deployment)설명:점진적 업데이트: 전체 시스템을 동시에 업데이트하지 않고, 시스템의 일부 인스턴스에서만 새 버전을 점진적으로 배포합니다.작업 방식: 기존 인스턴스를 하
raconer.tistory.com
728x90