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-container3. 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.keyLXD의 핵심 장점
풀 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 설치와 초기 설정을 실습해 본다.
시리즈 안내
- LXD 개요: 시스템 컨테이너의 세계 (현재 글)
- LXD 설치 및 초기 설정
- LXD 프로파일로 인스턴스 생성
- LXD 프로비저닝 자동화
- LXD 네트워킹 & SSH ProxyJump
- Cloudflare Tunnel로 LXD 컨테이너 외부 노출
- LXD에서 Docker Compose 프로덕션 운영