Docker Container Deployment
Deploy PiVirt components (pivirtd, agent, director) as containerized workloads using Docker and Docker Compose for local development or testing.
Prerequisites
Section titled “Prerequisites”- Docker 24.0+
- Docker Compose 2.20+
- KVM support on host
Quick Start
Section titled “Quick Start”Single Node with Docker Compose
Section titled “Single Node with Docker Compose”# Create directorymkdir pivirt-docker && cd pivirt-docker
# Download compose filecurl -O https://raw.githubusercontent.com/pilab-dev/pivirt/main/docker/docker-compose.yaml
# Start PiVirtdocker compose up -d
# Check statusdocker compose ps
# View logsdocker compose logs -fdocker-compose.yaml
Section titled “docker-compose.yaml”version: '3.8'
services: pivirtd: image: pilab-cloud/pivirtd:latest container_name: pivirtd privileged: true ports: - "9001:9001" - "9002:9002" volumes: - /dev/kvm:/dev/kvm - pivirtd-data:/var/lib/pivirtd - ./config/pivirtd:/etc/pivirtd environment: - PIVIRT_LOG_LEVEL=info restart: unless-stopped
agent: image: pilab-cloud/pivirt-agent:latest container_name: pivirt-agent ports: - "8443:8443" - "8444:8444" volumes: - ./config/agent:/etc/pivirt-agent environment: - PIVIRT_LOG_LEVEL=info depends_on: - pivirtd restart: unless-stopped
iscsiman: image: pilab-cloud/iscsiman:latest container_name: iscsiman privileged: true ports: - "9003:9003" volumes: - /dev:/dev - ./config/iscsiman:/etc/iscsiman environment: - PIVIRT_LOG_LEVEL=info restart: unless-stopped
volumes: pivirtd-data:Configuration
Section titled “Configuration”Create Configuration Files
Section titled “Create Configuration Files”# Create config directoriesmkdir -p config/{pivirtd,agent,iscsiman}
# Create pivirtd configcat > config/pivirtd/config.yaml <<EOFserver: grpc_addr: "0.0.0.0:9001" http_addr: "0.0.0.0:9002"
hypervisor: type: "qemu"
storage: default_pool: "default" pools: - name: "default" type: "dir" path: "/var/lib/pivirtd/images"
network: default_bridge: "virbr0"
logging: level: "info" format: "json"EOF
# Create agent configcat > config/agent/config.yaml <<EOFserver: connectrpc: addr: "0.0.0.0:8443" grpc_internal: addr: "0.0.0.0:9000" metrics: addr: "0.0.0.0:8444"
backends: pivirtd: endpoint: "pivirtd:9001" timeout: "30s"
logging: level: "info" format: "json"EOFRunning Individual Components
Section titled “Running Individual Components”pivirtd
Section titled “pivirtd”docker run -d \ --name pivirtd \ --privileged \ -p 9001:9001 \ -p 9002:9002 \ -v /dev/kvm:/dev/kvm \ -v pivirtd-data:/var/lib/pivirtd \ -v ./config/pivirtd:/etc/pivirtd \ pilab-cloud/pivirtd:latestdocker run -d \ --name pivirt-agent \ -p 8443:8443 \ -p 8444:8444 \ -v ./config/agent:/etc/pivirt-agent \ --link pivirtd \ pilab-cloud/pivirt-agent:latestdocker run --rm -it \ -v ~/.config/pvcli:/root/.config/pvcli \ pilab-cloud/pvcli:latest \ vm listMulti-Node Setup
Section titled “Multi-Node Setup”Node 1 (Control Plane)
Section titled “Node 1 (Control Plane)”version: '3.8'
services: pivirtd: image: pilab-cloud/pivirtd:latest privileged: true ports: - "9001:9001" - "9002:9002" volumes: - /dev/kvm:/dev/kvm - pivirtd-data:/var/lib/pivirtd - ./config/pivirtd:/etc/pivirtd
agent: image: pilab-cloud/pivirt-agent:latest ports: - "8443:8443" volumes: - ./config/agent:/etc/pivirt-agent depends_on: - pivirtd
etcd: image: quay.io/coreos/etcd:v3.5.0 ports: - "2379:2379" environment: - ETCD_NAME=node1 - ETCD_DATA_DIR=/etcd - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 - ETCD_ADVERTISE_CLIENT_URLS=http://node1:2379 volumes: - etcd-data:/etcd
volumes: pivirtd-data: etcd-data:Node 2 (Worker)
Section titled “Node 2 (Worker)”version: '3.8'
services: pivirtd: image: pilab-cloud/pivirtd:latest privileged: true ports: - "9001:9001" volumes: - /dev/kvm:/dev/kvm - pivirtd-data:/var/lib/pivirtd - ./config/pivirtd:/etc/pivirtd
agent: image: pilab-cloud/pivirt-agent:latest ports: - "8443:8443" volumes: - ./config/agent:/etc/pivirt-agent environment: - ETCD_ENDPOINTS=http://node1:2379 depends_on: - pivirtd
volumes: pivirtd-data:Networking
Section titled “Networking”Host Networking
Section titled “Host Networking”services: pivirtd: network_mode: "host"Custom Network
Section titled “Custom Network”networks: pivirt-net: driver: bridge ipam: config: - subnet: 172.20.0.0/16
services: pivirtd: networks: - pivirt-netStorage
Section titled “Storage”Bind Mounts
Section titled “Bind Mounts”volumes: - /var/lib/pivirtd:/var/lib/pivirtdNamed Volumes
Section titled “Named Volumes”volumes: - pivirtd-data:/var/lib/pivirtd
volumes: pivirtd-data: driver: localNFS Storage
Section titled “NFS Storage”volumes: - type: volume source: nfs-storage target: /var/lib/pivirtd volume: driver: local driver_opts: type: nfs o: addr=10.0.1.100,rw device: ":/exports/pivirtd"Monitoring
Section titled “Monitoring”Prometheus Metrics
Section titled “Prometheus Metrics”# Access metricscurl http://localhost:9002/metrics # pivirtdcurl http://localhost:8444/metrics # agentPrometheus Configuration
Section titled “Prometheus Configuration”scrape_configs: - job_name: 'pivirt-docker' static_configs: - targets: - 'localhost:9002' - 'localhost:8444'Troubleshooting
Section titled “Troubleshooting”Check Container Logs
Section titled “Check Container Logs”# View all logsdocker compose logs -f
# View specific servicedocker compose logs pivirtd -f
# View last 100 linesdocker compose logs --tail=100 pivirtdCheck Container Status
Section titled “Check Container Status”# List containersdocker compose ps
# Inspect containerdocker inspect pivirtd
# Check healthdocker compose exec pivirtd curl http://localhost:9002/healthKVM Access Issues
Section titled “KVM Access Issues”# Check KVM devicels -la /dev/kvm
# Add user to kvm groupsudo usermod -aG kvm $USER
# Restart Dockersudo systemctl restart docker