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 스킬을 한층 더 높일 수 있는 기회가 되길 바랍니다.