Run dynadock + Caddy environments in isolated VMs created by libvirt/KVM.
Project description
dockvirt
Create lightweight, isolated development environments with a single command.
dockvirt is a CLI tool that automates the process of creating virtual machines (VMs) using libvirt/KVM. It allows you to instantly run applications in Docker containers, with a pre-configured Caddy reverse proxy, fully isolated from your host operating system.
๐ค Why dockvirt?
The idea for dockvirt was born from the daily problems of developers working on their workstations. The main challenges it solves are:
๐ซ Problem: Port Conflicts on Your Workstation
# A typical developer situation
docker run -p 3000:3000 frontend-app # Port 3000 is busy
docker run -p 8080:8080 backend-app # Port 8080 is busy
docker run -p 5432:5432 postgres # Port 5432 is busy
# Local services on your system also use ports!
โ Solution: Full Isolation in a VM
# With dockvirt, each application gets its own VM
dockvirt up --name frontend --domain frontend.local --image frontend-app:latest --port 3000
dockvirt up --name backend --domain backend.local --image backend-app:latest --port 8080
dockvirt up --name db --domain db.local --image postgres:latest --port 5432
# Each VM has its own port space - zero conflicts!
๐ฏ Key Advantages of the Solution:
- Eliminates Port Conflicts: Each application runs in a separate VM with its own network space.
- Isolates Environments: Different versions of Node.js, Python, and databases without dependency conflicts.
- Protects the Host System: Experiments in a VM do not affect the stability of your workstation.
- Simplifies Networking: Precise domains instead of memorizing ports.
- Allows Easy Switching: Quickly bring different projects
upordown. - It's Lightweight and Fast: Cloud-init + automatic images = a quick start.
- Gives You Full Control: Based on libvirt for advanced configuration possibilities.
๐ Comparison with Other Tools
| Tool | Key Advantages | Key Disadvantages |
|---|---|---|
| dockvirt | Full isolation (VM), simplicity, automation | Requires KVM (Linux only) |
| Docker Compose | Speed, simplicity, high popularity | No full isolation from the host system |
| Vagrant | Support for multiple providers, flexibility | Slower start, more complex configuration |
| Multipass | Very simple to use, good integration with Ubuntu | Limited control, strong ties to Canonical |
๐ Key Features
- End-to-End Automation: Create, configure, and destroy VMs with simple commands.
- Universal: Works on popular Linux distributions (Ubuntu, Fedora, and more).
- Flexibility: Full control over VM configuration (RAM, CPU, disk).
- Pre-configured Environment: Automatic installation of Docker and Caddy inside the VM.
- Isolation: Each environment runs in a separate virtual machine.
๐ง Requirements
- A Linux operating system with KVM support.
- Installed packages:
qemu-kvm,libvirt-daemon-system,virt-manager,cloud-image-utils. - A cloud image (
.qcow2) for your chosen distribution (e.g., Ubuntu 22.04, Fedora Cloud Base).
๐ฆ Installation
๐ง Linux (Native)
-
Install from PyPI (recommended):
pip install dockvirt
-
Or install from the repository (for developers):
git clone https://github.com/dynapsys/dockvirt.git cd dockvirt make install
๐ช Windows (WSL2)
dockvirt works perfectly on WSL2, solving port conflict issues between Windows and your development applications:
-
Install WSL2 with Ubuntu:
# In PowerShell as Administrator wsl --install -d Ubuntu-22.04
-
In WSL2, install the dependencies:
# Update the system sudo apt update && sudo apt upgrade -y # Install KVM/QEMU and libvirt sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils sudo apt install -y cloud-image-utils # for cloud-localds # Add your user to the required groups sudo usermod -a -G libvirt,kvm $USER newgrp libvirt # Install dockvirt pip install dockvirt
-
Start libvirt:
sudo systemctl enable --now libvirtd sudo systemctl start libvirtd
๐ณ System Requirements
Linux/WSL2:
- KVM/QEMU (virtualization support)
- libvirt-daemon-system
- cloud-image-utils (
cloud-localds) - Docker (for building application images)
Checking for virtualization support:
# Check if KVM is available
lsmod | grep kvm
egrep -c '(vmx|svm)' /proc/cpuinfo # Should be > 0
๐๏ธ How It Works
VM Creation Process Flow
graph TD
A[dockvirt up] --> B{config.yaml exists?}
B -->|No| C[Create default config.yaml]
B -->|Yes| D[Load configuration]
C --> D
D --> E{OS image exists locally?}
E -->|No| F[Download image from URL]
E -->|Yes| G[Use local image]
F --> G
G --> H[Render cloud-init templates]
H --> I[Create cloud-init ISO]
I --> J[Create VM disk with backing file]
J --> K[Run virt-install]
K --> L[VM ready with Docker + Caddy]
System Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HOST SYSTEM โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ dockvirt CLI โ
โ โโโ config.py (configuration management) โ
โ โโโ image_manager.py (OS image downloading) โ
โ โโโ vm_manager.py (VM creation/destruction) โ
โ โโโ cli.py (user interface) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ~/.dockvirt/ โ
โ โโโ config.yaml (default configuration) โ
โ โโโ images/ (OS image cache) โ
โ โโโ vm_name/ (cloud-init files for each VM) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ libvirt/KVM โ
โ โโโ virt-install (VM creation) โ
โ โโโ virsh (VM management) โ
โ โโโ qemu-kvm (virtualization) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ VIRTUAL MACHINE โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Ubuntu/Fedora OS + cloud-init โ
โ โโโ Docker Engine (automatically installed) โ
โ โโโ docker-compose (runs containers) โ
โ โโโ Caddy (reverse proxy on port 80/443) โ
โ โโโ App Container (Your application) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ๏ธ Configuration
dockvirt automatically creates a configuration file at ~/.dockvirt/config.yaml on its first run:
default_os: ubuntu22.04
images:
ubuntu22.04:
url: https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
variant: ubuntu22.04
fedora38:
url: https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2
variant: fedora-cloud-base-38
๐ฅ๏ธ Usage
๐ New Workflow - Docker Build Inside the VM
From now on, Docker images are built automatically inside the VM! You no longer need to build images on the host.
# Old way (no longer necessary):
# docker build -t my-app:latest .
# dockvirt up --image my-app:latest
# New way - just run:
cd my-project/ # directory with a Dockerfile
dockvirt up --name my-app --domain my-app.local --image my-app:latest --port 80
# The Dockerfile and your app files are automatically copied to the VM and built there!
๐ Quick Start with a .dockvirt File
The easiest way is to create a .dockvirt file in your project directory (like an .env file):
# Create the .dockvirt file
cat > .dockvirt << EOF
name=my-app
domain=my-app.local
image=my-app:latest
port=80
os=ubuntu22.04
EOF
# Now, just run (in the directory with the Dockerfile):
dockvirt up
๐ง Or Use CLI Parameters
# Use the default OS (ubuntu22.04)
dockvirt up \
--name my-app \
--domain my-app.local \
--image nginx:latest \
--port 80
# Or choose a specific OS
dockvirt up \
--name fedora-app \
--domain fedora-app.local \
--image httpd:latest \
--port 80 \
--os fedora38
๐ Accessing Your Application
After creating the VM, dockvirt will display its IP address. Add it to your /etc/hosts file:
<ip_address> my-app.local
The .dockvirt file has priority over the default parameters, but CLI parameters override everything.
๐ฅ Advanced Usage Examples
๐ Example 1: Multi-Tenant SaaS Platform
Scenario: Each SaaS customer gets a completely isolated application instance in a separate VM.
# Customer A
dockvirt up --name client-a --domain client-a.myaas.com --image myapp:v2.1 --os ubuntu22.04
# Customer B
dockvirt up --name client-b --domain client-b.myaas.com --image myapp:v1.9 --os fedora38
# Customer C (beta tester)
dockvirt up --name client-c --domain beta.myaas.com --image myapp:v3.0-beta --os ubuntu22.04
Result:
- โ Zero conflicts between customers
- โ Different application versions for different customers
- โ Full data and resource isolation
- โ Automatic SSL/TLS for each domain
๐ Example 2: Development Environment as Code
Scenario: The entire development team gets identical environments with a single command.
# .dockvirt-stack (multi-app)
stack:
frontend:
image: myapp-frontend:latest
domain: app.dev.local
os: ubuntu22.04
backend:
image: myapp-api:latest
domain: api.dev.local
os: ubuntu22.04
database:
image: postgres:15
domain: db.dev.local
os: fedora38
# Developer One
dockvirt stack deploy dev-john
# Developer Two
dockvirt stack deploy dev-jane
# QA environment
dockvirt stack deploy qa-env
๐ Detailed Examples
We have prepared several practical examples to show you the possibilities of the new, simplified API:
- Example 1: Static Nginx Website - Basic usage with automatic image downloading
- Example 2: Python Flask Web App - An application with an Ubuntu vs. Fedora comparison
- Example 3: Operating System Comparison - Configuring custom images and performance testing
Each example now uses the new, simplified API - you no longer need to provide image paths or OS variants!
๐จ Troubleshooting
โ "cloud-localds: command not found"
# Install the missing package
sudo apt install cloud-image-utils
# Or on RPM-based systems
sudo dnf install cloud-utils
โ "Permission denied" when accessing libvirt
# Add your user to the libvirt group
sudo usermod -a -G libvirt $USER
newgrp libvirt
# Restart the service
sudo systemctl restart libvirtd
โ KVM not available
# Check if virtualization is enabled in your BIOS
egrep -c '(vmx|svm)' /proc/cpuinfo
# On WSL2, make sure Hyper-V is enabled
# In PowerShell as Administrator:
# Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
โ Port conflicts on Windows + WSL2
# Check which ports Windows is using
netstat -an | findstr LISTENING
# In WSL2, all VMs have isolated ports
dockvirt up --name app1 --domain app1.local --image nginx --port 80
dockvirt up --name app2 --domain app2.local --image apache --port 80
# Both run without conflicts!
๐พ Generating Images and Packages
๐ฆ Distribution Packages (.deb/.rpm)
# Generate a .deb package with automatic Docker installation
dockvirt generate-image \
--type deb-package \
--output my-app.deb \
--apps "nginx:latest,postgres:13" \
--domains "app.local,db.local"
# Generate an .rpm package
dockvirt generate-image \
--type rpm-package \
--output my-app.rpm \
--apps "nginx:latest" \
--domains "app.local"
๐ฅง Raspberry Pi SD Card Image
# Generate an SD card image with dockvirt pre-installed
dockvirt generate-image \
--type raspberry-pi \
--size 8GB \
--output rpi-dockvirt.img \
--apps "nginx:latest,postgres:13" \
--domains "app.pi.local,db.pi.local"
# Flash to an SD card
dd if=rpi-dockvirt.img of=/dev/sdX bs=4M status=progress
๐ป PC Bootable ISO
# Generate a bootable ISO for a PC/server
dockvirt generate-image \
--type pc-iso \
--size 16GB \
--output production-server.iso \
--config production-stack.yaml
Example production-stack.yaml:
apps:
frontend:
image: mycompany/frontend:v2.1
domain: app.company.com
port: 3000
api:
image: mycompany/api:v2.1
domain: api.company.com
port: 8080
monitoring:
image: grafana/grafana:latest
domain: monitoring.company.com
port: 3000
config:
auto_start: true
ssl_enabled: true
backup_enabled: true
๐ข Podman Support
# Use Podman instead of Docker
export DOCKVIRT_RUNTIME=podman
dockvirt up --name my-app --image nginx:latest
# Or in the .dockvirt file
runtime=podman
name=my-app
image=nginx:latest
๐ ๏ธ Development
The repository contains a Makefile to facilitate the development process. See the CONTRIBUTING.md file to learn how to contribute to the project's development.
โ๏ธ Author
Tom Sapletta - An experienced programmer and open-source enthusiast. Passionate about automation and creating tools that make developers' lives easier.
๐ License
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dockvirt-0.1.6.tar.gz.
File metadata
- Download URL: dockvirt-0.1.6.tar.gz
- Upload date:
- Size: 26.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18b2bfa853e2569557f2a2397b8bd78039fb85e95ebfe91a201cc3f4a5d5ca32
|
|
| MD5 |
8aa62cad898be41a57b36e2c93780e97
|
|
| BLAKE2b-256 |
ac1ba2c1aa8157e78fdf14bb348fa0d25726623ab7c1f1992d083d889fab0667
|
File details
Details for the file dockvirt-0.1.6-py3-none-any.whl.
File metadata
- Download URL: dockvirt-0.1.6-py3-none-any.whl
- Upload date:
- Size: 23.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87ae027d341e692e50d824a6b8163dc634cd870678bf647ed51d9ce360140703
|
|
| MD5 |
198fdaa882f724c01a198094cf23387b
|
|
| BLAKE2b-256 |
8ad698bbf3bf290e76b80e14c178bf012d67d73bc6ec5c90b09a4927b85bc45a
|