>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicherheit
Shell

Eine vollwertige virtuelle Maschine in Docker mit einer Web-Oberfläche

QEMU Docker Logo

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, alpine
  • kali, nixos, gentoo, mint, manjaro
  • rocky, 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:

  1. Linux-Hosts mit Hardware-Virtualisierungsunterstützung (Intel VT-x / AMD-V).
  2. 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

  1. Testen von Automatisierungsszenarien. Ausführen sauberer Ansible- oder Bash-Skript-Installationen in einer isolierten VM, ohne das eigene Arbeitssystem zu gefährden.
  2. Safe Softwareausführung. Überprüfen verdächtiger Pakete oder Binärdateien in einer isolierten Umgebung, die mit einem einzigen Befehl neu erstellt werden kann.
  3. Lernen und Experimentieren. Neue Distributionen erkunden (z. B. NixOS oder Alpine) direkt im Browserfenster, ohne sich mit USB-Sticks herumschlagen zu müssen.
  4. 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