前言
在docker部署Windows系统,本质上是通过docker帮助管理一个kvm虚拟机,故类似的玩法仅限于物理机,或者已经开启了虚拟化透传的虚拟机、云服务器。开启了虚拟化的物理计算机可以玩,开启了虚拟化透传的虚拟机可以玩,绝大多数云服务器、VPS,还是洗洗睡吧。云服务器之类的基本上只能玩玩没有独立内核的openvz或者docker,或者以CPU模拟低效率的实现虚拟机。
项目推荐
实际上类似的项目相当多,但是许多项目实现的不是太多,仍然需要用户自备iso,安装系统镜像加载kvm虚拟设备驱动,因此从价值上,我推荐这个项目:https://github.com/dockur/windows
根据项目页面的描述,这个方式具有以下特性:
- ISO下载
- KVM加速
- 基于WEB的查看器
此开源项目发布也就没几个月,类似的项目大多也都是差不多的时间。从开箱即用的角度,笔者推荐这个。
如果这种docker镜像做不到开箱即用还需要繁琐的系统部署流程,笔者认为不如随意找个主流的Linux发行版手搓kvm命令,或者以qemu-kvm之类的工具部署Windows虚拟机,或者直接在debian操作系统部署一个proxmox ve,嫌弃前者麻烦,后者太重,也有一些例如使用PHP ruby之类的语言编写的简单的基于网页管理的kvm虚拟机管理程序,基本的创建几个简单的虚拟机的需求,这种简单的小规模程序可能会更好:没那么多的东西,本身引入漏洞的风险小很多,也没太高的性能资源占用,特别适合内存不太多的情况。
使用方法
使用方法非常简单,官方给出了两种方式,docker-compose.yml以及直接docker run命令。
version: "3"
services:
windows:
image: dockurr/windows
container_name: windows
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows
运行命令后,程序就会自动开始运行Windows 11。可以通过浏览器访问运行docker的计算机的IP:8006端口操作Windows;也可以通过RDP协议连接运行docker的计算机的IP连接Windows的RDP服务,能够成功连接的前提是TCP8006,3389的TCP与UDP端口都没有被占用。
environment:
VERSION: "win11"
-e VERSION= "win11"
通过传递环境变量可以控制自动下载的Windows版本。
Value | 描述 | 提供者 | 国内下载速度 | 镜像大小 |
| Windows 11 Pro | Microsoft | 极慢,可能很快 | 6.4 GB |
| Windows 10 Pro | Microsoft | 极慢,可能很快 | 5.8 GB |
| Windows 10 LTSC | Microsoft | 极慢,可能很快 | 4.6 GB |
| Windows 8.1 Pro | Microsoft | 极慢,可能很快 | 4.2 GB |
| Windows 7 SP1 | Bob Pony | 极慢 | 3.0 GB |
| Windows Vista SP2 | Bob Pony | 极慢 | 3.6 GB |
| Windows XP SP3 | Bob Pony | 极慢 | 0.6 GB |
| Windows Server 2022 | Microsoft | 极慢,可能很快 | 4.7 GB |
| Windows Server 2019 | Microsoft | 极慢,可能很快 | 5.3 GB |
| Windows Server 2016 | Microsoft | 极慢,可能很快 | 6.5 GB |
| Windows Server 2012 R2 | Microsoft | 极慢,可能很快 | 4.3 GB |
| Windows Server 2008 R2 | Microsoft | 极慢,可能很快 | 3.0 GB |
| Tiny 11 Core | Archive.org | 不可用 | 2.1 GB |
| Tiny 11 | Archive.org | 不可用 | 3.8 GB |
| Tiny 10 | Archive.org | 不可用 | 3.6 GB |
默认情况是2核4G,分配了64G的磁盘空间。同样通过类似的参数可以自由指定:
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
DISK_SIZE: "256G"
macvlan方式也可以让虚拟机自身直接得到当前局域网的IP地址,而不是与运行docker的计算机共享。也可以自行修改iso地址,VERSION: "win11"修改为例如VERSION: "http://ip/win.iso",就可用使用自定义的镜像了。