들어가며
현재 진행 중인 프로젝트는 MSA(Microservice Architecture) 기반으로 구성되어 있고,
각 서비스는 서비스별 GitHub Repository로 분리되어 관리되고 있다.
나는 이 중 Feed Server를 담당하고 있으며, 초기 개발 단계에서 Docker 컨테이너 환경도 직접 구성했다.
이번에 새로 진행하려는 작업은 Feed Server에 Blue-Green 배포 전략을 적용하고 자동 배포 환경을 구축하는 것이다.
최종적으로 목표로 하는 배포 구조는 다음과 같다.
GitHub Push
↓
GitHub Actions
↓
Docker Image Build
↓
Container Registry Push
↓
Server Pull
↓
Blue-Green 배포
↓
NGINX 트래픽 전환
하지만 자동 배포를 구축하기 전에 현재 서버 구조를 먼저 정확히 정리할 필요가 있었다.
이번 글에서는 현재 Feed Server가 어떤 구조로 운영되고 있는지 정리하고,
Blue-Green 배포 전략을 설계한 과정을 기록하려고 한다.
현재 서버 환경
먼저 서버에 접속해서 현재 실행 중인 컨테이너들을 확인했다.
docker ps
현재 서버는 여러 서비스가 동시에 실행되는 Docker 기반 MSA 환경이었다.
여러 서비스 컨테이너가 실행 중이었고,
내가 담당하는 Feed Server도 Docker 컨테이너 형태로 실행되고 있었다.
Feed Server 컨테이너 내부에서는 Spring Boot 애플리케이션이 실행되는 구조다.
즉 전체 구조는 다음과 같다.
Docker Container
↓
Spring Boot Application
↓
Feed Service
Feed Server는 처음 개발할 때 Docker 이미지로 빌드하고 컨테이너 형태로 실행되도록 구성해 두었다.
Feed Server 네트워크 구조
다음으로 컨테이너 네트워크 설정을 확인했다.
확인해 보니 Feed Server 컨테이너는 Docker host network 모드로 실행되고 있었다.
host network 모드의 특징은 다음과 같다.
컨테이너 포트 = 서버 포트
일반적인 Docker 실행 방식에서는 다음과 같이 포트를 매핑한다.
hostPort:containerPort
하지만 host network 모드에서는 컨테이너가 서버 네트워크를 그대로 사용하기 때문에 포트 매핑이 따로 존재하지 않는다.
이 구조는 설정이 단순하다는 장점이 있지만, 여러 서비스가 동시에 실행되는 환경에서는 포트 충돌에 주의해야 한다.
NGINX 트래픽 흐름 확인
다음으로 외부 요청이 Feed Server로 어떻게 전달되는지 확인했다.
현재 서버에서는 NGINX가 Reverse Proxy 역할을 하고 있다.
구조는 다음과 같다.
Client
↓
API Gateway
↓
NGINX
↓
Feed Server
NGINX 설정을 확인해 보니 다음과 같은 구조였다.
listen 9000
proxy_pass → 127.0.0.1:8081
즉 현재 트래픽 흐름은 다음과 같다.
API Gateway
↓
NGINX (9000)
↓
Feed Server (8081)
실제로 연결이 정상적으로 동작하는지도 확인했다.
curl localhost:9000
curl localhost:8081
Spring Boot 애플리케이션의 루트 경로가 정의되어 있지 않아 404 응답이 반환되었지만, 이는 정상적인 동작이다.
즉 NGINX → Feed Server 연결 구조는 문제없이 동작하고 있었다.
Blue-Green 배포 전략 설계
현재 구조를 기반으로 Blue-Green 배포 전략을 설계했다.
Blue-Green 배포의 핵심은 두 개의 동일한 환경을 준비한 뒤 트래픽을 전환하는 것이다.
이번 프로젝트에서는 다음과 같은 포트 전략을 사용하기로 했다.
| 환경 | 포트 |
| Blue | 8081 |
| Green | 8082 |
현재 상태는 다음과 같다.
NGINX → 8081
즉 현재 Feed Server는 Blue 환경으로 실행되고 있는 상태다.
Blue-Green 배포 시에는 다음과 같은 흐름으로 배포가 진행된다.
1. 새로운 버전을 Green 환경(8082)에 실행
2. Health Check 수행
3. NGINX 트래픽을 8082로 전환
4. 기존 Blue 환경 종료
이 방식의 가장 큰 장점은 무중단 배포가 가능하다는 것이다.
컨테이너 구조 변경 계획
기존에는 Feed Server 컨테이너가 하나의 이름으로 실행되고 있었다.
하지만 Blue-Green 배포를 위해 다음과 같이 두 개의 컨테이너 구조로 변경할 계획이다.
feed-blue
feed-green
예를 들어 다음과 같은 구조다.
feed-blue → 8081
feed-green → 8082
이렇게 구성하면 두 버전을 동시에 실행할 수 있고
트래픽을 원하는 시점에 전환할 수 있다.
컨테이너 실행 중 발생한 문제
Blue 환경을 테스트하는 과정에서 다음과 같은 문제가 발생했다.
Web server failed to start. Port 8080 was already in use.
Spring Boot 기본 포트는 8080인데
이미 서버에서 해당 포트를 사용하는 서비스가 존재했기 때문이다.
또한 Feed Server 컨테이너는 host network 모드를 사용하고 있기 때문에
컨테이너 내부 포트 역시 서버 포트와 동일하게 사용된다.
즉 포트를 명시적으로 지정하지 않으면 포트 충돌이 발생할 수 있는 구조였다.
해결 방법
이 문제는 Spring Boot 실행 포트를 명시적으로 지정하여 해결했다.
Blue 환경
SERVER_PORT=8081
Green 환경
SERVER_PORT=8082
이렇게 실행하면 두 환경이 서로 다른 포트를 사용하게 되어
충돌 없이 동시에 실행할 수 있다.
현재까지 진행 상황
지금까지 진행한 작업을 정리하면 다음과 같다.
✔ Feed Server Docker 환경 확인
✔ 서버 네트워크 구조 분석
✔ NGINX Reverse Proxy 구조 확인
✔ Blue-Green 포트 전략 설계
✔ 컨테이너 구조 변경 계획
✔ 포트 충돌 문제 해결
다음 글에서 다룰 내용
다음 글에서는 실제 Blue-Green 자동 배포 환경 구축 과정을 정리할 예정이다.
다룰 내용은 다음과 같다.
- Docker 이미지 관리
- Container Registry 사용
- GitHub Actions CI/CD 구축
- Blue-Green 자동 배포 스크립트 작성
- NGINX 트래픽 자동 전환
마무리
Blue-Green 배포를 구축하기 전에 현재 서버 구조를 정확히 이해하는 과정이 매우 중요했다.
특히 이번 환경에서는
- Docker host network
- NGINX Reverse Proxy
- 여러 서비스가 동시에 실행되는 MSA 환경
이 세 가지 요소를 먼저 정리해야 했다.
다음 글에서는 이 구조를 기반으로 실제 자동 배포 파이프라인을 구축하는 과정을 정리할 예정이다.
'💻 프로젝트 > KBO-NOTE' 카테고리의 다른 글
| Docker + Nginx 기반 Blue-Green 배포 구축 (3) — GitHub Actions CI/CD와 자동 배포 스크립트 구축 (0) | 2026.03.15 |
|---|---|
| Docker + Nginx 기반 Blue-Green 배포 구축 (2) — Docker 이미지 배포와 Blue-Green 환경 구축 (0) | 2026.03.15 |