💻 프로젝트/KBO-NOTE

Docker + Nginx 기반 Blue-Green 배포 구축 (2) — Docker 이미지 배포와 Blue-Green 환경 구축

SoloQuest 2026. 3. 15. 01:29

들어가며

이전 글에서는 현재 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 자동 전환