LXD 개요: 시스템 컨테이너의 세계

들어가며

서버 인프라를 구축할 때 가장 먼저 떠오르는 선택지는 VM(가상 머신)과 Docker다. 하지만 이 둘 사이에 시스템 컨테이너라는 강력한 선택지가 존재한다. LXD는 Linux 커널의 컨테이너 기능을 활용해 완전한 OS 환경을 제공하면서도 VM 수준의 격리를 달성하는 시스템 컨테이너 매니저다.

이 글에서는 LXD가 무엇인지, Docker와 어떻게 다른지, 그리고 어떤 상황에서 LXD를 선택해야 하는지를 살펴본다.

시스템 컨테이너 vs 앱 컨테이너

LXD를 이해하려면 먼저 시스템 컨테이너앱 컨테이너의 차이를 명확히 알아야 한다.

구분시스템 컨테이너 (LXD)앱 컨테이너 (Docker)
목적완전한 OS 환경 제공단일 애플리케이션 격리
init 시스템systemd 등 풀 init 실행없음 (PID 1 = 앱 프로세스)
멀티 프로세스자연스럽게 지원권장하지 않음
SSH 접속일반 서버처럼 가능exec으로 진입
네트워킹고유 IP, 풀 네트워크 스택포트 매핑 기반
수명 주기장기 실행 (서버처럼)일시적 (배포 시 교체)
이미지 기반OS 이미지 (Ubuntu, Debian 등)앱 이미지 (Dockerfile)
오버헤드매우 낮음 (커널 공유)매우 낮음 (커널 공유)
부팅 시간1~2초즉시 (프로세스 시작)

핵심 차이는 관점이다. LXD 컨테이너는 “가벼운 VM”처럼 동작하고, Docker 컨테이너는 “격리된 프로세스”처럼 동작한다.

LXD 아키텍처

LXD는 세 가지 핵심 컴포넌트로 구성된다.

1. LXD 데몬 (lxd)

백그라운드에서 실행되는 REST API 서버다. 모든 컨테이너 생명주기 관리, 스토리지, 네트워크 설정을 담당한다.

┌─────────────────────────────────────────┐
│              LXD Daemon                  │
│  ┌──────────┐  ┌──────────┐  ┌────────┐ │
│  │ REST API │  │ Storage  │  │Network │ │
│  │ Server   │  │ Manager  │  │Manager │ │
│  └──────────┘  └──────────┘  └────────┘ │
│         │                                │
│  ┌──────┴──────────────────────────────┐ │
│  │         liblxc (LXC library)        │ │
│  └─────────────────────────────────────┘ │
│         │                                │
│  ┌──────┴──────────────────────────────┐ │
│  │      Linux Kernel (namespaces,      │ │
│  │      cgroups, seccomp, AppArmor)    │ │
│  └─────────────────────────────────────┘ │
└─────────────────────────────────────────┘

2. lxc CLI

사용자가 LXD 데몬과 상호작용하는 커맨드라인 도구다. 직관적인 명령어 체계를 갖추고 있다.

# 인스턴스 생성
lxc launch ubuntu:24.04 my-container
 
# 인스턴스 목록 확인
lxc list
 
# 인스턴스 내부 명령 실행
lxc exec my-container -- bash
 
# 인스턴스 정지/시작/삭제
lxc stop my-container
lxc start my-container
lxc delete my-container

3. REST API

LXD의 모든 기능은 REST API로 노출된다. 이를 통해 프로그래밍 방식의 자동화가 가능하다.

# Unix 소켓을 통한 API 호출
curl --unix-socket /var/snap/lxd/common/lxd/unix.socket \
  lxd/1.0/instances | jq .
 
# 리모트 서버의 API 호출 (HTTPS)
curl -k https://my-lxd-host:8443/1.0/instances \
  --cert ~/.config/lxc/client.crt \
  --key ~/.config/lxc/client.key

LXD의 핵심 장점

풀 OS 환경

LXD 컨테이너 안에서는 일반 서버와 동일하게 systemd, cron, SSH, 패키지 매니저 등을 사용할 수 있다. Docker처럼 컨테이너 내부 구조를 재설계할 필요가 없다.

빠른 부팅과 낮은 오버헤드

VM은 부팅에 수십 초가 걸리지만, LXD 컨테이너는 1~2초 만에 부팅된다. 호스트 커널을 공유하므로 메모리 오버헤드도 거의 없다.

네이티브 성능

하이퍼바이저 레이어가 없으므로 CPU, I/O 성능이 베어메탈에 근접한다. 특히 I/O 집약적인 워크로드에서 VM 대비 확연한 차이를 보인다.

라이브 마이그레이션

CRIU(Checkpoint/Restore In Userspace)를 활용한 라이브 마이그레이션을 지원한다. 운영 중인 컨테이너를 다른 호스트로 무중단 이동할 수 있다.

스냅샷과 백업

ZFS나 Btrfs 스토리지 백엔드를 사용하면 COW(Copy-on-Write) 기반의 즉각적인 스냅샷이 가능하다.

# 스냅샷 생성 (순식간)
lxc snapshot my-container snap-before-update
 
# 스냅샷에서 복원
lxc restore my-container snap-before-update
 
# 스냅샷 목록
lxc info my-container

주요 사용 사례

1. 개발/스테이징 환경

프로덕션과 동일한 OS 환경을 로컬에서 빠르게 구성할 수 있다. 팀원마다 독립된 개발 서버를 제공하기 좋다.

2. CI/CD 빌드 환경

클린 빌드 환경을 초 단위로 생성하고 파괴할 수 있다. VM보다 빠르고, Docker보다 유연하다.

3. 멀티 테넌트 서버

하나의 물리 서버에서 여러 독립 환경을 운영할 때 적합하다. 컨테이너별 리소스 제한과 네트워크 격리가 가능하다.

4. Docker-in-LXD

LXD 컨테이너 안에서 Docker를 실행하는 패턴이다. LXD로 서버 환경을 격리하고, 그 안에서 Docker Compose로 애플리케이션을 관리한다.

┌── 물리 서버 ──────────────────────────────┐
│ ┌── LXD 컨테이너 A ────────────────────┐  │
│ │  Docker: Web App + DB + Cache        │  │
│ └──────────────────────────────────────┘  │
│ ┌── LXD 컨테이너 B ────────────────────┐  │
│ │  Docker: ML Pipeline + Jupyter       │  │
│ └──────────────────────────────────────┘  │
│ ┌── LXD 컨테이너 C ────────────────────┐  │
│ │  Docker: Monitoring Stack            │  │
│ └──────────────────────────────────────┘  │
└───────────────────────────────────────────┘

LXD 컨테이너 vs LXD VM

LXD는 컨테이너뿐만 아니라 VM 인스턴스도 관리할 수 있다. LXD 5.0부터 QEMU 기반 VM을 동일한 인터페이스로 다룬다.

구분LXD 컨테이너LXD VM
커널호스트 커널 공유자체 커널
부팅1~2초5~15초
오버헤드거의 없음약간 있음
격리 수준높음 (커널 공유)매우 높음 (커널 분리)
OS 지원Linux만Windows, 다른 OS 가능
GPU 패스스루제한적전체 지원
관리 방식동일한 lxc CLI동일한 lxc CLI
# VM 인스턴스 생성 (--vm 플래그 추가)
lxc launch ubuntu:24.04 my-vm --vm
 
# 컨테이너와 VM 혼합 운영
lxc list
# +---------------+---------+-----+-------+-----------+
# |     NAME      |  STATE  | IPV4|  TYPE |   SNAP    |
# +---------------+---------+-----+-------+-----------+
# | my-container  | RUNNING | ... |CONTAINER| 0       |
# | my-vm         | RUNNING | ... |VIRTUAL-MACHINE| 0 |
# +---------------+---------+-----+-------+-----------+

Incus: LXD의 미래

2023년, Canonical이 LXD를 커뮤니티 프로젝트에서 자체 관리 프로젝트로 전환하면서 커뮤니티 포크인 Incus가 탄생했다. Linux Containers 프로젝트 산하에서 개발되고 있다.

  • Incus는 LXD의 코드베이스를 이어받아 독자적으로 발전 중
  • 명령어 체계는 lxc 대신 incus를 사용하지만 기본 구조는 거의 동일
  • Canonical의 LXD는 snap으로만 배포, Incus는 일반 패키지로 배포
  • 두 프로젝트 모두 활발히 개발 중이며, 기능 차이는 점차 벌어지는 추세

현재 시점에서 Ubuntu 서버를 사용한다면 LXD가 자연스러운 선택이고, 다른 배포판이나 커뮤니티 주도 개발을 선호한다면 Incus를 고려할 수 있다.

마무리

LXD는 VM의 격리성과 Docker의 가벼움 사이에서 최적의 균형점을 제공한다. 특히 Docker-in-LXD 패턴을 통해 서버 수준의 격리와 애플리케이션 수준의 컨테이너화를 동시에 달성할 수 있다.

다음 글에서는 LXD 설치와 초기 설정을 실습해 본다.

시리즈 안내

  1. LXD 개요: 시스템 컨테이너의 세계 (현재 글)
  2. LXD 설치 및 초기 설정
  3. LXD 프로파일로 인스턴스 생성
  4. LXD 프로비저닝 자동화
  5. LXD 네트워킹 & SSH ProxyJump
  6. Cloudflare Tunnel로 LXD 컨테이너 외부 노출
  7. LXD에서 Docker Compose 프로덕션 운영