CS 공부/기타

개인 서버 구조 VM 분리형 vs Docker/LXC 컨테이너형 에 대하여

강_토발즈 2025. 8. 11. 21:38

 

개인 서버라고 지칭하기도 거창하지만, 컴퓨터를 끄지 않고 특정 목적을 위해 동작, 사용하기 때문에 큰 의미로 본다면 서버 컴퓨터가 맞다고 생각한다. 많은 기능을 처리하고 있지는 않지만 앞으로 이것저것 테스트 해 볼 것들도 많고, 운동 모임을 위한 간단한 웹/ 앱 배포도 할 수 있기 때문에, 좀 더 유리한 서버 구성을 위해 알아본 것들을 정리한다.

 

 

먼저 현재 이용하고 있는 서버 컴퓨터의 구조는 아래와 같다.

 

1. Proxmox 를 이용한 Vm Ubuntu Server

[ Internet ]
     │ 80/443
[ Router / NAT ]
     │ (포트포워딩: 80,443 → Reverse Proxy VM)
     │
┌───────────────────────────────┐
│- Reverse Proxy VM (Nginx+TLS) │
│  - certbot/SSL                │
│  - Host/SNI 라우팅.           │
│- ChatGPT 용 API 서버          │
│- 기타 자동화 작업들.           │ 
└───────────────────────────────┘


하나의 VM 을 생성하여 사용하고 있고, 이 VM OS 안에 모든(?) 기능들이 동작하고 있는 상태이다. 하지만 앞으로 해보고 싶은 기능들이 생길때마다 하나의 VM 에 계속해서 추가하는 것 보다는 기능별로 VM 을 생성한다던가, 아니면 하나의 VM 에 필요한 공통의 기능을 동작시키고 다른 특수 기능들을 컨테이너에 올리는 건 어떨까? 하는 생각이 들었다. 

 

 

2. VM 분리형 구조

[ Internet ]
     │ 80/443
[ Router / NAT ]
     │ (포트포워딩: 80,443 → Reverse Proxy VM)
┌──────────────────────────────┐
│ Reverse Proxy VM (Nginx+TLS) │
│  - certbot/SSL               │
│  - Host/SNI 라우팅.           │
└─────┬──────────┬──────────┬──┘
      │          │          │
      │          │          └─────┐
      │          │                │
┌─────▼─────┐ ┌──▼─────────┐ ┌────▼───────┐
│ GPT       │ │ APP VM     │ │ WEB-TEST VM│
│    server │ │            │ │            │
└───────────┘ └────────────┘ └────────────┘

 

 

서비스별로 개별 VM(Ubuntu 등)을 생성하고, 각 VM이 하나의 역할만 수행하도록 하는 방식이다.
예를 들어, Reverse Proxy 전용 VM, ChatGPT의 API 서버용 VM, 모임 앱 개발 서버 VM, 웹 테스트 서버 VM을 각각 분리하는 것이다. 

 

장점

  • 단일 책임 원칙 준수: VM 단위로 역할이 명확하게 구분되어 관리가 쉽다.
  • 보안 격리 강화: 한 VM이 침해당해도 다른 VM으로의 영향이 최소화된다.
  • 장애 영향 최소화: 특정 서비스 장애가 다른 서비스로 확산되지 않는다.
  • 운영 체계 독립성: 각 VM이 다른 OS 버전이나 설정을 가질 수 있다.

단점

  • 리소스 오버헤드: VM마다 OS가 따로 돌아가므로 메모리, 디스크 사용량이 증가한다.
  • 확장 비용 증가: 서비스가 늘어날수록 VM 관리 부담이 커지고, 하드웨어 자원 요구량이 커진다.
  • 배포 속도 느림: VM을 생성·설정하는 시간이 길고, 스냅샷·복원도 상대적으로 무겁다.

 

3. 컨테이너형

[ Internet ]
     │ 80/443
[ Router / NAT ]
     │ (80,443 → Reverse Proxy Node)
┌──────────────────────────────────────────────┐
│ Reverse Proxy Node (Nginx/Traefik + certbot) │ 
│  - Host/SNI 라우팅                           │
│  - (옵션) Path 라우팅                        │
└───────────────┬───────────────┬──────────────┘
                │               │
   api.example.com      app.example.com      web.example.com
                │               │
        ┌───────▼───────────────────────────────┐
        │  App Node (Docker or LXC on Ubuntu)   │ 
        │  ┌─────────────────────────────────┐  │
        │  │  GPT-svc   app-svc   web-test   │  │  ← 여러 컨테이너/LXC
        │  │  :8000     :3000     :8080      │  │     (각 서비스 1개 이상)
        │  └────────────┬─────────┬──────────┘  │
        │               │         │             │
        │    volumes/networks/env 관리(공유)     │
        └───────────────┴─────────┴─────────────┘

 

Reverse Proxy 서버를 두고, 그 뒤에서 Docker 또는 LXC로 서비스별 컨테이너를 실행하는 방식이다.
즉 하나의 VM OS 위에 여러 서비스 컨테이너를 띄워 운영한다. 지금 현재 방식과 비슷하지만, 서비스를 시스템에 계속 깔아대는(?) 게 아니라, 컨테이너를 생성하고, 그 위에 독립적으로 서비스를 운영한다.

장점

  • 자원 효율성: VM보다 훨씬 가볍고, 동일 하드웨어에서 더 많은 서비스를 운영 가능하다.
  • 배포·롤백 속도: 이미지 교체만으로 빠르게 배포 가능하며, 무중단 롤링 업데이트도 쉽다.
  • 환경 일관성: 개발 환경과 운영 환경이 동일하게 유지된다.
  • 운영 자동화 용이: Docker Compose, Portainer, Ansible 등으로 전체 서비스 배포를 자동화할 수 있다.
  • 유연한 네트워킹: 컨테이너 네트워크로 직접 서비스명을 이용한 라우팅 가능.

단점

  • 보안 격리 한계: VM처럼 완전한 커널/OS 격리를 제공하지 않아, 강력한 멀티테넌시에는 부적합하다.
  • 운영 체계 통일 필요: 같은 호스트 OS 커널을 공유하므로, OS 버전을 달리하기 어렵다.
  • 호스트 의존성: 호스트 장애 시 모든 컨테이너가 동시에 영향을 받는다.

 

4. 결론

만약 보안과 서비스 간 완전한 격리가 중요하고, 자원 사용량보다 안정성과 독립성이 우선이라면 VM 분리형이 적합하다. 반면, 개발·테스트 환경을 자주 바꾸고, 자원 효율과 빠른 배포가 중요한 상황이라면 Docker/LXC 컨테이너형이 유리하다. 나의 경우, 외부에 노출되는 HTTPS 트래픽을 한 곳에서 관리하고, 내부 서비스는 가볍게 운영하고 싶기 때문에 Reverse Proxy 전용 VM + 서비스별 Docker 컨테이너 조합을 우선적으로 고려하고 있다. 하나의 방식만 선택하는게 아니라, 내가 개인적으로 중요하게 사용할 GPT 서버에게 하나의 VM 을 할당하고, 또 모임 전용 웹/앱 페이지를 만든다고 하면, VM 을 하나 더 생성하되, 웹/앱에 필요한 다른 서버 기능들은 컨테이너로 구성 할 예정이다.