컨테이너 관리
PureCVisor는 LXC 컨테이너를 ZFS 백엔드와 통합하여 관리합니다.
4.1 컨테이너 생성
섹션 제목: “4.1 컨테이너 생성”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 생성과 컨테이너 생성의 전제조건을 구분하세요.
# 기본 생성 (LXC + ZFS rootfs)pcvctl container create --name app-ctr --dist ubuntu --release noble
# 생성 후 바로 시작pcvctl container create --name web-ctr --dist ubuntu --release jammypcvctl container start web-ctrRPC 직접 호출:
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.toolfire-and-forget: 컨테이너 생성/시작/중지/삭제는 모두 fire-and-forget 패턴으로 즉시 응답합니다.
4.2 라이프사이클
섹션 제목: “4.2 라이프사이클”# 시작 (cgroup v2 리소스 제한 자동 적용)pcvctl container start app-ctr
# 중지 (오퍼레이션 잠금으로 동시 실행 방지)pcvctl container stop app-ctr
# 삭제pcvctl container destroy app-ctr
# 목록 조회pcvctl container listREST API:
# 컨테이너 목록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/stop4.3 명령 실행
섹션 제목: “4.3 명령 실행”# 단일 명령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"4.4 리소스 제한 (cgroup v2)
섹션 제목: “4.4 리소스 제한 (cgroup v2)”# CPU/메모리 제한 설정pcvctl container set-limits app-ctr --cpu_quota 50 --memory_mb 1024# --cpu_quota: CPU quota# --memory_mb: 메모리 제한 (MB)RPC 직접 호출:
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네트워크 대역폭 QoS
섹션 제목: “네트워크 대역폭 QoS”# 대역폭 제한 (tc qdisc 기반, KB/s)pcvctl container set-bandwidth app-ctr --inbound 100000 --outbound 1000004.5 컨테이너 메트릭
섹션 제목: “4.5 컨테이너 메트릭”# 개별 컨테이너 메트릭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.1MB4.6 컨테이너 스냅샷
섹션 제목: “4.6 컨테이너 스냅샷”# 스냅샷 생성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 v14.7 컨테이너 복제
섹션 제목: “4.7 컨테이너 복제”# CoW 클론 (lxc-copy, ZFS 기반)pcvctl container clone app-ctr --name app-ctr-clone4.8 볼륨 마운트
섹션 제목: “4.8 볼륨 마운트”# 호스트 디렉터리를 컨테이너에 바인드 마운트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검증으로 심볼릭 링크를 통한 경로 순회 공격을 차단합니다.
4.9 환경 변수
섹션 제목: “4.9 환경 변수”# 환경변수 설정 (멱등 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.tool4.10 헬스체크
섹션 제목: “4.10 헬스체크”컨테이너에 주기적 헬스체크를 등록할 수 있습니다.
# 헬스체크 등록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
# 헬스체크 해제echo '{"jsonrpc":"2.0","method":"container.health.delete","params":{ "name": "app-ctr"},"id":"1"}' | nc -U /var/run/purecvisor/daemon.sock | python3 -m json.tool4.11 컨테이너 로그
섹션 제목: “4.11 컨테이너 로그”# 최근 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.tool4.12 CRIU 체크포인트/복원
섹션 제목: “4.12 CRIU 체크포인트/복원”실행 중인 컨테이너의 상태를 저장하고 나중에 복원할 수 있습니다.
# 체크포인트 (실행 상태 저장)pcvctl container checkpoint app-ctr --dir /tmp/criu-app
# 복원 (체크포인트에서 재개)pcvctl container restore app-ctr --dir /tmp/criu-app4.13 Seccomp 프로파일
섹션 제목: “4.13 Seccomp 프로파일”# 프로파일 설정pcvctl container seccomp-set app-ctr --profile default# 현재 프로파일 조회pcvctl container seccomp-get app-ctr4.14 NIC 관리 (VM 동등 기능)
섹션 제목: “4.14 NIC 관리 (VM 동등 기능)”컨테이너도 VM과 동일한 NIC 관리 기능을 제공합니다.
# 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