Docker와 Nginx를 활용한 Reverse Proxy 구축 및 다중 애플리케이션 배포 전략
**초록:** 본 논문에서는 Docker와 Nginx를 활용하여 다중 애플리케이션(Spring Boot, React)을 배포하고, Nginx를 Reverse Proxy로 활용하여 효율적인 트래픽 라우팅을 구현하는 과정을 상세히 기술한다. Ubuntu 22.04 LTS 개발 환경과 Debian 기반 가상 머신(VM) 환경에서의 실제 구축 과정과 발생 가능한 문제점 및 해결 방안을 제시하며, Dockerfile 작성, 이미지 빌드 및 배포, Nginx 설정 등의 구체적인 단계를 소스 코드와 함께 제시한다.
**1. 서론**
현대적인 웹 애플리케이션 개발 환경에서는 Docker와 Nginx의 활용이 필수적이다. Docker는 애플리케이션의 컨테이너화를 통해 개발, 배포, 운영 환경의 일관성을 유지하며, Nginx는 Reverse Proxy 및 로드 밸런싱 기능을 제공하여 안정적이고 효율적인 서비스 운영을 가능하게 한다. 본 연구에서는 Spring Boot와 React 애플리케이션을 Docker로 컨테이너화하고, Nginx를 이용하여 Reverse Proxy를 구축하는 과정을 실제 구현 사례를 바탕으로 자세히 논의한다.
**2. 연구 환경 및 설계**
* **개발 환경:** Ubuntu 22.04 LTS
* **배포 환경:** Debian 기반 가상 머신(VM), IP: 192.168.0.160
* **애플리케이션:** Spring Boot (Port 8080), React (Port 3000, 8082), Node.js (Port 8083)
* **도구:** Docker, Docker Compose, Nginx
**3. Docker 설치 및 이미지 구축**
Debian 기반 VM에 Docker를 설치하는 과정은 다음과 같다. 각 명령어는 실제 실행 결과와 함께 제시된다.
**(1) 시스템 업데이트 및 필수 패키지 설치**
```bash
sudo apt-get update # 패키지 목록 업데이트
sudo apt-get upgrade # 시스템 업그레이드
sudo apt-get install ca-certificates curl gnupg lsb-release # Docker 설치에 필요한 패키지 설치
```
**(2) Docker GPG 키 추가 및 저장소 설정**
```bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo 'deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable' | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
**(3) Docker 엔진 설치 및 서비스 관리**
```bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
```
**(4) 설치 확인:** `sudo docker run hello-world` 명령어를 실행하여 "Hello from Docker!" 메시지 출력 확인
**(5) Dockerfile 작성 및 이미지 빌드**
* **Node.js 애플리케이션 Dockerfile (Dockerfile_node.txt)**
```dockerfile
FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8083
CMD ['node', 'app.js']
```
* **Spring Boot 애플리케이션 Dockerfile (Dockerfile_spring.txt)**
```dockerfile
FROM openjdk:18-jdk-alpine
WORKDIR /app
COPY target/my-spring-boot-app.jar my-spring-boot-app.jar
ENTRYPOINT ["java","-jar","my-spring-boot-app.jar"]
EXPOSE 8080
```
이미지 빌드는 다음 명령어를 사용한다.
```bash
docker build -t my-node-app . # Node.js 애플리케이션 이미지 빌드
docker build -t my-spring-boot-app . # Spring Boot 애플리케이션 이미지 빌드
```
**(6) 이미지 배포:** 로컬에서 생성된 Docker 이미지를 VM으로 전송하기 위해 `docker save` 및 `scp` 명령어를 사용하여 tar 파일로 저장 후 전송한다. VM에서는 `docker load` 명령어로 이미지를 로드한다.
**4. Nginx Reverse Proxy 설정**
VM에 Nginx를 설치하고 `/etc/nginx/sites-available/default` 파일을 다음과 같이 수정한다.
```nginx
server {
listen 1000;
server_name 192.168.0.160;
location / {
proxy_pass http://localhost:8083; # Node.js 애플리케이션
}
}
server {
listen 1001;
server_name 192.168.0.160;
location / {
proxy_pass http://localhost:8080; # Spring Boot 애플리케이션
}
}
server {
listen 1002;
server_name 192.168.0.160;
location / {
proxy_pass http://localhost:8082; # React 애플리케이션 2
}
}
```
Nginx 설정을 테스트하고 재시작한다.
```bash
sudo nginx -t
sudo systemctl restart nginx
```
**(7) Docker 컨테이너 실행:** 각 애플리케이션을 Docker 컨테이너로 실행한다. (예: `docker run -d -p 8080:8080 --name spring-boot-app my-spring-boot-app`)
**5. 결과 및 고찰**
브라우저에서 다음 주소를 통해 각 애플리케이션에 접속하여 정상 동작 여부를 확인한다.
* `http://192.168.0.160:1000/` (Node.js)
* `http://192.168.0.160:1001/` (Spring Boot)
* `http://192.168.0.160:1002/` (React)
**(이미지 삽입: React, SpringBoot 결과 화면)**
본 연구에서는 Docker와 Nginx를 활용하여 다중 애플리케이션을 효율적으로 배포하고 관리하는 방법을 제시하였다. 하지만 데이터베이스 연동 및 아키텍처 설계 부분에 대한 추가적인 연구가 필요하다. 특히, 데이터베이스를 Docker 컨테이너로 운영하고 애플리케이션과의 연결을 구성하는 것은 향후 과제이다. 또한, 보다 안정적이고 확장 가능한 시스템 구축을 위해서는 로드 밸런싱, 모니터링, 로그 관리 등에 대한 고려가 필요하다.
**(Node.js, Spring Boot, React 애플리케이션 아키텍처 다이어그램 삽입)**
**6. 결론**
본 연구를 통해 Docker와 Nginx를 활용한 Reverse Proxy 구축 및 다중 애플리케이션 배포 전략을 성공적으로 구현하였다. 실제 환경에서의 적용을 통해 얻은 경험은 향후 더욱 복잡하고 확장 가능한 시스템 개발에 귀중한 자산이 될 것이다. 향후 연구에서는 데이터베이스 통합 및 더욱 발전된 아키텍처 설계를 통해 시스템의 안정성과 확장성을 향상시키는 데 집중할 계획이다.
'Tech Story' 카테고리의 다른 글
[Flutter] 대화상자에서 setState() 사용 (0) | 2025.05.31 |
---|---|
[Flutter] RestfulAPI 호출 방법 (Debugging & Release Mode) (0) | 2025.05.31 |
[Docker / NginX] 하나의 Domain을 Multi Site로 운영 (0) | 2025.05.31 |
[Python] System에 반복 및 예약 실행 설정 (Scheduler) (1) | 2025.05.31 |
[Flutter] API 호출을 위해 Debugging Mode에서 인증 회피 (0) | 2025.05.31 |