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 |
더보기
---
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 애플리케이션를 확인합니다.
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 애플리케이션를 확인합니다.
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
'리눅스' 카테고리의 다른 글
[draft] FTP 서버에 접속하고 모든 파일을 로컬 디렉토리에 다운로드하는 스크립트 (0) | 2024.07.11 |
---|---|
[draft] docker compose의 version 속성이 폐지되었다는 경고 메시지 (0) | 2024.07.07 |
[draft] 우분투에 JDK을 설치하고 환경 변수를 설정하는 방법 (0) | 2024.07.06 |
[draft] 도커 컨테이너와 도커 컴포즈에서 타임존을 설정하는 방법 (0) | 2024.07.05 |
[draft] Debian 계열의 코드이름 체계 (0) | 2024.07.04 |