本文档详细描述了在 Docker 环境下构建和运行包含各类Windows应用的 Windows 容器化环境的过程。核心是利用 dockurr/windows 镜像创建一个 Windows 虚拟机容器,并通过共享目录部署Windows应用。适用于需要快速部署、隔离运行各类Windows应用的场景。
环境准备:检查 KVM 支持
容器化 Windows 依赖硬件虚拟化(KVM)。请注意:阿里云 ECS 等标准云服务器通常不支持嵌套虚拟化(KVM),因此必须使用支持 KVM 的物理服务器或阿里云裸金属服务器环境。
安装检查工具并检查是否支持KVM:
sudo apt install cpu-checker -y
sudo kvm-ok
确认输出显示 KVM acceleration can be used 表示环境支持。
构建基础 Windows 容器镜像
准备工作:
在 docker-compose 命令执行的目录下创建 iso 文件夹。
将 Windows 10 安装镜像文件命名为 Windows10_22H2.iso 并放入 ./iso 文件夹。
在 docker-compose 命令执行的目录下创建 TGCAD_sharedata 文件夹,用于与 Windows 容器共享文件。
将 Windows 10 安装镜像文件命名为 Windows10_22H2.iso
并放入 ./iso
文件夹。
配置文件:Windows.yml
version: "3" # Docker Compose 文件版本
services:
# Windows 容器服务
windows:
image: dockurr/windows # 基础 Windows 容器镜像
container_name: CAD_v1 # 容器名称
devices:
- /dev/kvm # 关键:启用 KVM 硬件虚拟化支持
cap_add:
- NET_ADMIN # 添加网络管理权限
ports:
- 8006:8006 # VNC 访问端口 (Web)
- 3389:3389/tcp # RDP (远程桌面) TCP 端口
- 3389:3389/udp # RDP (远程桌面) UDP 端口
stop_grace_period: 2m # 停止容器时的宽限期
restart: on-failure # 失败时自动重启
environment: # 虚拟机配置参数
VERSION: "http://winiso/Windows10_22H2.iso" # Windows ISO 文件路径 (由 winiso 服务提供)
MANUAL: "N" # 非手动安装 (自动安装)
DISK_SIZE: "36G" # 虚拟机磁盘大小 (36GB)
RAM_SIZE: "8G" # 虚拟机内存大小 (8GB)
CPU_CORES: "4" # 虚拟机 CPU 核心数 (4核)
USERNAME: "Docker" # 虚拟机管理员用户名
PASSWORD: "123456" # 虚拟机管理员密码
LANGUAGE: "Chinese" # 系统语言
REGION: "zh-CN" # 系统区域 (影响时区等,建议后续修改时区)
KEYBOARD: "en-US" # 键盘布局
COMMIT: "Y" # 持久化虚拟机磁盘更改
volumes:
- ./sharedata:/data # 主机共享目录./sharedata 映射到容器内 /data
# ISO 文件 HTTP 服务
winiso:
image: nginx:alpine # 轻量级 Web 服务器镜像
container_name: winiso # ISO 服务容器名称
volumes:
- ./iso:/usr/share/nginx/html:ro # 将主机 ./iso 目录挂载为 Nginx 根目录 (只读)
执行docker-compose
docker-compose -f windows.yml up
访问 Windows 容器
构建启动完成后,可以通过以下方式访问 Windows 环境:
VNC (Web): 打开浏览器访问 http://宿主机IP:8006
RDP (远程桌面): 使用远程桌面客户端连接宿主机 IP 地址,端口 3389
,用户名 Docker
,密码 123456
。
构建镜像(封装Windows应用)
- 安装你的Windows应用:
- 将安装文件放入宿主机的
sharedata
文件夹。 - 在 Windows 容器内,打开文件资源管理器,访问网络路径
\\host.lan\Data
。该路径对应宿主机的sharedata
目录,可找到安装文件进行安装。
- 将安装文件放入宿主机的
- 修改 Windows 时区:
- 进入 Windows 系统后,通过“设置”->“时间和语言”->“日期和时间”手动修改时区为
(UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐
。
- 进入 Windows 系统后,通过“设置”->“时间和语言”->“日期和时间”手动修改时区为
- 配置开机自动任务:
- 在 Windows 容器内,按
Win + R
打开运行对话框。 - 输入
shell:startup
并按回车。这将打开当前用户的“启动”文件夹。 - 在该文件夹中创建一个新的批处理文件 (
.bat
),例如startup_tasks.bat
。 - 编辑此文件,粘贴以下脚本(此脚本主要实现强制同步时间,同时记录日志到桌面):
- 在 Windows 容器内,按
@echo off
rem —————————————————————————
rem 日志文件路径
rem —————————————————————————
set "LOGFILE=%USERPROFILE%\Desktop\startup.log"
rem —————————————————————————
rem 强制同步系统时间
rem —————————————————————————
echo Syncing system time .....
w32tm /resync /rediscover >nul 2>&1
保存为.bat文件,这些代码会在系统启动后自动执行。
打包定制化镜像
完成容器内所有配置(安装软件、设置时区、配置开机任务等)后,将运行中的容器状态打包成一个新的 Docker 镜像,便于分发和部署:
sudo docker commit -a "作者" -m "镜像说明" 容器ID 镜像名:版本号
#ex: sudo docker commit -a "QingHao" -m "CAD_2025R1_001" 965732d52023 cad:2025r1_001
docker tag 镜像名:版本号 远程仓库/镜像名:版本号
#ex:docker tag cad:2025r1_001 your_ip/cad:2025r1_001
docker push your_ip/cad:2025r1_001
然后可以使用k8s直接拉取镜像。

部署后需要配置CPU_CORES、RAM_SIZE,配置相关服务端口,例如8006(VNC)、3389(RDP)。

