>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Shell

Docker 内置带 Web 界面的完整虚拟机

QEMU Docker Logo

有时候你需要快速检查一个可疑的脚本、在干净的发行版上测试软件安装,或者部署一个特定内核的环境。为此启动 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 变量中,你可以指定一个流行发行版的简短名称。脚本知道从哪里获取最新镜像:

  • archdebianfedoraubuntualpine
  • kalinixosgentoomintmanjaro
  • rockyalmacachytails

如果你的系统不在预设列表中,可以传递任意镜像的直接链接:

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 模拟会使性能变得难以忍受地慢。

能够流畅运行的场景:

  1. 支持硬件虚拟化的 Linux 主机(Intel VT-x / AMD-V)。
  2. 启用了嵌套虚拟化的 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,容器将可以正常启动。

应用场景

  1. 测试自动化场景。 在隔离的虚拟机中运行干净的 Ansible 或 bash 脚本安装,避免破坏工作系统。
  2. 安全运行软件。 在隔离环境中检查可疑的软件包或二进制文件,可以用一个命令重新创建环境。
  3. 学习和实验。 在浏览器窗口中探索新的发行版(如 NixOS 或 Alpine),无需处理 U 盘。
  4. CI/CD 流水线。 在 Kubernetes runner 上的完整虚拟机中构建内核包或测试系统软件。

总结

qemus/qemu 项目完美地填补了轻量级容器和重量级虚拟机管理程序之间的空白。如果你经常需要在 Linux 机器或家庭服务器上使用隔离的虚拟机进行测试,这个镜像可以节省大量镜像准备和网络配置的时间。

该仓库由 qemus 组织积极维护,该组织还为 ARM64、Windows 和 macOS 提供了单独适配的构建版本。

相关项目