·조회수 173

Docker Swarm, Traefik을 이용한 서버 관리

들어가며

개인 프로젝트를 운영하면서 여러 개의 서비스를 관리하게 되었고, 이를 위해 매달 발생하는 AWS 비용이 점점 부담으로 다가왔다. 수익이 없는 초기 단계에서는 고정 지출을 줄이는 것이 중요했기에, 비교적 저렴한 미니 서버 3대를 직접 구매해 셀프 호스팅 환경을 꾸리기로 했다.

그동안은 단일 서버 위에서 Docker Compose만으로 서비스를 구성해왔지만, 서버가 여러 대가 되자 Compose 방식에는 분명한 한계가 있었다. 특히 CPU와 메모리 사용량을 기준으로 컨테이너를 수동으로 배치해야 했고, 확장성이나 관리 측면에서도 비효율이 컸다.

이를 해결하기 위해 도입한 것이 Docker Swarm이다. Swarm은 여러 대의 서버를 하나의 클러스터처럼 구성할 수 있게 해주고, 서비스 단위로 유연한 배포와 확장을 지원한다. 여기에 Traefik을 함께 사용하면 각 서비스마다 Nginx 설정을 따로 하지 않아도 되고, HTTPS 인증서도 자동으로 발급 및 갱신되므로 운영 부담이 크게 줄어든다.

혼자서 개발하고 운영을 병행하는 나에게 Docker Swarm과 Traefik은 복잡한 인프라를 간결하게 유지할 수 있는 좋은 선택지였다. 이 글에서는 실제로 어떻게 구성했는지 그 과정을 정리해보려 한다.

하드웨어 구성

미니 서버 사양 소개

이번에 구축한 서버는 Asrock DeskMini X300 베어본을 기반으로 구성된 미니 PC 3대입니다. 크기는 작지만, 서버용으로 충분한 성능을 낼 수 있어 셀프 호스팅 환경에 잘 맞는 선택이었습니다.

각 서버의 주요 사양은 다음과 같습니다.

  • 모델 : Asrock DeskMini X300
  • CPU : Ryzen 5600G
  • RAM : 64GB
  • HDD : 1TB SSD
  • 쿨러 : [NOCTUA] NH-L9a-AM4 (저소음 쿨러)

이 구성은 개인 서비스 10~20개 정도를 컨테이너로 돌리기에 충분한 성능을 제공하며, RAM과 SSD 용량이 넉넉해서 무거운 서비스도 여유롭게 운영할 수 있습니다. 3대를 구매했습니다. 24시간 집에서 운영되는 상황을 고려해서 저소음 쿨러를 구매해서 장착했습니다. (이전에 회사에서 서버를 운영했던 경험이 도움이 되었습니다. 어찌나 시끄럽던지..)

전력 소비도 일반 데스크탑 대비 적은 편이라, 24시간 항상 켜져 있는 홈 서버로도 적합합니다

네트워크 장비 소개

현재 사용하는 인터넷 회선은 KT 기가 인터넷이며, KT의 특징 중 하나는 모뎀의 각 LAN 포트마다 별도의 공인 IP를 제공한다는 점입니다. 이를 활용해 서버 3대를 각각 독립적으로 외부에서 접근 가능하도록 구성했습니다.

네트워크 장비는 다음과 같은 TP-Link Omada 시리즈로 구성되어 있습니다:

  • 라우터: TP-Link ER605

  • 스위치: TP-Link TL-SG2210P (2.5Gbps 지원, PoE)

  • 컨트롤러: TP-Link OC200

  • 무선 AP: TP-Link EAP650 (Wi-Fi 6)

이 장비들은 모두 Omada SDN 시스템으로 통합 관리되며, VLAN 구성 및 트래픽 모니터링, 포트 단위 제어가 가능한 환경을 제공합니다.

서버 1대

  • KT 모뎀에 직접 연결해서 공인 IP 부여

  • Harbor Docker 레지스트리, DB, 문서 시스템 등 고정 서비스 운영

서버 2대

  • Docker Swarm으로 클러스터 구성
  • 여러개의 개인 서비스를 컨테이너 단위로 분산 운영

이러한 구성 덕분에 Harbor에서 이미지를 관리하면서, 나머지 서버에서는 유연하게 서비스 배포/확장/관리를 수행할 수 있는 구조를 완성했습니다.

처음에는 3대 모두를 클러스터로 구성해서 모든 서비스와 인프라를 통합하려 했지만, Harbor와 같은 복잡한 서비스를 Docker Swarm 환경에서 안정적으로 운영하는 데 제약이 있었고, 더 유연한 구성을 위해 현재와 같이 역할을 분리하게 되었습니다.

장점

Traefik을 이용한 쉬운 트래픽 관리

Traefik을 도입하면서 가장 편리했던 점은 트래픽 관리가 훨씬 단순해졌다는 것입니다. 기존에는 각 서비스마다 Nginx 설정을 수동으로 작성하고, SSL 인증서도 수작업으로 발급받아야 했습니다. 하지만 Traefik은 다음과 같은 기능을 자동으로 처리해줍니다:

  • Let’s Encrypt를 통한 HTTPS 인증서 자동 발급 및 갱신
  • docker-compose.yml의 라벨 설정만으로 도메인 연결, 리다이렉트, 포트 지정 가능
  • 기본 제공되는 대시보드로 현재 라우팅 상태와 서비스 상태를 시각적으로 모니터링 가능

1인 개발자 입장에서는 설정을 반복하지 않아도 되는 점이 굉장히 큰 장점이었습니다.

손쉬운 확장

Docker Swarm을 사용하면 새로운 서비스를 배포하거나 확장할 때 훨씬 간단합니다. 새로운 워커 노드를 클러스터에 등록하기만 하면, Swarm이 자동으로 컨테이너를 가용 자원에 따라 분배해줍니다.

즉, 더 이상 “이 서비스는 이 서버에서 돌려야지”라고 고민할 필요 없이, Swarm이 알아서 컨테이너를 배포하고 자원을 분산해줍니다.

무중단 배포 (Rolling Update)

update_config 설정을 통해 기존 서비스를 중단하지 않고 새로운 버전으로 교체할 수 있습니다. Swarm은 기존 컨테이너를 내리기 전에 새로운 컨테이너를 먼저 띄우고, 정상 동작을 확인한 뒤 기존 인스턴스를 종료합니다.

services:
  my-app:
    image: myapp:v1
    deploy:
      replicas: 1
      update_config:
        order: start-first
        parallelism: 1
        delay: 5s

서버가 2대 이상일 경우, 새 컨테이너를 다른 노드에 먼저 배치하기 때문에 실제 서비스 이용자는 전혀 눈치채지 못한 채로 배포가 이루어집니다.

서비스 격리 및 롤백 기능

각 서비스는 독립적인 컨테이너로 격리되어 실행되기 때문에 문제가 생긴 특정 서비스만 빠르게 수정하거나 롤백할 수 있습니다. 예를 들어 이미지 업데이트 후 문제가 발생했다면 아래 명령어 한 줄로 이전 상태로 복구할 수 있어, 빠르고 안전한 운영이 가능합니다.

docker service rollback my-service

Traefik 기반의 동적 라우팅

Traefik은 도커 라벨을 기반으로 자동으로 라우팅을 구성해줍니다. docker-compose.yml에 몇 줄만 추가하면, 도메인, 경로, HTTPS 적용까지 자동으로 처리됩니다.

이는 수동 설정이 많은 Nginx와 달리, 서비스가 추가되거나 이름이 바뀌어도 라우팅 구성을 다시 손댈 필요가 없다는 점에서 큰 장점입니다.

마무리하며

혼자서 개발하고 운영을 모두 맡아야 하는 1인 개발자에게 가장 중요한 건, 복잡한 인프라를 단순하게 유지하는 것이라고 생각합니다.

이번에 Docker Swarm과 Traefik을 활용해 서버를 구성하면서 느낀 건, 굳이 복잡한 툴이나 클라우드 환경이 아니더라도 스스로 충분히 잘 동작하는 인프라를 만들 수 있다는 자신감이었습니다.

물론 처음 구성할 땐 시행착오도 있었고, 특히 Docker Swarm에 대한 실전 자료가 많지 않아서 헤맸던 부분도 있었지만, 직접 구성하고 테스트하며 쌓은 경험은 어떤 문서보다 강력한 기반이 되어주었습니다.

누군가는 "굳이 Docker Swarm을 쓰느냐"라고 할 수도 있지만, 개발부터 배포, 운영까지 혼자서 해야 하는 상황에서는 간결함, 자동화, 유지보수 용이성이 가장 큰 장점이자 무기라고 생각합니다.

김지식
김지식
웹, 앱 개발자입니다.

댓글

댓글을 불러오는 중...