목차
- VM보다 가볍게, LXC 컨테이너로 홈서버 바꾼 이야기
- LXC 컨테이너란? VM과 뭐가 다른가요?
- Proxmox에서 LXC 컨테이너 생성하기 — 단계별 가이드
- 1단계: CT 템플릿(Container Template) 다운로드
- 2단계: LXC 컨테이너 생성
- 3단계: 컨테이너 접속 및 초기 설정
- 실전 활용 — 자주 쓰는 서비스 배포 예시
- Nginx 리버스 프록시 컨테이너
- 컨테이너 설정 파일로 관리하기
- 호스트 디렉토리 마운트 (Bind Mount)
- ⚠️ 주의사항과 삽질 기록 — 진짜 겪은 문제들
- 문제 1: 비특권 컨테이너에서 파일 권한 오류
- 문제 2: 특권 기능이 필요한 서비스 (Docker-in-LXC)
- 문제 3: 컨테이너 네트워크가 안 잡힐 때
- 문제 4: 컨테이너 스냅샷이 안 될 때
- LXC 컨테이너 관리 꿀팁 모음
- ✅ 결과 확인 — 실제로 얼마나 가벼워졌나?
- 자주 묻는 질문 (FAQ)
- 마무리 — 언제 LXC를 쓰고 언제 VM을 써야 할까?
VM보다 가볍게, LXC 컨테이너로 홈서버 바꾼 이야기
솔직히 말씀드리면, 저도 처음엔 Proxmox에서 뭘 돌리든 그냥 VM(가상 머신)만 썼거든요. 익숙하기도 했고, "VM이면 다 되잖아" 하는 안일한 생각도 있었고요. 근데 홈랩 서버에 서비스가 하나둘 늘어나다 보니까 문제가 생기기 시작했습니다. RAM이 부족해지고, 부팅 시간도 길어지고, 작은 서비스 하나 띄우는데 2GB 메모리를 쓰는 게 너무 아까운 거예요.
그때 제대로 파고들기 시작한 게 바로 Proxmox LXC 컨테이너였습니다. 처음엔 "이게 Docker랑 뭐가 다르지?" 싶었는데, 실제로 써보니까 완전히 다른 매력이 있더라고요. 오늘은 13년간 인프라 엔지니어로 일하면서 직접 삽질해가며 터득한 Proxmox LXC 컨테이너 활용법을 공유해드리려 합니다.
Proxmox VE 환경에서 LXC 컨테이너와 VM이 함께 운영되는 구조 — 같은 호스트에서 자원 효율성 차이가 확연합니다.
LXC 컨테이너란? VM과 뭐가 다른가요?
개념부터 짚고 넘어가겠습니다. 헷갈리는 분들이 많으시더라고요.
LXC(Linux Containers, 리눅스 컨테이너)는 쉽게 말해서, 커널은 호스트와 공유하면서 독립된 사용자 공간(User Space)을 가지는 가상화 방식입니다. VM처럼 하드웨어를 통째로 에뮬레이션하지 않아요. 그래서 훨씬 가볍습니다.
| 구분 | VM (가상 머신) | LXC 컨테이너 | Docker |
|---|---|---|---|
| 커널 공유 | ❌ 별도 커널 | ✅ 호스트 커널 공유 | ✅ 호스트 커널 공유 |
| 격리 수준 | 매우 높음 | 높음 | 중간 |
| 부팅 속도 | 느림 (수십 초) | 빠름 (수 초) | 매우 빠름 (즉시) |
| 메모리 오버헤드 | 높음 | 낮음 | 매우 낮음 |
| 전체 OS 환경 | ✅ 완전한 OS | ✅ 완전한 OS 환경 | ❌ 앱 중심 |
| systemd 사용 | ✅ | ✅ | ❌ (기본적으로) |
LXC의 포지션이 보이시죠? VM의 완전한 OS 환경은 유지하면서, 자원 사용량은 훨씬 적은 중간 지점이에요. 실제로 제 홈랩에서 Nginx 서버 기준으로 VM은 약 512MB~1GB RAM을 먹는데, LXC 컨테이너는 50~100MB 수준에서 돌더라고요. 이 차이가 쌓이면 정말 엄청납니다.
Proxmox에서 LXC 컨테이너 생성하기 — 단계별 가이드
자, 이제 실전으로 들어가겠습니다. Proxmox VE(가상화 환경)에서 LXC 컨테이너를 생성하는 방법인데요. GUI와 CLI 두 가지 방법 모두 알려드릴게요.
1단계: CT 템플릿(Container Template) 다운로드
LXC 컨테이너를 만들려면 먼저 기반이 되는 OS 템플릿이 필요합니다. Proxmox에서는 이걸 CT 템플릿이라고 부르고요. GUI에서는 스토리지 → Templates 메뉴에서 바로 다운로드할 수 있어요.
CLI에서는 이렇게 합니다:
# 사용 가능한 템플릿 목록 확인
pveam update
pveam available --section system
# Ubuntu 22.04 템플릿 다운로드 (local 스토리지에)
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
2단계: LXC 컨테이너 생성
GUI에서는 우측 상단 "Create CT" 버튼 클릭 후 마법사를 따라가시면 됩니다. CLI로는 이렇게요:
# pct create [VMID] [템플릿 경로] [옵션들]
pct create 200 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
--hostname my-nginx \
--memory 512 \
--swap 512 \
--cores 2 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.1.200/24,gw=192.168.1.1 \
--storage local-lvm \
--rootfs local-lvm:8 \
--password YourSecurePassword \
--unprivileged 1
# 생성된 컨테이너 시작
pct start 200
# 컨테이너 상태 확인
pct status 200
여기서 --unprivileged 1 옵션이 정말 중요합니다. 비특권 컨테이너(Unprivileged Container)로 만드는 건데, 보안상 훨씬 안전해요. 특별한 이유가 없으면 항상 이 옵션을 켜두시길 권장합니다.
3단계: 컨테이너 접속 및 초기 설정
# 컨테이너 콘솔 접속
pct enter 200
# 또는 exec으로 명령어 실행
pct exec 200 -- bash -c "apt update && apt upgrade -y"
접속하면 완전한 Ubuntu 환경이 펼쳐집니다. 일반 서버처럼 쓰시면 돼요.
Proxmox GUI의 LXC 컨테이너 생성 마법사 — 네트워크, 스토리지, 리소스를 단계별로 설정합니다.
실전 활용 — 자주 쓰는 서비스 배포 예시
개념만 알면 재미없죠. 제가 실제로 홈랩에서 LXC 컨테이너로 돌리고 있는 서비스 패턴을 공유해드릴게요.
Nginx 리버스 프록시 컨테이너
# 컨테이너 안에서
apt update && apt install -y nginx
# Nginx 설정
cat > /etc/nginx/sites-available/myapp << 'EOF'
server {
listen 80;
server_name myapp.local;
location / {
proxy_pass http://192.168.1.100:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
EOF
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
컨테이너 설정 파일로 관리하기
Proxmox LXC 컨테이너는 /etc/pve/lxc/[VMID].conf 파일로 설정이 관리됩니다. 이걸 알면 나중에 설정 백업이나 복제가 훨씬 편해져요.
# 컨테이너 200번의 설정 파일 확인
cat /etc/pve/lxc/200.conf
# 일반적인 LXC 컨테이너 설정 파일 예시
arch: amd64
cores: 2
hostname: my-nginx
memory: 512
net0: name=eth0,bridge=vmbr0,gw=192.168.1.1,hwaddr=AA:BB:CC:DD:EE:FF,ip=192.168.1.200/24,type=veth
ostype: ubuntu
rootfs: local-lvm:vm-200-disk-0,size=8G
swap: 512
unprivileged: 1
# 자동 시작 설정 (서버 재부팅 시 자동으로 컨테이너 시작)
onboot: 1
startup: order=1,up=30
onboot: 1과 startup 옵션은 꼭 설정해두세요. 서버 재부팅 후에 컨테이너가 자동으로 올라오게 됩니다. 처음에 이거 몰라서 재부팅할 때마다 수동으로 시작했었는데... 정말 삽질이었죠 ㅎㅎ
호스트 디렉토리 마운트 (Bind Mount)
컨테이너에서 호스트의 특정 디렉토리를 공유해서 쓰고 싶을 때 바인드 마운트(Bind Mount)를 씁니다. 예를 들어 미디어 파일이 호스트에 있는데 컨테이너 안의 Jellyfin에서 접근해야 할 때요.
# 컨테이너가 중지된 상태에서 마운트 추가
pct set 200 -mp0 /mnt/data/media,mp=/media,ro=0
# 또는 설정 파일 직접 편집
# /etc/pve/lxc/200.conf에 아래 줄 추가
# mp0: /mnt/data/media,mp=/media
⚠️ 주의: 비특권 컨테이너(Unprivileged)에서 바인드 마운트 시 UID/GID 매핑 문제가 생길 수 있습니다. 이 부분은 뒤에서 트러블슈팅으로 다룰게요.
⚠️ 주의사항과 삽질 기록 — 진짜 겪은 문제들
이 섹션이 사실 제일 중요할 수 있어요. 공식 문서에는 잘 안 나오는 것들이거든요.
문제 1: 비특권 컨테이너에서 파일 권한 오류
비특권 컨테이너는 보안을 위해 UID를 매핑합니다. 컨테이너 안의 root(UID 0)가 호스트에서는 UID 100000으로 보이는 식이에요. 그래서 호스트 디렉토리를 마운트하면 권한 문제가 생깁니다.
해결 방법:
# 호스트에서 해당 디렉토리의 소유자를 컨테이너 UID로 변경
# 컨테이너 안의 UID 1000 사용자 → 호스트에서는 101000
chown -R 101000:101000 /mnt/data/media
# 또는 chmod로 모든 사용자 접근 허용 (보안 주의)
chmod -R 777 /mnt/data/media
문제 2: 특권 기능이 필요한 서비스 (Docker-in-LXC)
LXC 컨테이너 안에서 Docker를 돌리고 싶을 때가 있거든요. 이게 되긴 합니다만, 설정이 필요합니다.
# /etc/pve/lxc/200.conf에 추가해야 할 내용
# (컨테이너 중지 후 편집)
features: keyctl=1,nesting=1
이 경우엔 특권 컨테이너(Privileged Container)로 만들거나, nesting 기능을 활성화해야 해요. 저도 처음에 이것 때문에 한참 헤맸습니다. Docker가 계속 실패하는데 이유를 몰라서요.
문제 3: 컨테이너 네트워크가 안 잡힐 때
# 컨테이너 안에서 네트워크 확인
ip addr show
ip route show
# DNS 확인
cat /etc/resolv.conf
# DNS가 없다면 추가
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
# 또는 Proxmox 호스트에서 컨테이너 네트워크 재설정
pct set 200 --net0 name=eth0,bridge=vmbr0,ip=192.168.1.200/24,gw=192.168.1.1
문제 4: 컨테이너 스냅샷이 안 될 때
스냅샷 기능을 쓰려면 스토리지가 스냅샷을 지원해야 합니다. local-lvm(LVM-Thin)이나 ZFS를 쓰면 되고, 일반 ext4 디렉토리 스토리지는 스냅샷이 안 돼요. 이것도 처음에 몰라서 삽질했습니다.
# 스냅샷 생성
pct snapshot 200 snap-before-update --description "업데이트 전 백업"
# 스냅샷 목록 확인
pct listsnapshot 200
# 스냅샷으로 롤백
pct rollback 200 snap-before-update
💡 팁: 서비스 업데이트나 큰 변경 전에 스냅샷 찍는 습관을 들이세요. 저는 이게 몇 번이나 저를 살렸는지 모릅니다.
LXC 컨테이너 관리 꿀팁 모음
일상적으로 자주 쓰는 관리 명령어들을 정리해드릴게요.
# 전체 컨테이너 목록 확인
pct list
# 컨테이너 리소스 사용량 실시간 확인
pct monitor 200
# 컨테이너 복제 (Clone)
pct clone 200 201 --hostname my-nginx-clone --full
# 컨테이너 백업
vzbackup 200 --storage local --mode snapshot
# 컨테이너 중지 및 삭제
pct stop 200
pct destroy 200
# 실행 중인 컨테이너에 리소스 핫 변경 (재시작 불필요)
pct set 200 --memory 1024
pct set 200 --cores 4
특히 리소스 핫 변경은 정말 편한 기능이에요. VM은 보통 재시작해야 메모리 변경이 되는데, LXC는 실행 중에도 바로 적용됩니다. 이거 처음 알았을 때 "아 이래서 LXC 쓰는구나" 했던 기억이 나네요.
여러 LXC 컨테이너가 동시에 운영되는 Proxmox 환경 — 각 컨테이너의 CPU, 메모리 사용량을 실시간으로 확인할 수 있습니다.
✅ 결과 확인 — 실제로 얼마나 가벼워졌나?
제 홈랩 기준으로 비교해드릴게요. 같은 Nginx + 간단한 웹 앱 기준입니다.
| 항목 | Ubuntu VM | Ubuntu LXC 컨테이너 |
|---|---|---|
| 부팅 시간 | 약 30~40초 | 약 3~5초 |
| 유휴 메모리 사용 | 약 400~600MB | 약 50~100MB |
| 디스크 사용 (OS 기본) | 약 3~5GB | 약 300~500MB |
| 스냅샷 생성 속도 | 느림 | 빠름 |
| systemd 지원 | ✅ | ✅ |
이 차이 덕분에 저는 기존에 VM 5개로 돌리던 서비스를 LXC 컨테이너 12개로 확장했는데도 오히려 전체 메모리 사용량이 줄었습니다. 🎉 같은 하드웨어에서 더 많은 서비스를 돌릴 수 있게 된 거죠.
경량 서비스 배포 측면에서 LXC 컨테이너는 정말 강력한 선택지입니다. Prometheus, Grafana, Gitea, Nextcloud 같은 서비스들 모두 LXC에서 잘 돌아가거든요.
자주 묻는 질문 (FAQ)
Q. LXC 컨테이너와 Docker 중 뭘 써야 하나요?
A. 서비스 성격에 따라 다릅니다. 완전한 OS 환경이 필요하거나 systemd를 써야 하면 LXC, 앱 하나만 가볍게 격리할 거면 Docker가 적합해요. 저는 둘 다 쓰는데, LXC 안에 Docker를 넣기도 합니다.
Q. Windows를 LXC 컨테이너로 돌릴 수 있나요?
A. 안 됩니다. LXC는 Linux 커널 기반이라 Linux 배포판만 지원합니다. Windows는 반드시 VM으로 돌려야 해요.
Q. LXC 컨테이너도 GPU 패스스루가 되나요?
A. 됩니다! VM의 PCIe 패스스루보다 설정이 간단한 편이에요. 관련 내용은 다음 글에서 다룰 예정입니다.
LXC 컨테이너와 VM의 특성 비교 요약 — 서비스 유형에 따른 최적 선택 가이드.
마무리 — 언제 LXC를 쓰고 언제 VM을 써야 할까?
13년간 인프라 일 하면서 내린 결론을 드리자면, 이렇게 판단합니다:
- ✅ LXC 컨테이너 추천: 웹 서버, 데이터베이스, 모니터링 도구, 파일 서버, 홈 자동화 서버처럼 Linux 기반 서비스 단순 배포
- ✅ VM 추천: Windows 환경, 커널 수준 격리가 필요한 경우, 다른 하이퍼바이저나 OS를 테스트할 때, 강한 보안 격리가 필요한 프로덕션 환경
Proxmox의 진짜 장점은 이 두 가지를 같은 플랫폼에서 자유롭게 섞어 쓸 수 있다는 거예요. 저는 중요한 서비스는 VM에, 나머지 경량 서비스들은 모두 LXC 컨테이너로 돌리는 하이브리드 방식을 쓰고 있습니다.
처음 LXC를 접하면 낯설 수 있는데, 한 번 익숙해지면 정말 못 돌아가요. 이거 진짜더라고요. 홈랩 운영하시는 분들이라면 꼭 한번 도전해보시길 권합니다!
다음 글에서는 Proxmox LXC 컨테이너에서 GPU 패스스루 설정하는 방법을 다뤄볼 예정입니다. 궁금한 점은 댓글로 남겨주시면 답변드리겠습니다. 🎉
'IT > Proxmox' 카테고리의 다른 글
| [Proxmox] Proxmox LXC 컨테이너 vs VM: 홈랩 환경 최적화 비교 분석 (0) | 2026.05.19 |
|---|---|
| [Proxmox] Proxmox Backup Server (PBS) 완벽 가이드: 설치부터 백업/복구 전략까지 (0) | 2026.05.18 |
| [Proxmox] 스토리지 관리 완벽 가이드: ZFS, LVM, NFS, iSCSI 비교 및 최적화 (0) | 2026.05.17 |
| [Proxmox] Proxmox 네트워크 설정: 브릿지, VLAN, 본딩 완벽 가이드 (0) | 2026.05.13 |
| [Proxmox] Proxmox GPU 패스스루 완벽 가이드: 가상머신에서 그래픽카드 활용하기 (0) | 2026.05.13 |
| [Proxmox] Proxmox VE 8.2 업그레이드 완벽 가이드 — 안전한 업데이트 방법 (1) | 2026.05.12 |