基于Docker的Windows容器化实践

本文档详细描述了在 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应用)

  1. 安装你的Windows应用:
    • 将安装文件放入宿主机的 sharedata 文件夹。
    • 在 Windows 容器内,打开文件资源管理器,访问网络路径 \\host.lan\Data。该路径对应宿主机的 sharedata 目录,可找到安装文件进行安装。
  2. 修改 Windows 时区:
    • 进入 Windows 系统后,通过“设置”->“时间和语言”->“日期和时间”手动修改时区为 (UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐
  3. 配置开机自动任务:
    • 在 Windows 容器内,按 Win + R 打开运行对话框。
    • 输入 shell:startup 并按回车。这将打开当前用户的“启动”文件夹。
    • 在该文件夹中创建一个新的批处理文件 (.bat),例如 startup_tasks.bat
    • 编辑此文件,粘贴以下脚本(此脚本主要实现强制同步时间,同时记录日志到桌面):
@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)。

使用Nginx搭建DockerHub中转节点 Git 代码备忘录 Linux 虚拟机根目录扩容指南(使用 GParted 和 LVM)
View Comments
There are currently no comments.