Eine vollwertige virtuelle Maschine in Docker mit einer Web-Oberfläche
Manchmal muss man schnell ein fragwürdiges Skript überprüfen, eine Softwareinstallation auf einer sauberen Distribution testen oder eine Umgebung mit einem bestimmten Kernel bereitstellen. VirtualBox dafür zu starten ist zu umständlich, Proxmox auf einem Arbeitslaptop einzurichten ist übertrieben, und ein gewöhnlicher Docker-Container bietet keine kernelbasierte Isolation.
Neulich bin ich auf ein Repository qemus/qemu gestoßen. Das Projekt verpackt QEMU mit KVM-Beschleunigung in einem gewöhnlichen Docker-Container und bietet VM-Verwaltung direkt im Browser.
Wie das Projekt funktioniert
Im Wesentlichen ist dies ein Wrapper um QEMU, der die gesamte mühsame Einrichtung des Emulators, Netzwerks, der Festplatten und des noVNC-Clients übernimmt. Man muss keine langen Kommandozeilen-Flags schreiben oder sich mit XML-Konfigurationen herumschlagen libvirt.
Die gesamte Verwaltung beschränkt sich auf das Übergeben von Umgebungsvariablen an docker-compose.yml. Das Image lädt automatisch die erforderliche Linux-Distribution herunter, erstellt eine virtuelle Festplatte, verbindet KVM für nahezu native Leistung und öffnet die Web-Oberfläche auf Port 8006.
Der Container eignet sich sowohl für die lokale Entwicklung als auch für das Ausführen von VMs in Kubernetes oder GitHub Codespaces.
Schnellstart
Um ihn zu starten, braucht man nur eine minimale Compose-Datei. Zum Beispiel Linux Mint bereitstellen:
services:
qemu:
image: qemux/qemu
container_name: qemu
environment:
BOOT: "mint"
RAM_SIZE: "4G"
CPU_CORES: "2"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
volumes:
- ./qemu_data:/storage
restart: always
stop_grace_period: 2m
Nach dem Ausführen von docker compose up -d lädt der Dienst automatisch das Mint-ISO herunter und startet die Virtualisierung.
Navigiert man im Browser zu http://localhost:8006, sieht man den Installationsbildschirm des Betriebssystems. Es müssen keine zusätzlichen VNC-Clients installiert werden.
# Если вы предпочитаете чистый Docker CLI:
docker run -it --rm --name qemu \
-e "BOOT=alpine" \
-p 8006:8006 \
--device=/dev/kvm \
--device=/dev/net/tun \
--cap-add NET_ADMIN \
-v "${PWD}/qemu_data:/storage" \
--stop-timeout 120 \
docker.io/qemux/qemu
Was der Container kann
Automatischer Download von Distributionen
In der Variable BOOT kann man einen Kurznamen einer gängigen Distribution angeben. Das Skript weiß, wo es die neuesten Images herbekommt:
arch,debian,fedora,ubuntu,alpinekali,nixos,gentoo,mint,manjarorocky,alma,cachy,tails
Wenn das gewünschte System nicht in der Vorauswahl enthalten ist, kann man einen direkten Link zu einem beliebigen Image übergeben:
environment:
BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.1-x86_64.iso"
Der Container entpackt Archive bei Bedarf und unterstützt Images in den Formaten .iso, .qcow2, .vmdk, .vhdx und .vdi. Man kann auch eine lokale Datei direkt als /boot.iso in den Container-Root einhängen.
Arbeit mit Festplatten und Speicher
Standardmäßig erhält die VM eine 64 GB große Festplatte im qcow2-Format im Verzeichnis /storage. Die Größe kann jederzeit über die Variable DISK_SIZE: "128G" geändert werden.
Wenn dem Host der RAM ausgeht, unterstützt der Container Memory Ballooning. Dadurch kann ungenutzter Gast-Speicher dynamisch an den Host zurückgegeben werden.
Dateiaustausch mit dem Host
Um Dateien zwischen Host und VM zu übertragen, wird das 9pfs-Protokoll verwendet:
volumes:
- ./my_host_folder:/shared
Im laufenden Gast-System muss man das Verzeichnis nur einhängen:
mount -t 9p -o trans=virtio shared /mnt/shared
Port-Weiterleitung und vollständige Netzwerkfunktionalität
Mit dem Standard-Docker-Bridge-Modus wird die Port-Weiterleitung über den bekannten ports-Block konfiguriert. Um SSH extern weiterzuleiten:
ports:
- 8006:8006
- 2222:22
Wenn die VM eine eigene IP-Adresse im lokalen Netzwerk benötigt (damit der Heimrouter ihr über DHCP eine separate Adresse zuweist), kann der Container über macvlan verbunden werden. In diesem Fall ist keine ständige Port-Zuordnung erforderlich.
Durchreichung realer Hardware
Durch die Compose-Datei kann man reale physische Laufwerke (/dev/sdb:/disk1) oder USB-Geräte durchreichen, indem man ihre Bezeichner an QEMU übergibt:
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x5678"
devices:
- /dev/bus/usb
Systemanforderungen und Einschränkungen
Der Hauptvorbehalt liegt bei der KVM-Unterstützung.
Ohne direkten Zugriff auf das Gerät /dev/kvm funktioniert die Hardwarebeschleunigung nicht, und eine reine Software-CPU-Emulation macht die Leistung unerträglich langsam.
Wo es reibungslos funktioniert:
- Linux-Hosts mit Hardware-Virtualisierungsunterstützung (Intel VT-x / AMD-V).
- Windows 11 mit Docker Desktop oder Podman Desktop mit aktivierter verschachtelter Virtualisierung.
Docker Desktop auf macOS und Windows 10 leitet derzeit kein /dev/kvm an Container weiter, sodass man das Projekt dort nicht ausführen kann.
Die KVM-Verfügbarkeit kann man unter Linux mit dem Standard-Tool prüfen:
sudo apt install cpu-checker
sudo kvm-ok
Wenn der Befehl KVM acceleration can be used ausgibt, startet der Container ohne Probleme.
Wofür man dies verwenden kann
- Testen von Automatisierungsszenarien. Ausführen sauberer Ansible- oder Bash-Skript-Installationen in einer isolierten VM, ohne das eigene Arbeitssystem zu gefährden.
- Safe Softwareausführung. Überprüfen verdächtiger Pakete oder Binärdateien in einer isolierten Umgebung, die mit einem einzigen Befehl neu erstellt werden kann.
- Lernen und Experimentieren. Neue Distributionen erkunden (z. B. NixOS oder Alpine) direkt im Browserfenster, ohne sich mit USB-Sticks herumschlagen zu müssen.
- CI/CD-Pipelines. Erstellen von Kernel-Paketen oder Testen von Systemsoftware in vollständigen virtuellen Maschinen auf Kubernetes-Runnern.
Zusammenfassung
Das Projekt qemus/qemu füllt die Nische zwischen leichtgewichtigen Containern und schwergewichtigen Hypervisoren perfekt aus. Wenn man regelmäßig isolierte virtuelle Maschinen zum Testen auf einem Linux-Rechner oder Heimserver benötigt, spart dieses Image viel Zeit bei der Image-Vorbereitung und Netzwerkkonfiguration.
Das Repository wird aktiv von der qemus-Organisation gepflegt, die auch separate angepasste Builds für ARM64, Windows und macOS bereitstellt.
Ähnliche Projekte