在国产服务器上通过 Docker 部署 Windows 虚拟机

张开发
2026/4/11 3:52:30 15 分钟阅读

分享文章

在国产服务器上通过 Docker 部署 Windows 虚拟机
博客文章 在国产服务器麒麟 V10上通过 Docker 部署 Windows 虚拟机完整指南背景在一台基于海光处理器的麒麟 Linux V10 服务器上通过 Docker KVM 方式虚拟化运行 Windows 系统。适用于国产信创环境下需要运行 Windows 应用的场景。一、环境说明1.1 服务器硬件项目配置操作系统Kylin Linux Advanced Server V10 (Halberd)CPU海光 C86-3G 7380 32核 × 2路 128核内存502GB DDR4磁盘838GB系统盘 额外数据盘虚拟化AMD-V 硬件虚拟化支持1.2 为什么选择 Docker 方案直接安装qemu-kvm需要从软件仓库下载大量依赖包但在单机离线环境下无法联网yum 源中可能缺少核心组件。Docker 镜像包含了完整的 QEMU/KVM 环境只需导入一个镜像即可使用是离线环境下最便捷的方案。方案对比 ┌──────────────────┬──────────────┬──────────────────┐ │ 方案 │ 难度 │ 适用场景 │ ├──────────────────┼──────────────┼──────────────────┤ │ 直接安装 qemu-kvm│ 中等 │ 能联网的环境 │ │ Docker QEMU │ 简单 ⭐ │ 离线/快速部署 │ │ VMware/vBox │ 简单 │ 桌面环境 │ └──────────────────┴──────────────┴──────────────────┘二、环境检查关键步骤2.1 检查 CPU 虚拟化支持# 检查是否支持 SVMAMD 虚拟化或 VT-xIntel 虚拟化grep-Esvm|vmx/proc/cpuinfo|head-1# 输出 svm 表示支持 AMD-V# 统计支持虚拟化的 CPU 核心数grep-csvm /proc/cpuinfo# 输出 128 表示所有核心都支持预期输出flags : fpu vme de pse ... svm ...2.2 检查 KVM 内核模块# 检查 KVM 模块是否加载lsmod|grepkvm预期输出kvm_amd 135168 0 kvm 786432 1 kvm_amd irqbypass 16384 1 kvm如果未加载手动加载sudomodprobe kvmsudomodprobe kvm_amd2.3 检查 KVM 设备文件# 检查 /dev/kvm 是否存在ls-la/dev/kvm预期输出crw-rw---- 1 root kvm 10, 232 9月 22 2025 /dev/kvm如果不存在# 加载模块后通常会自动创建sudomodprobe kvm_amd# 如果仍然不存在手动创建不推荐sudomknod/dev/kvm c10232sudochmod666/dev/kvm2.4 检查嵌套虚拟化支持# 检查是否启用嵌套虚拟化cat/sys/module/kvm_amd/parameters/nested# 输出 1 或 Y 表示已启用如果返回0或N启用嵌套虚拟化# 临时启用sudomodprobe-rkvm_amdsudomodprobe kvm_amdnested1# 永久启用echooptions kvm_amd nested1|sudotee/etc/modprobe.d/kvm.conf# 验证cat/sys/module/kvm_amd/parameters/nested2.5 检查 Docker 环境# 检查 Docker 版本docker--version# Docker version 27.2.0, build 3ab4256# 检查 Docker 服务状态systemctl statusdocker# 检查 Docker 是否可以运行容器dockerps# 测试 Docker 功能dockerrun--rmhello-world2.6 一键检查脚本将以下内容保存为check-kvm-env.sh#!/bin/bashechoecho KVM Docker 虚拟化环境检查echoecho-e\n[1/6] CPU 虚拟化支持ifgrep-q-Esvm|vmx/proc/cpuinfo;thenecho ✅ CPU 支持硬件虚拟化echo 支持核心数:$(grep-c-Esvm|vmx/proc/cpuinfo)elseecho ❌ CPU 不支持硬件虚拟化fiecho-e\n[2/6] KVM 内核模块iflsmod|grep-qkvm;thenecho ✅ KVM 模块已加载lsmod|grepkvm|seds/^/ /elseecho ❌ KVM 模块未加载echo 请执行: sudo modprobe kvm sudo modprobe kvm_amdfiecho-e\n[3/6] KVM 设备文件if[-e/dev/kvm];thenecho ✅ /dev/kvm 存在ls-la/dev/kvm|seds/^/ /elseecho ❌ /dev/kvm 不存在fiecho-e\n[4/6] 嵌套虚拟化if[-f/sys/module/kvm_amd/parameters/nested];thenNESTED$(cat/sys/module/kvm_amd/parameters/nested)if[$NESTED1]||[$NESTEDY];thenecho ✅ 嵌套虚拟化已启用elseecho ⚠️ 嵌套虚拟化未启用echo 请执行: echo options kvm_amd nested1 | sudo tee /etc/modprobe.d/kvm.conffielif[-f/sys/module/kvm_intel/parameters/nested];thenNESTED$(cat/sys/module/kvm_intel/parameters/nested)echo ✅ Intel 嵌套虚拟化状态:$NESTEDelseecho ⚠️ 无法检测嵌套虚拟化状态fiecho-e\n[5/6] Docker 环境ifcommand-vdocker/dev/null;thenecho ✅ Docker 已安装echo 版本:$(docker--version)ifdockerps/dev/null;thenecho ✅ Docker 服务运行正常echo 运行中容器:$(dockerps-q|wc-l)个elseecho ❌ Docker 服务未运行fielseecho ❌ Docker 未安装fiecho-e\n[6/6] 系统资源echo 内存:$(free-h|awk/Mem:/ {print $2 总计, $7 可用})echo 磁盘:$(df-h/|awkNR2 {print $2 总计, $4 可用})echo CPU:$(nproc)核心echo-e\necho 检查完成echo运行chmodx check-kvm-env.sh ./check-kvm-env.sh预期输出 KVM Docker 虚拟化环境检查 [1/6] CPU 虚拟化支持 ✅ CPU 支持硬件虚拟化 支持核心数: 128 [2/6] KVM 内核模块 ✅ KVM 模块已加载 kvm_amd 135168 0 kvm 786432 1 kvm_amd [3/6] KVM 设备文件 ✅ /dev/kvm 存在 crw-rw---- 1 root kvm 10, 232 ... [4/6] 嵌套虚拟化 ✅ 嵌套虚拟化已启用 [5/6] Docker 环境 ✅ Docker 已安装 版本: Docker version 27.2.0 ✅ Docker 服务运行正常 运行中容器: 4 个 [6/6] 系统资源 内存: 502Gi 总计, 442Gi 可用 磁盘: 838G 总计, 592G 可用 CPU: 128 核心 检查完成 三、部署步骤3.1 准备工作创建工作目录# 创建项目目录mkdir-p/data/windows-vmcd/data/windows-vm# 创建存储目录mkdir-pstorage# 创建共享目录Windows 可访问的共享文件夹mkdir-pshare准备 Windows ISO可选如果有本地 ISO 文件# 方式一直接复制cp/path/to/windows.iso /data/windows-vm/windows.iso# 方式二通过 U 盘挂载mount/dev/sdb1 /mnt/usbcp/mnt/usb/Windows10.iso /data/windows-vm/windows.isoumount/mnt/usb如果没有 ISO 文件dockurr/windows镜像支持自动下载需要联网。3.2 创建 Docker Compose 配置文件cd/data/windows-vmvidocker-compose.yml将以下内容粘贴进去version:3.8services:windows:image:dockurr/windows:latestcontainer_name:windows-vmprivileged:truedevices:-/dev/kvmports:-8006:8006# Web 安装界面-3389:3389# 远程桌面 RDPvolumes:-./storage:/storage# 本地 ISO-./windows.iso:/storage/custom.isoenvironment:VERSION:win10# win8.1 / win10 / win11 / win2019 / win2022RAM_SIZE:8GCPU_CORES:4DISK_SIZE:100GUSERNAME:xxxPASSWORD:xxxxxxrestart:unless-stopped3.3 离线导入 Docker 镜像如果服务器无法联网需要在能联网的机器上提前导出镜像# 在联网机器上执行 # 拉取镜像dockerpull dockurr/windows:latest# 导出镜像为 tar 文件dockersave dockurr/windows:latest-odockurr-windows.tar# 查看文件大小ls-lhdockurr-windows.tar然后通过 U 盘或内网传输到目标服务器# 在目标服务器上执行 # 导入镜像dockerload-i/path/to/dockurr-windows.tar# 验证导入成功dockerimages|grepwindows3.4 启动 Windows 虚拟机cd/data/windows-vm# 后台启动docker-composeup-d# 查看启动日志docker-composelogs-f首次启动会经历以下过程1. 创建虚拟磁盘100GB ~30秒 2. 下载/加载 Windows ISO ~取决于网络或文件 3. 自动安装 Windows ~15-30分钟 4. 配置系统和用户账户 ~自动完成3.5 访问 Windows安装完成后通过以下方式访问方式地址说明Web 界面http://xx.xx.xx.xx:8006浏览器直接访问查看安装进度远程桌面xx.xx.xx.xx:3389使用 Windows 远程桌面客户端连接远程桌面连接信息地址xx.xx.xx.xx端口3389用户名xxx密码xxxxxxxx四、常用管理命令4.1 容器生命周期管理# 进入项目目录cd/data/windows-vm# 启动docker-composeup-d# 停止docker-composestop# 重启docker-composerestart# 查看状态docker-composeps# 查看日志docker-composelogs-f# 删除容器保留数据docker-composedown# 删除容器和数据慎用docker-composedown-v4.2 直接使用 docker 命令# 查看容器状态dockerps-a|grepwindows# 查看资源占用dockerstats windows-vm# 进入容器调试用dockerexec-itwindows-vmbash# 查看容器日志dockerlogs-fwindows-vm# 强制重启dockerrestart windows-vm4.3 数据备份与恢复# 备份虚拟磁盘cd/data/windows-vmcpstorage/windows.qcow2 /backup/windows-backup-$(date%Y%m%d).qcow2# 恢复虚拟磁盘cp/backup/windows-backup-20250101.qcow2 storage/windows.qcow2# 备份整个项目tarczf windows-vm-backup.tar.gz /data/windows-vm/五、配置文件详解5.1 版本选择环境变量值对应版本推荐场景win10Windows 10 LTSC开发测试、日常使用win11Windows 11需要最新功能win2019Windows Server 2019服务器用途win2022Windows Server 2022最新服务器版本5.2 资源配置建议版本最低内存推荐内存CPU磁盘Windows 104G8G2-4核60GWindows 114G8G2-4核64GWin Server 20198G16G4-8核100GWin Server 20228G16G4-8核100G5.3 完整环境变量列表environment:# 基本配置VERSION:win10# Windows 版本RAM_SIZE:8G# 内存大小CPU_CORES:4# CPU 核心数DISK_SIZE:100G# 磁盘大小# 用户配置USERNAME:admin# 用户名PASSWORD:Admin123# 密码# 语言和本地化LANGUAGE:zh-CN# 语言简体中文REGION:China# 区域KEYBOARD:zh-CN# 键盘布局# 网络配置DHCP:Y# 使用 DHCP# IP: 192.168.1.100 # 静态 IP可选# GATEWAY: 192.168.1.1 # 网关可选# DNS: 8.8.8.8 # DNS可选# 安装选项SKIP_AUTO:N# 是否跳过自动安装HOME_URL:https://...# 首次打开的网页# 产品密钥可选# KEY: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX六、性能优化6.1 磁盘性能优化# 在 docker-compose.yml 中添加volumes:-./storage:/storageenvironment:# 启用 virtio 驱动更快的磁盘 I/ODISK_TYPE:virtio6.2 内存优化# 在宿主机上启用大页内存echo1024/proc/sys/vm/nr_hugepages# 在 docker-compose.yml 中挂载volumes: - /dev/hugepages:/dev/hugepages6.3 网络优化# 使用 macvlan 网络模式虚拟机获得独立 IPnetworks:default:driver:macvlandriver_opts:parent:p6p1ipam:config:-subnet:xx.xxx.xxx.xx/24gateway:xx.xx.xx.xx七、常见问题Q1启动时报错Could not access KVM kernel module# 检查 KVM 模块lsmod|grepkvm# 重新加载sudomodprobe kvmsudomodprobe kvm_amd# 检查权限ls-la/dev/kvmsudochmod666/dev/kvmQ2启动时报错Permission denied# 确保使用 --privileged 模式# 确保 Docker 用户在 kvm 组sudousermod-aGkvm rootsudousermod-aGdockerrootQ3远程桌面无法连接# 检查容器是否运行dockerps|grepwindows# 检查端口是否开放netstat-tlnp|grep3389# 检查防火墙sudofirewall-cmd --list-portssudofirewall-cmd --add-port3389/tcp--permanentsudofirewall-cmd--reloadQ4安装速度很慢# 查看资源占用dockerstats windows-vm# 增加分配的资源# 编辑 docker-compose.yml# RAM_SIZE: 16G# CPU_CORES: 8Q5Docker 镜像导入失败# 检查 Docker 版本是否兼容dockerversion# 检查磁盘空间df-h# 尝试重新导入dockerrmi dockur/windows:latestdockerload-idockur-windows.tar八、目录结构总结/data/windows-vm/ ├── docker-compose.yml # Docker Compose 配置文件 ├── storage/ # 虚拟磁盘存储自动创建 │ ├── windows.qcow2 # 虚拟磁盘文件 │ ├── custom.iso # ISO 文件如果有 │ └── ... └── share/ # 共享文件夹可选 └── ...九、总结步骤命令说明1. 检查环境./check-kvm-env.sh确认虚拟化支持2. 创建目录mkdir -p /data/windows-vm创建项目目录3. 编写配置vi docker-compose.yml配置文件4. 导入镜像docker load -i xxx.tar离线导入镜像5. 启动服务docker-compose up -d启动 Windows6. 访问系统浏览器访问:8006Web 管理界面7. 远程桌面RDP 连接:3389使用 Windows参考资料dockur/windows GitHubKVM 官方文档Docker Compose 文档

更多文章