DevOps와 클라우드 분야에서 Nginx를 사용한 Docker 컨테이너 로드밸런싱은 매우 유용한 기술입니다. 이번 포스트에서는 Nginx를 활용하여 Docker 컨테이너 간의 로드밸런싱을 구현하는 미니 프로젝트를 진행해 보겠습니다. 이 프로젝트를 통해 기본적인 Nginx 설정과 Docker 컨테이너 관리에 대한 이해를 높일 수 있습니다.
프로젝트 목표
- Nginx를 사용한 로드밸런싱 설정
- Docker에서 여러 개의 웹 서버 컨테이너 실행
- 클라이언트의 요청을 Nginx가 컨테이너에 분산하는 구조 구현
- Docker
- Docker Compose
- Nginx
필요 도구
환경 설정
먼저, Docker와 Docker Compose가 설치되어 있어야 합니다. 설치가 완료되었다면, 아래와 같은 디렉토리 구조를 만들어 줍니다.
nginx-load-balancer/
│
├── docker-compose.yml
└── nginx/
└── default.conf
Docker Compose 파일 작성
docker-compose.yml 파일을 다음과 같이 작성합니다. 이 파일에서는 Nginx와 두 개의 웹 서버 컨테이너를 정의합니다.
version: '3'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app1
- app2
app1:
image: hashicorp/http-echo
environment:
- MESSAGE=Hello from App 1
ports:
- "8081:8080"
app2:
image: hashicorp/http-echo
environment:
- MESSAGE=Hello from App 2
ports:
- "8082:8080"
이 설정에서는 Nginx 서비스가 포트 8080에서 실행되며, 두 개의 웹 서버(app1, app2)는 각각 포트 8081와 8082에서 실행됩니다.
Nginx 설정 파일 작성
이제 Nginx의 설정 파일인 default.conf를 작성합니다. 이 파일에서 로드밸런서를 설정합니다.
http {
upstream backend {
server app1:8080;
server app2:8080;
}
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;
}
}
}
이 설정에서는 Nginx가 upstream 블록을 사용하여 app1과 app2를 로드밸런싱합니다. 클라이언트의 요청이 Nginx를 통해 들어오면, 요청을 적절한 웹 서버로 전달하게 됩니다.
컨테이너 실행
모든 설정이 완료되었으면, 다음 명령어로 Docker Compose를 실행하여 컨테이너를 시작합니다.
docker-compose up -d
이 명령어를 통해 Nginx와 두 개의 웹 서버 컨테이너가 백그라운드에서 실행됩니다. 실행이 완료되면 브라우저에서 http://localhost:8080에 접속해 보세요.
테스트하기
브라우저에서 여러 번 새로고침을 해보면, Hello from App 1과 Hello from App 2 메시지가 번갈아 가며 나타나는 것을 확인할 수 있습니다. 이는 Nginx가 요청을 두 웹 서버에 분산하고 있다는 것을 의미합니다.
마무리
이번 포스트에서는 Nginx를 사용하여 Docker 컨테이너 간의 로드밸런싱을 설정하는 방법을 살펴보았습니다. Nginx의 설정 파일을 통해 간단하게 다양한 웹 서버를 로드밸런싱할 수 있으며, 이를 통해 성능을 향상시키고, 장애 조치 및 고가용성을 구현할 수 있습니다. 이러한 기법들은 실무에서도 자주 사용되므로, 여러분의 DevOps 스킬을 한층 더 높일 수 있는 기회가 되길 바랍니다.