Une machine virtuelle complète dans Docker avec une interface web
Parfois, vous devez vérifier rapidement un script douteux, tester l'installation d'un logiciel sur une distribution propre ou déployer un environnement avec un noyau spécifique. Lancer VirtualBox pour cela est trop fastidieux, configurer Proxmox sur un ordinateur portable professionnel est disproportionné, et un conteneur Docker classique n'offre pas d'isolation au niveau du noyau.
Récemment, je suis tombé sur un dépôt qemus/qemu. Le projet intègre QEMU avec l'accélération KVM dans un conteneur Docker classique et expose la gestion des VM directement dans le navigateur.
Comment fonctionne le projet
En essence, il s'agit d'un wrapper autour de QEMU qui gère toute la configuration fastidieuse de l'émulateur, du réseau, des disques et du client noVNC. Vous n'avez pas besoin d'écrire manuellement de longues options en ligne de commande ni de vous battre avec des fichiers de configuration XML libvirt.
Toute la gestion se résume à passer des variables d'environnement à docker-compose.yml. L'image télécharge automatiquement la distribution Linux requise, crée un disque virtuel, connecte KVM pour des performances quasi-natives et ouvre l'interface web sur le port 8006.
Le conteneur convient aussi bien au développement local qu'à l'exécution de VM dans Kubernetes ou GitHub Codespaces.
Démarrage rapide
Pour le lancer, vous avez seulement besoin d'un fichier compose minimal. Par exemple, déployons Linux Mint :
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
Après avoir lancé docker compose up -d, le service télécharge automatiquement l'ISO Mint et démarre la virtualisation.
Accédez à http://localhost:8006 dans votre navigateur et vous verrez l'écran d'installation du système d'exploitation. Aucun client VNC supplémentaire n'est nécessaire.
# Если вы предпочитаете чистый 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
Ce que peut faire le conteneur
Téléchargement automatique des distributions
Dans la variable BOOT, vous pouvez spécifier un nom court d'une distribution populaire. Le script sait où récupérer les dernières images :
arch,debian,fedora,ubuntu,alpinekali,nixos,gentoo,mint,manjarorocky,alma,cachy,tails
Si le système dont vous avez besoin n'est pas dans la liste prédéfinie, vous pouvez passer un lien direct vers n'importe quelle image :
environment:
BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.1-x86_64.iso"
Le conteneur décompresse les archives à la volée et prend en charge les images aux formats .iso, .qcow2, .vmdk, .vhdx et .vdi. Vous pouvez également monter un fichier local directement dans la racine du conteneur en tant que /boot.iso.
Gestion des disques et de la mémoire
Par défaut, la VM dispose d'un disque de 64 Go au format qcow2 dans le répertoire /storage. Vous pouvez modifier la taille à tout moment via la variable DISK_SIZE: "128G".
Si l'hôte manque de RAM, le conteneur prend en charge le memory ballooning. Cela permet de retourner dynamiquement la mémoire inutilisée de l'invité à l'hôte.
Partage de fichiers avec l'hôte
Pour transférer des fichiers entre l'hôte et la VM, le protocole 9pfs est utilisé :
volumes:
- ./my_host_folder:/shared
Dans le système invité en cours d'exécution, vous devez simplement monter le répertoire :
mount -t 9p -o trans=virtio shared /mnt/shared
Redirection de ports et réseau complet
Avec le mode bridge standard de Docker, la redirection de ports est configurée via le bloc ports familier. Pour exposer SSH en externe :
ports:
- 8006:8006
- 2222:22
Si la VM a besoin de sa propre adresse IP sur le réseau local (afin que le routeur domestique lui attribue une adresse séparée via DHCP), le conteneur peut être connecté via macvlan. Dans ce cas, il n'est pas nécessaire de mapper les ports en permanence.
Pass-through de matériel réel
Via le fichier compose, vous pouvez passer des disques physiques réels (/dev/sdb:/disk1) ou des périphériques USB en transmettant leurs identifiants à QEMU :
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x5678"
devices:
- /dev/bus/usb
Exigences système et limitations
La principale mise en garde réside dans la prise en charge de KVM.
Sans accès direct au périphérique /dev/kvm, l'accélération matérielle ne fonctionnera pas et l'émulation logicielle pure du CPU rendra les performances insupportablement lentes.
Où cela fonctionne sans problème :
- Les hôtes Linux avec support de virtualisation matérielle (Intel VT-x / AMD-V).
- Windows 11 avec Docker Desktop ou Podman Desktop avec virtualisation imbriquée activée.
Docker Desktop sur macOS et Windows 10 ne transmettent actuellement pas /dev/kvm dans les conteneurs, vous ne pourrez donc pas y exécuter le projet.
Vous pouvez vérifier la disponibilité de KVM sur Linux avec l'utilitaire standard :
sudo apt install cpu-checker
sudo kvm-ok
Si la commande affiche KVM acceleration can be used, le conteneur démarrera sans problème.
Ce que vous pouvez utiliser pour
- Tester des scénarios d'automatisation. Exécuter des installations Ansible ou bash propres dans une VM isolée sans risquer de casser votre système de travail.
- Exécution sécurisée de logiciels. Vérifier des paquets ou binaires suspects dans un environnement isolé qui peut être recréé avec une seule commande.
- Apprentissage et expérimentations. Explorer de nouvelles distributions (par exemple, NixOS ou Alpine) directement dans la fenêtre du navigateur sans se battre avec des clés USB.
- Pipelines CI/CD. Construire des paquets de noyau ou tester des logiciels système dans des machines virtuelles complètes sur des runners Kubernetes.
Résumé
Le projet qemus/qemu comble parfaitement la niche entre les conteneurs légers et les hyperviseurs lourds. Si vous avez régulièrement besoin de machines virtuelles isolées pour les tests sur une machine Linux ou un serveur domestique, cette image fait gagner beaucoup de temps sur la préparation des images et la configuration réseau.
Le dépôt est activement maintenu par l'organisation qemus, qui propose également des builds adaptés séparés pour ARM64, Windows et macOS.
Projets similaires