본문 바로가기

리눅스

[draft] Docker Compose를 사용하여 Blue-Green 배포를 구현하는 방법

728x90

Docker Compose를 사용하여 Blue-Green 배포를 구현하는 방법

두 개의 Spring Boot 애플리케이션(Blue와 Green)을 Nginx를 통해 라우팅하는 구성을 만들었습니다.

컨테이너 구성

hostname application port target port published 비고
nginx nginx 80 80  
blue-app java(spring boot) 8080 8081  
green-app java(spring boot) 8080 8082  

architecture

더보기

---

1. 프로젝트 구조

/myapp
│
├── Spring Boot 애플리케이션
│   ├── Dockerfile
│   └── target
│       └── myapp.jar
│
├── nginx
│   ├── Dockerfile
│   ├── nginx.conf
│   └── switch.sh
│
└── docker-compose.yml

2. 애플리케이션 빌드 및 실행

  • Spring Boot 애플리케이션 Dockerfile(blue-app/green-app)
vim Dockerfile
FROM openjdk:17-jdk-slim

VOLUME /apps

COPY ./demo/build/libs/*.jar /apps/myapp.jar

ENTRYPOINT ["java", "-jar", "/apps/myapp.jar"]

3. Nginx 설정 파일

vim nginx.conf
http {
    upstream blue {
        server blue-app:8080;
    }

    upstream green {
        server green-app:8080;
    }

    map $upstream_version $backend {
        default blue;
        green green;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://$backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

4. 스위치 스크립트(switch.sh)

vim switch.sh
#!/bin/bash

NGINX_CONF=/etc/nginx/nginx.conf

nginx_conf_test() {
    nginx -t
    if [ $? -ne 0 ]; then
        echo "Nginx configuration test failed."
        exit 1
    fi
}

if [ "$1" == "green" ]; then
    echo "Switching to green..."
    sed -i 's/default blue;/default green;/g' $NGINX_CONF
elif [ "$1" == "blue" ]; then
    echo "Switching to blue..."
    sed -i 's/default green;/default blue;/g' $NGINX_CONF
else
    echo "Usage: switch.sh [blue|green]"
    exit 1
fi

nginx_conf_test

nginx -s reload

if [ $? -eq 0 ]; then
    echo "Switched to $1 successfully."
else
    echo "Failed to switch to $1. Check Nginx configuration."
    exit 1
fi

5. Nginx Dockerfile

vim Dockerfile
# Base 이미지 설정
FROM nginx:latest

# Nginx 설정 파일 복사
COPY ./nginx.conf /etc/nginx/nginx.conf

# 스위치 스크립트 복사 및 실행 권한 부여
COPY ./switch.sh /apps/switch.sh
RUN chmod +x /apps/switch.sh

# 컨테이너가 시작될 때 실행할 명령
CMD ["nginx", "-g", "daemon off;"]

---

1. Docker Compose 파일

vim docker-compose.yml
version: '3.8'

services:
  blue-app:
    image: anti1346/demo:blue-green
    container_name: blue-app
    restart: on-failure
    hostname: blue-app
    volumes:
      - /usr/share/zoneinfo/Asia/Seoul:/etc/localtime:ro
    ports:
      - "8081:8080"
    networks:
      - myapp-net

  green-app:
    image: anti1346/demo:blue-green
    container_name: green-app
    restart: on-failure
    hostname: green-app
    volumes:
      - /usr/share/zoneinfo/Asia/Seoul:/etc/localtime:ro
    ports:
      - "8082:8080"
    networks:
      - myapp-net

  nginx:
    image: anti1346/nginx:blue-green
    container_name: nginx
    restart: on-failure
    hostname: nginx
    volumes:
      - /usr/share/zoneinfo/Asia/Seoul:/etc/localtime:ro
    depends_on:
      - blue-app
      - green-app
    ports:
      - "80:80"
    healthcheck:
      test: ["CMD-SHELL", "curl --silent --fail localhost || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
    networks:
      - myapp-net

networks:
  myapp-net:
    name: myapp-net
    driver: bridge

2. Docker Compose를 사용하여 모든 컨테이너를 실행

docker compose up -d

3. Blue-Green 배포 스위칭

  • 스위치 스크립트를 실행하여 Blue와 Green 인스턴스를 전환할 수 있습니다.

Green으로 전환합니다.

docker exec -it nginx /apps/switch.sh green
$ docker exec -it nginx /apps/switch.sh green
Switching to green...
2024/07/06 20:15:19 [notice] 917#917: signal process started
Switched to green successfully.

웹 브라우저에서 Green 애플리케이션를 확인합니다.

web_browser

Blue로 전환합니다.

docker exec -it nginx /apps/switch.sh blue
$ docker exec -it nginx /apps/switch.sh blue
Switching to blue...
2024/07/06 20:18:49 [notice] 1062#1062: signal process started
Switched to blue successfully.

웹 브라우저에서 Blue 애플리케이션를 확인합니다.

web_browser

 

Docker Compose를 사용하여 Blue-Green 배포를 쉽게 구현할 수 있습니다. Nginx를 통해 Blue와 Green 애플리케이션 인스턴스를 전환하면서 무중단 배포를 할 수 있습니다.

 

참고URL

- AWS Documentation : AWS WhitepaperBlue/green deployments

- RedHat topics : Blue-Green Deployment(블루 그린 배포)란?

- Cloud Foundry Documentation : Using blue-green deployment to reduce downtime

 

728x90