콘텐츠로 이동

컨테이너 관리

PureCVisor는 LXC 컨테이너를 ZFS 백엔드와 통합하여 관리합니다.

ZFS 필수 — 컨테이너 생성 전 확인

PureCVisor 2.0.0의 LXC 컨테이너 생성에는 사용 가능한 ZFS 풀과 컨테이너용 파일시스템 데이터셋이 필요합니다.
ZFS 커널 모듈과 zfs 명령을 준비하고, daemon.conf의 [storage] container_pool을 해당 풀 아래의 컨테이너 부모 데이터셋 경로로 설정하세요.
기본값은 pcvpool/containers이며 부모 데이터셋이 없으면 생성 과정에서 만들기를 시도합니다.
이 저장소는 파일시스템 데이터셋입니다.
VM용 블록 볼륨 zvol을 별도로 만드는 절차는 필요하지 않습니다.
LXC 패키지만 설치하거나 Btrfs·ext4 디렉터리만 준비한 상태에서는 현재 PureCVisor의 컨테이너 생성이 실패합니다. 현재 Btrfs·일반 디렉터리 백엔드와 자동 폴백은 지원하지 않습니다.
ZFS 없이 사용할 수 있는 qcow2/raw VM 생성과 컨테이너 생성의 전제조건을 구분하세요.

Terminal window
# 기본 생성 (LXC + ZFS rootfs)
pcvctl container create --name app-ctr --dist ubuntu --release noble
# 생성 후 바로 시작
pcvctl container create --name web-ctr --dist ubuntu --release jammy
pcvctl container start web-ctr

RPC 직접 호출:

Terminal window
echo '{"jsonrpc":"2.0","method":"container.create","params":{
"name": "app-ctr",
"dist": "ubuntu",
"release": "noble"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool

fire-and-forget: 컨테이너 생성/시작/중지/삭제는 모두 fire-and-forget 패턴으로 즉시 응답합니다.

Terminal window
# 시작 (cgroup v2 리소스 제한 자동 적용)
pcvctl container start app-ctr
# 중지 (오퍼레이션 잠금으로 동시 실행 방지)
pcvctl container stop app-ctr
# 삭제
pcvctl container destroy app-ctr
# 목록 조회
pcvctl container list

REST API:

Terminal window
# 컨테이너 목록
curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8080/api/v1/containers | python3 -m json.tool
# 컨테이너 시작
curl -X POST -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8080/api/v1/containers/app-ctr/start
# 컨테이너 중지
curl -X POST -H "Authorization: Bearer $TOKEN" http://127.0.0.1:8080/api/v1/containers/app-ctr/stop
Terminal window
# 단일 명령
pcvctl container exec app-ctr "hostname -I"
# 패키지 업데이트
pcvctl container exec app-ctr "apt update && apt upgrade -y"
# 서비스 상태 확인
pcvctl container exec app-ctr "systemctl status nginx"
Terminal window
# CPU/메모리 제한 설정
pcvctl container set-limits app-ctr --cpu_quota 50 --memory_mb 1024
# --cpu_quota: CPU quota
# --memory_mb: 메모리 제한 (MB)

RPC 직접 호출:

Terminal window
echo '{"jsonrpc":"2.0","method":"container.set_limits","params":{
"name": "app-ctr",
"cpu_percent": 50,
"memory_mb": 1024
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
Terminal window
# 대역폭 제한 (tc qdisc 기반, KB/s)
pcvctl container set-bandwidth app-ctr --inbound 100000 --outbound 100000
Terminal window
# 개별 컨테이너 메트릭
pcvctl container metrics app-ctr

출력 예시:

Container: app-ctr (RUNNING)
CPU: 8.3%
Memory: 256/1024 MB
PIDs: 42
Net: eth0 RX 15.2MB TX 3.1MB
Terminal window
# 스냅샷 생성
pcvctl container snap create app-ctr --name v1
# 스냅샷 목록
pcvctl container snap list app-ctr
# 롤백
pcvctl container snap rollback app-ctr v1
# 삭제
pcvctl container snap delete app-ctr v1
Terminal window
# CoW 클론 (lxc-copy, ZFS 기반)
pcvctl container clone app-ctr --name app-ctr-clone
Terminal window
# 호스트 디렉터리를 컨테이너에 바인드 마운트
echo '{"jsonrpc":"2.0","method":"container.volume.attach","params":{
"name": "app-ctr",
"host_path": "/data/shared",
"container_path": "/mnt/shared",
"readonly": false
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# 볼륨 목록
echo '{"jsonrpc":"2.0","method":"container.volume.list","params":{
"name": "app-ctr"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# 볼륨 분리
echo '{"jsonrpc":"2.0","method":"container.volume.detach","params":{
"name": "app-ctr",
"container_path": "/mnt/shared"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool

경로 순회 방어: realpath 검증으로 심볼릭 링크를 통한 경로 순회 공격을 차단합니다.

Terminal window
# 환경변수 설정 (멱등 upsert)
echo '{"jsonrpc":"2.0","method":"container.env.set","params":{
"name": "app-ctr",
"key": "DATABASE_URL",
"value": "postgresql://localhost:5432/app"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# 환경변수 목록
echo '{"jsonrpc":"2.0","method":"container.env.list","params":{
"name": "app-ctr"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# 환경변수 삭제
echo '{"jsonrpc":"2.0","method":"container.env.delete","params":{
"name": "app-ctr",
"key": "DATABASE_URL"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool

컨테이너에 주기적 헬스체크를 등록할 수 있습니다.

Terminal window
# 헬스체크 등록
echo '{"jsonrpc":"2.0","method":"container.health.set","params":{
"name": "app-ctr",
"cmd": "curl -sf http://localhost:8080/health || exit 1",
"interval": 30,
"timeout": 5,
"retries": 3
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# 헬스 상태 확인
echo '{"jsonrpc":"2.0","method":"container.health.get","params":{
"name": "app-ctr"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool

상태값: healthy | unhealthy | starting

Terminal window
# 헬스체크 해제
echo '{"jsonrpc":"2.0","method":"container.health.delete","params":{
"name": "app-ctr"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
Terminal window
# 최근 100줄 로그 조회
echo '{"jsonrpc":"2.0","method":"container.logs","params":{
"name": "app-ctr",
"lines": 100
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool

실행 중인 컨테이너의 상태를 저장하고 나중에 복원할 수 있습니다.

Terminal window
# 체크포인트 (실행 상태 저장)
pcvctl container checkpoint app-ctr --dir /tmp/criu-app
# 복원 (체크포인트에서 재개)
pcvctl container restore app-ctr --dir /tmp/criu-app
/etc/purecvisor/seccomp/default.seccomp
# 프로파일 설정
pcvctl container seccomp-set app-ctr --profile default
# 현재 프로파일 조회
pcvctl container seccomp-get app-ctr

컨테이너도 VM과 동일한 NIC 관리 기능을 제공합니다.

Terminal window
# NIC 목록
echo '{"jsonrpc":"2.0","method":"container.nic.list","params":{
"name": "app-ctr"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# NIC 추가
echo '{"jsonrpc":"2.0","method":"container.nic.attach","params":{
"name": "app-ctr",
"bridge": "pcvbr0"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool
# NIC 분리
echo '{"jsonrpc":"2.0","method":"container.nic.detach","params":{
"name": "app-ctr",
"interface": "eth1"
},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool