>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Shell

Een Volwaardige Virtuele Machine Binnen Docker met een Webinterface

QEMU Docker Logo

Soms moet je snel een verdacht script controleren, software-installatie testen op een schone distributie, of een omgeving met een specifieke kernel deployen. VirtualBox hiervoor opstarten is te veel gedoe, Proxmox instellen op een werklaptop is overkill, en een gewone Docker-container biedt geen kernel-niveau isolatie.

Onlangs stuitte ik op een repository qemus/qemu. Het project verpakt QEMU met KVM-acceleratie in een gewone Docker-container en biedt VM-beheer rechtstreeks in de browser.

Hoe het Project Werkt

Dit is in essentie een wrapper rond QEMU die alle lastige setup van de emulator, netwerken, schijven en noVNC-client afhandelt. Je hoeft geen lange command-line flags handmatig te schrijven of met XML-configs te rommelen libvirt.

Al het beheer komt neer op het doorgeven van environment variables aan docker-compose.yml. De image downloadt automatisch de benodigde Linux-distributie, maakt een virtuele schijf aan, verbindt KVM voor bijna-native prestaties, en opent de webinterface op poort 8006.

De container is geschikt voor zowel lokale ontwikkeling als het draaien van VM's in Kubernetes of GitHub Codespaces.

Snelle Start

Om het te starten heb je alleen een minimale compose file nodig. Laten we bijvoorbeeld Linux Mint deployen:

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

Na het draaien van docker compose up -d downloadt de service automatisch de Mint ISO en start de virtualisatie.

Navigeer naar http://localhost:8006 in je browser en je ziet het OS-installatiescherm. Er hoeven geen extra VNC-clients te worden geïnstalleerd.

# Если вы предпочитаете чистый 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

Wat de Container Kan Doen

Automatische Distributie Downloads

In de BOOT variable kun je een korte naam van een populaire distributie opgeven. Het script weet waar de nieuwste images te halen:

  • arch, debian, fedora, ubuntu, alpine
  • kali, nixos, gentoo, mint, manjaro
  • rocky, alma, cachy, tails

Als het systeem dat je nodig hebt niet in de vooringestelde lijst staat, kun je een directe link naar elke willekeurige image doorgeven:

environment:
  BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.1-x86_64.iso"

De container pakt archives on the fly uit en ondersteunt images in .iso, .qcow2, .vmdk, .vhdx, en .vdi formaten. Je kunt ook een lokaal bestand rechtstreeks in de container root mounten als /boot.iso.

Werken met Schijven en Geheugen

Standaard krijgt de VM een 64 GB schijf in qcow2-formaat binnen de /storage directory. Je kunt de grootte op elk moment wijzigen via de DISK_SIZE: "128G" variable.

Als de host zonder RAM komt te zitten, ondersteunt de container memory ballooning. Dit helpt om ongebruikt gastgeheugen dynamisch terug te geven aan de host.

Bestanden Delen met de Host

Om bestanden tussen de host en VM over te dragen, wordt het 9pfs protocol gebruikt:

volumes:
  - ./my_host_folder:/shared

Binnen het draaiende gastsysteem hoef je alleen de directory te mounten:

mount -t 9p -o trans=virtio shared /mnt/shared

Poortdoorverbinding en Volledige Netwerken

Met de standaard Docker bridge-modus wordt poortdoorverbinding geconfigureerd via het vertrouwde ports block. Om SSH extern door te sturen:

ports:
  - 8006:8006
  - 2222:22

Als de VM zijn eigen IP-adres op het lokale netwerk nodig heeft (zodat de thuisrouter het een apart adres via DHCP toewijst), kan de container worden verbonden via macvlan. In dit geval is er geen constante poortmapping nodig.

Echte Hardware Doorgeven

Via het compose bestand kun je echte fysieke schijven (/dev/sdb:/disk1) of USB-apparaten doorgeven door hun identifiers aan QEMU door te geven:

environment:
  ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x5678"
devices:
  - /dev/bus/usb

Systeemvereisten en Beperkingen

De belangrijkste beperking ligt in KVM-ondersteuning.

Zonder directe toegang tot het /dev/kvm apparaat werkt hardware-acceleratie niet, en pure software CPU-emulatie maakt prestaties ondragelijk traag.

Waar het soepel werkt:

  1. Linux-hosts met hardware-virtualisatieondersteuning (Intel VT-x / AMD-V).
  2. Windows 11 met Docker Desktop of Podman Desktop met geneste virtualisatie ingeschakeld.

Docker Desktop op macOS en Windows 10 geeft momenteel /dev/kvm niet door aan containers, dus je kunt het project daar niet draaien.

Je kunt KVM-beschikbaarheid op Linux controleren met het standaard hulpprogramma:

sudo apt install cpu-checker
sudo kvm-ok

Als de output KVM acceleration can be used toont, zal de container zonder problemen starten.

Waar Je Dit Voor kunt Gebruiken

  1. Testautomatisering-scenario's. Schone Ansible- of bash-scriptinstallaties draaien in een geïsoleerde VM zonder het risico je werkende systeem te breken.
  2. Veilige software-uitvoering. Verdachte packages of binaries controleren in een geïsoleerde omgeving die met één commando opnieuw kan worden aangemaakt.
  3. Leren en experimenteren. Nieuwe distributies verkennen (bijv. NixOS of Alpine) rechtstreeks in het browservenster zonder met USB-sticks te rommelen.
  4. CI/CD-pipelines. Kernel-packages bouwen of systeemsoftware testen binnen volledige virtuele machines op Kubernetes runners.

Samenvatting

Het qemus/qemu project vult perfect de niche tussen lichtgewicht containers en zware hypervisors. Als je regelmatig geïsoleerde virtuele machines voor testen op een Linux-machine of thuisserver nodig hebt, bespaart deze image veel tijd op image-voorbereiding en netwerkconfiguratie.

De repository wordt actief onderhouden door de qemus-organisatie, die ook aparte aangepaste builds heeft voor ARM64, Windows en macOS.

Gerelateerde projecten