들어가며
이전 글에서는 현재 Feed Server의 서버 구조를 분석하고
Blue-Green 배포 전략을 설계하는 과정을 정리했다.
특히 다음과 같은 사항을 확인했다.
- Docker 기반 MSA 환경
- NGINX Reverse Proxy 구조
- Docker host network 사용
- Blue-Green 포트 전략 설계 (8081 / 8082)
이번 글에서는 이 구조를 기반으로 실제 Blue-Green 배포 환경을 구축하는 과정을 정리하려고 한다.
이번 단계에서 진행한 작업은 다음과 같다.
- Docker 이미지 생성
- GitHub Container Registry(GHCR) 사용
- 서버에서 이미지 Pull 테스트
- Blue / Green 컨테이너 환경 구성
- NGINX 트래픽 전환 테스트
즉 Blue-Green 배포가 실제로 동작하는 환경을 구축하고 검증하는 과정이다.
Docker 이미지 생성
먼저 Feed Server를 Docker 이미지로 빌드할 수 있도록 Dockerfile을 작성했다.
이번 Dockerfile은 멀티 스테이지 빌드(Multi-stage build) 방식으로 구성했다.
FROM eclipse-temurin:17-jdk AS builder
WORKDIR /workspace
COPY gradlew gradlew
COPY gradle gradle
COPY build.gradle settings.gradle ./
RUN chmod +x gradlew
COPY src src
RUN ./gradlew clean bootJar --no-daemon
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=builder /workspace/build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
이 Dockerfile은 크게 두 단계로 구성되어 있다.
1️⃣ Build Stage
첫 번째 단계에서는 Gradle을 사용해 Spring Boot 애플리케이션을 빌드한다.
FROM eclipse-temurin:17-jdk AS builder
JDK 환경에서 Gradle Wrapper를 이용해 애플리케이션을 빌드한다.
RUN ./gradlew clean bootJar --no-daemon
이 과정이 완료되면 다음 위치에 실행 가능한 JAR 파일이 생성된다.
build/libs/
2️⃣ Runtime Stage
두 번째 단계에서는 실제 실행에 필요한 최소 환경만 포함한 이미지를 만든다.
FROM eclipse-temurin:17-jre
빌드 단계에서 생성된 JAR 파일을 복사한다.
COPY --from=builder /workspace/build/libs/*.jar app.jar
그리고 Spring Boot 애플리케이션을 실행한다.
ENTRYPOINT ["java", "-jar", "app.jar"]
멀티 스테이지 빌드를 사용하면 다음과 같은 장점이 있다.
- 빌드 도구(Gradle)가 포함되지 않는다
- 최종 이미지 크기가 작아진다
- 보안적으로도 더 안전하다
Docker 이미지 빌드
Dockerfile을 작성한 후 이미지를 빌드한다.
docker build -t feed-service:test .
빌드가 완료되면 로컬에서 컨테이너 실행 테스트를 진행한다.
docker run -p 8080:8080 feed-service:test
Spring Boot 애플리케이션이 정상적으로 실행되는 것을 확인했다.
GitHub Container Registry 사용
자동 배포 환경을 구축하기 위해 Docker 이미지를 Container Registry에 업로드해야 한다.
이번 프로젝트에서는 GitHub Container Registry(GHCR) 를 사용했다.
이미지 이름은 다음과 같은 형식으로 구성했다.
ghcr.io/<organization>/<repository>:latest
우리 프로젝트에서는 다음과 같은 이미지 이름을 사용했다.
ghcr.io/kbo-note/kbo-note-feed-service:latest
먼저 로컬 이미지를 GHCR 형식으로 태깅한다.
docker tag feed-service:test ghcr.io/kbo-note/kbo-note-feed-service:latest
다음으로 GitHub Container Registry에 로그인한다.
docker login ghcr.io
로그인에는 GitHub Personal Access Token(PAT)을 사용했다.
이후 이미지를 Registry에 Push한다.
docker push ghcr.io/kbo-note/kbo-note-feed-service:latest
Push가 완료되면 GitHub Organization의 Packages 영역에서 이미지가 생성된 것을 확인할 수 있다.
서버에서 이미지 Pull 테스트
다음 단계는 서버에서 이미지를 직접 가져올 수 있는지 확인하는 것이다.
먼저 서버에서 GHCR 로그인을 수행한다.
docker login ghcr.io
이후 이미지를 Pull 한다.
docker pull ghcr.io/kbo-note/kbo-feed-service:latest
이미지가 정상적으로 다운로드되면 다음 단계로 넘어갈 수 있다.
이 단계는 매우 중요한데
Container Registry → 서버 배포 경로가 정상적으로 동작하는지 확인하는 과정이기 때문이다.
Blue / Green 컨테이너 환경 구성
이제 실제 Blue-Green 환경을 구성한다.
이번 프로젝트에서는 다음과 같은 포트 전략을 사용했다.
| 환경 | 포트 |
| Blue | 8081 |
| Green | 8082 |
또한 컨테이너 이름도 다음과 같이 분리했다.
feed-blue
feed-green
먼저 Blue 환경을 실행한다.
docker run -d \
--name feed-blue \
--network host \
-e SERVER_PORT=8081 \
ghcr.io/kbo-note/kbo-note-feed-service:latest
컨테이너가 정상적으로 실행되는지 확인한다.
docker ps
서버에서 직접 요청을 보내 확인했다.
curl localhost:8081
Spring Boot 루트 경로가 정의되어 있지 않아 404 응답이 반환되지만
이는 서버가 정상적으로 실행되고 있다는 의미다.
Green 환경 실행
이제 동일한 이미지를 Green 환경으로 실행한다.
docker run -d \
--name feed-green \
--network host \
-e SERVER_PORT=8082 \
ghcr.io/kbo-note/kbo-feed-service:latest
현재 서버 상태는 다음과 같다.
feed-blue → 8081
feed-green → 8082
즉 두 개의 애플리케이션이 동시에 실행되는 상태다.
Green 환경도 동일하게 테스트한다.
curl localhost:8082
NGINX 트래픽 전환 테스트
현재 NGINX 설정은 다음과 같다.
proxy_pass http://127.0.0.1:8081;
즉 현재 트래픽은 Blue 환경으로 전달되고 있다.
Blue-Green 전환 테스트를 위해 NGINX 설정을 수정했다.
기존 설정
proxy_pass http://127.0.0.1:8081;
변경 후
proxy_pass http://127.0.0.1:8082;
설정을 변경한 후 NGINX 설정을 검증했다.
sudo nginx -t
문제가 없다면 설정을 reload 한다.
sudo systemctl reload nginx
이제 트래픽은 Green 환경으로 전달된다.
Client
↓
NGINX :9000
↓
Feed Server (Green :8082)
마지막으로 기존 Blue 컨테이너를 정리한다.
docker stop feed-blue
docker rm feed-blue
이로써 Blue-Green 전환이 완료되었다.
현재까지 진행 상황
지금까지 진행한 작업을 정리하면 다음과 같다.
✔ Dockerfile 작성
✔ Docker 이미지 빌드
✔ GitHub Container Registry 사용
✔ 서버에서 이미지 Pull 확인
✔ Blue / Green 컨테이너 환경 구축
✔ NGINX 트래픽 전환 테스트
✔ 수동 Blue-Green 배포 검증
즉 Blue-Green 배포가 실제로 동작하는 환경을 구축하고 검증한 상태다.
다음 글에서 다룰 내용
이번 글에서는 Blue-Green 배포를 수동으로 실행하고 검증하는 과정을 다뤘다.
하지만 실제 운영 환경에서는 배포 과정을 자동화해야 한다.
다음 글에서는 다음 내용을 정리할 예정이다.
- Blue-Green 배포 스크립트 작성 (deploy.sh)
- Health Check 자동화
- NGINX 트래픽 자동 전환
- GitHub Actions 기반 자동 배포 구축
최종 목표는 다음과 같은 자동 배포 파이프라인이다.
GitHub Push
↓
GitHub Actions
↓
Docker Image Build
↓
GHCR Push
↓
Server Deploy Script
↓
Blue-Green 배포
↓
NGINX 자동 전환
'💻 프로젝트 > KBO-NOTE' 카테고리의 다른 글
| Docker + Nginx 기반 Blue-Green 배포 구축 (3) — GitHub Actions CI/CD와 자동 배포 스크립트 구축 (0) | 2026.03.15 |
|---|---|
| Docker + Nginx 기반 Blue-Green 배포 구축 (1) — 서버 구조 정리와 배포 전략 설계 (0) | 2026.03.14 |