Docker 内置带 Web 界面的完整虚拟机
有时候你需要快速检查一个可疑的脚本、在干净的发行版上测试软件安装,或者部署一个特定内核的环境。为此启动 VirtualBox 太麻烦,在工作笔记本上搭建 Proxmox 又过于复杂,而普通的 Docker 容器无法提供内核级别的隔离。
最近我发现了一个仓库 qemus/qemu。该项目将 QEMU 和 KVM 加速打包到一个普通的 Docker 容器中,并直接在浏览器中暴露虚拟机管理界面。
项目工作原理
本质上,这是一个 QEMU 的封装器,负责处理模拟器、网络、磁盘和 noVNC 客户端的所有繁琐设置。你不需要手动编写冗长的命令行参数或处理 XML 配置 libvirt。
所有管理工作简化为向 docker-compose.yml 传递环境变量。镜像会自动下载所需的 Linux 发行版、创建虚拟磁盘、连接 KVM 以获得接近原生性能,并在 8006 端口打开 Web 界面。
该容器适用于本地开发和在 Kubernetes 或 GitHub Codespaces 中运行虚拟机。
快速开始
启动它只需要一个最简的 compose 文件。例如,部署 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
运行 docker compose up -d 后,服务会自动下载 Mint ISO 并启动虚拟化。
在浏览器中访问 http://localhost:8006,你将看到操作系统安装界面。无需安装额外的 VNC 客户端。
# Если вы предпочитаете чистый 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
容器能做什么
自动下载发行版
在 BOOT 变量中,你可以指定一个流行发行版的简短名称。脚本知道从哪里获取最新镜像:
arch、debian、fedora、ubuntu、alpinekali、nixos、gentoo、mint、manjarorocky、alma、cachy、tails
如果你的系统不在预设列表中,可以传递任意镜像的直接链接:
environment:
BOOT: "https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-virt-3.19.1-x86_64.iso"
容器会即时解压归档文件,支持 .iso、.qcow2、.vmdk、.vhdx 和 .vdi 格式的镜像。你也可以将本地文件直接挂载到容器根目录作为 /boot.iso。
磁盘和内存管理
默认情况下,虚拟机在 /storage 目录中获得一个 64 GB 的 qcow2 格式磁盘。你可以通过 DISK_SIZE: "128G" 变量随时更改大小。
如果主机内存不足,容器支持内存气球技术。这有助于动态将未使用的客户机内存归还给主机。
与主机共享文件
要在主机和虚拟机之间传输文件,使用 9pfs 协议:
volumes:
- ./my_host_folder:/shared
在运行的客户机系统中,只需挂载该目录:
mount -t 9p -o trans=virtio shared /mnt/shared
端口转发和完整网络
使用标准 Docker 桥接模式时,端口转发通过熟悉的 ports 块配置。要向外暴露 SSH:
ports:
- 8006:8006
- 2222:22
如果虚拟机需要在自己的局域网 IP 地址(让家庭路由器通过 DHCP 分配独立地址),可以将容器通过 macvlan 连接。这种情况下不需要持续的端口映射。
直通真实硬件
通过 compose 文件,你可以直通真实的物理驱动器(/dev/sdb:/disk1)或 USB 设备,方法是将它们的标识符传递给 QEMU:
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x5678"
devices:
- /dev/bus/usb
系统要求和限制
主要限制在于 KVM 支持。
如果没有直接访问 /dev/kvm 设备的权限,硬件加速将无法工作,而纯软件 CPU 模拟会使性能变得难以忍受地慢。
能够流畅运行的场景:
- 支持硬件虚拟化的 Linux 主机(Intel VT-x / AMD-V)。
- 启用了嵌套虚拟化的 Docker Desktop 或 Podman Desktop 的 Windows 11。
macOS 上的 Docker Desktop 和 Windows 10 目前不会将 /dev/kvm 传递到容器中,因此你无法在那里运行该项目。
你可以通过标准工具检查 Linux 上的 KVM 可用性:
sudo apt install cpu-checker
sudo kvm-ok
如果命令输出 KVM acceleration can be used,容器将可以正常启动。
应用场景
- 测试自动化场景。 在隔离的虚拟机中运行干净的 Ansible 或 bash 脚本安装,避免破坏工作系统。
- 安全运行软件。 在隔离环境中检查可疑的软件包或二进制文件,可以用一个命令重新创建环境。
- 学习和实验。 在浏览器窗口中探索新的发行版(如 NixOS 或 Alpine),无需处理 U 盘。
- CI/CD 流水线。 在 Kubernetes runner 上的完整虚拟机中构建内核包或测试系统软件。
总结
qemus/qemu 项目完美地填补了轻量级容器和重量级虚拟机管理程序之间的空白。如果你经常需要在 Linux 机器或家庭服务器上使用隔离的虚拟机进行测试,这个镜像可以节省大量镜像准备和网络配置的时间。
该仓库由 qemus 组织积极维护,该组织还为 ARM64、Windows 和 macOS 提供了单独适配的构建版本。
相关项目