简介
万物皆可 Docker!!!
在 Docker 里安装 Windows系统,然后通过浏览器或mstsc远程访问这台套娃 Windows 系统,可以开启无限套娃模式。
今天为大家带来一款创新的开源工具:dockur/windows,基于 noVNC 和 QEMU 实现,模拟多种不同的硬件平台,为用户提供一个隔离的环境来运行不同的应用程序和操作系统。允许用户通过 Web 浏览器交互使用 Windows。
dockur/windows 可以让你在 Docker 容器中运行 Windows,全程自动安装 Windows,无需复杂的配置。
dockur/windows 提供了DHCP、自定义IP地址、磁盘映射、USB映射、KVM支持等能力。利用 KVM(Kernel-based Virtual Machine)来加速 Windows 的运行。
GitHub:https://github.com/dockur/windows
镜像:https://hub.docker.com/r/dockurr/windows
该项目刚发布半年,已在 GitHub 上获得了 1.6万 stars,
这个镜像主要依赖了几项技术:
qemus/qemu-docker,在容器中使用 QEMU,能够提供接近本机速度的虚拟机的网络、IO 速度等。
christgau/wsdd,让容器中的 Windows 能够出现在局域网中的其他设备的共享设备中。(Windows 10 的 1511 版本后,默认开始禁用 SMBv1,NetBIOS 设备发现功能失效,导致其他设备不能对其进行服务发现)。
qemus/virtiso,精简到 27MB 的 KVM/QEMU Virtio 驱动程序,能够让 Windows 在 Docker 环境中正常使用。
krallin/tini,正确启动 Docker 中 QEMU,以及确保进程异常能够被正确处理,或正确的终止容器进程。
如果要安装 ARM64 版本的 Windows,可以使用另一个开源项目:dokur/windows-arm,项目地址:https://github.com/dockur/windows-arm
🎨️ 特色
开箱即用,无需复杂配置
支持自定义 CPU/RAM 的数量、磁盘大小
为容器分配单独的 IP 地址
内置 ISO下载器,自动下载 Windows 版本的 ISO 文件
支持Win7/Win8/Win10/Win11/tiny10等版本
支持使用 Linux KVM 为 Windows 容器提供硬件虚拟化的加速
与主机共享文件、安装自定义镜像
提供 DHCP、自定义 IP 地址、磁盘映射、USB映射等功能
通过 Web 浏览器实时查看和控制 Windows 容器的桌面,无需安装额外的软件或插件
代码完全开源,不分发任何受版权保护的材料,无任何版权问题,合法合规
使用说明
1、需要有docker环境
2、Linux的宿主机需要支持虚拟化技术,查询方法如下,参考:https://www.dbaup.com/ruhepanduancpushifouzhichiyingjianxunihua.html
1[root@lhr ~]# lscpu | grep Vir
2Virtualization: VT-x
3Virtualization type: full
4
5[root@lhr ~]# ll /dev/kvm
6crw------- 1 root root 10, 232 Jun 21 09:07 /dev/kvm
7[root@lhr ~]#
8
9[root@lhr ~]# virt-host-validate | grep virtualization
10 QEMU: Checking for hardware virtualization : PASS
11[root@lhr ~]#
12
13root@lhrubuntu2204:/# sudo kvm-ok
14INFO: /dev/kvm exists
15KVM acceleration can be used
16root@lhrubuntu2204:/#
3、docker镜像:
1docker pull dockurr/windows
2
3-- 下载不了的朋友也可以使用麦老师的镜像
4docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/dockurr_windows:3.12
5
6
7-- 或者自己本地构建
8git clone https://github.com/dockur/windows.git
9cd windows
10docker build -t dockurr/windows .
选择Windows操作系统
默认情况下,将会安装Windows 11。但您可以在compose文件中添加VERSION环境变量,以便指定要下载的其他Windows版本。
1environment:
2 VERSION: "win11"
可选的值有:
Value | Version | Size |
---|---|---|
win11 | Windows 11 Pro | 6.4 GB |
win11e | Windows 11 Enterprise | 5.8 GB |
win10 | Windows 10 Pro | 5.7 GB |
ltsc10 | Windows 10 LTSC | 4.6 GB |
win10e | Windows 10 Enterprise | 5.2 GB |
win8 | Windows 8.1 Pro | 4.0 GB |
win8e | Windows 8.1 Enterprise | 3.7 GB |
win7 | Windows 7 Enterprise | 3.0 GB |
vista | Windows Vista Enterprise | 3.0 GB |
winxp | Windows XP Professional | 0.6 GB |
2022 | Windows Server 2022 | 4.7 GB |
2019 | Windows Server 2019 | 5.3 GB |
2016 | Windows Server 2016 | 6.5 GB |
2012 | Windows Server 2012 | 4.3 GB |
2008 | Windows Server 2008 | 3.0 GB |
core11 | Tiny 11 Core | 2.1 GB |
tiny11 | Tiny 11 | 3.8 GB |
tiny10 | Tiny 10 | 3.6 GB |
To install ARM64 versions of Windows use dockur/windows-arm.
为容器分配独立的 IP 地址
默认情况下,Docker 会共享宿主机的 IP,如果我们想要让容器拥有独立的 IP 地址,需要先创建一个 macvlan
网络:
1docker network create -d macvlan \
2 --subnet=168.168.0.0/24 \
3 --gateway=168.168.0.1 \
4 --ip-range=168.168.0.100/28 \
5 -o parent=eth0 winvlan
创建完网卡后,调整上面使用的容器配置,根据自己的需求指定容器 IP 即可。
1services:
2 windows:
3 container_name: windows
4 ..<snip>..
5 networks:
6 vlan:
7 ipv4_address: 192.168.0.100
8
9networks:
10 vlan:
11 external: true
此方法的一个额外好处是,您不再需要执行任何端口映射,因为所有端口都将默认暴露。重要提示由于macvlan的设计不允许两者之间的通信,因此这个IP地址从Docker主机上将无法访问。如果这是一个问题,您需要创建第二个macvlan 网络作为变通方法。
如何使Windows从我的路由器获取IP地址?
在为容器配置macvlan后,Windows可以通过向路由器请求IP地址,就像一台真实的PC一样,成为家庭网络的一部分。为了启用这种模式,需在您的compose文件中添加以下行:
1environment:
2 DHCP: "Y"
3devices:
4 - /dev/vhost-net
5device_cgroup_rules:
6 - 'c *:* rwm'
在这种模式下,容器和Windows系统将各自拥有独立的IP地址。
使用多块磁盘
1environment:
2 DISK2_SIZE: "32G"
3 DISK3_SIZE: "64G"
4volumes:
5 - /home/example:/storage2
6 - /mnt/data/example:/storage3
使用一整块磁盘
如果你的主机上有多块磁盘,或者想将某一块磁盘完整的分配给 Windows,可以采用下面的方法,其中 DEVICE
将作为你的主磁盘:
1environment:
2 DEVICE: "/dev/sda"
3 DEVICE2: "/dev/sdb"
4devices:
5 - /dev/sda
6 - /dev/sdb
在 Docker 中的 Windows 使用 USB 设备
我们首先需要使用 lsusb
来获取 USB 设备的 VendorID
和 ProductID
,然后将这些信息添加到配置中:
1environment:
2 ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
3devices:
4 - /dev/bus/usb
相关参数
额外参数:用于 Docker 容器相关功能的配置。如果你需要将 Unraid 上的 CPU 核显给到虚拟机去使用,那么你可以在额外参数的末尾追加 --device=/dev/dri ,同时将第 14 项参数 GPU 的值设置为 Y 来为核显添加相应的驱动。
--cap-add=NET_ADMIN --stop-timeout=120
但由于项目刚出来不久,GPU 在容器内的使用不一定能够正常,具体请看文章末尾的问题说明。
VERSION :用于指定下载什么版本的 Windows 系统,支持的有以下几种值:
这里不建议使用容器默认下载的 Win 版本,所以这里变量的值可以不填或者保持默认,在后面的 VERSION 变量中可以通过填写 http 下载链接的形式下载指定版本的 ISO 系统安装文件。
win11 = Windows 11
win10 = Windows 10
win81 = Windows 8.1
win22 = Windows Server 2022
win19 = Windows Server 2019
win16 = Windows Server 2016
KVM :值为 /dev/kvm ,用于虚拟化加速,不需要改动,保持默认即可。
WebUI 端口 8006 :用于网页访问,你可以将 8006 改成别的值,后续的安装和操作可以通过浏览器访问 http://ip地址:8006 进行。
远程桌面 3389 端口: 用于远程桌面,可以将其更改为别的端口好,一般保持默认即可。
CPU_CORES :CPU 核心数,填入整数数值。
RAM_SIZE :内存容量,输入 4G 6G 8G 等数值
DISK_SIZE :Win 虚拟硬盘容量大小,模板默认的数值是 64G ,可以更改为其他的值。
/storage :容器内部的 /storage 路径是 Win 虚拟机读取 ISO 和虚拟硬盘文件的目录,你需要将其映射到 Unraid 的宿主机绝对路径上,模板上默认的路径是 /mnt/user/WinInDocker ,你可以将路径更改为别的地方。
stop_grace_period :等待 Win 系统关机的等待时间,默认是 2 分钟,时间超过 2 分钟后即使 Win 没有完成关机 Docker 也会强制关闭。
MANUAL :是否手动安装,默认值为 Y(是)。这里建议大家都将值设置为 Y ,表示通过手动安装的形式进行系统安装。
VERSION :指定 ISO 镜像的下载路径。你可以将你希望进行使用的 Windows 系统的下载地址复制到这里,Docker 在启动之后就会通过此链接地址下载 Windows 系统进行安装,更具体的说明请看下文的 4. 如何安装其他版本的 Windows 系统 。
DEVICE :可以通过这里的设置将硬盘添加到 Win 虚拟机中进行使用,格式可以为 /dev/sdb ,或者为了保险起见可以使用 /dev/disk/by-id/ata-xxx_xxxxx 格式来实现,不清楚是什么意思的请不要填写。
GPU :是否将核显给到 Win 虚拟机使用,Y 表示是,N 表示否。
DISK_FMT :虚拟硬盘格式。这里可以选择两种格式 —— raw 和 qcow2 ,如果你遇到安装过程中无法分区的情况,请尝试使用 raw 格式,关于无法分区的问题请看文章末尾的问题说明。
ALLOCATE :配合上面的 DISK_FMT 参数使用,如果 DISK_FMT 中设置的是 raw 格式,那么这里的值需要设置为 N 。
安装过程
直接docker安装
1-- win11
2docker rm -f win11
3docker run -itd --name win11 -h win11 \
4-e VERSION="win11" \
5-e RAM_SIZE="8G" \
6-e CPU_CORES="4" \
7-e DISK_SIZE="50G" \
8 -p 8006:8006 \
9 -p 1189:3389 \
10 --device=/dev/kvm \
11 --cap-add NET_ADMIN \
12 --stop-timeout 120 \
13 -v /soft/win11/:/storage/ \
14 dockurr/windows:3.12
15
16
17
18-- win2022
19docker rm -f win2022
20docker run -itd --name win2022 -h win2022 \
21-e VERSION="2022" \
22-e RAM_SIZE="8G" \
23-e CPU_CORES="4" \
24-e DISK_SIZE="50G" \
25 -p 2206:8006 \
26 -p 2289:3389 \
27 --device=/dev/kvm \
28 --cap-add NET_ADMIN \
29 --stop-timeout 120 \
30 -v /soft/win2022/:/storage/ \
31 dockurr/windows:3.12
32
33
34-- winxp
35docker rm -f winxp
36docker run -itd --name winxp -h winxp \
37-e VERSION="winxp" \
38-e RAM_SIZE="4G" \
39-e CPU_CORES="4" \
40-e DISK_SIZE="50G" \
41 -p 8066:8006 \
42 -p 2689:3389 \
43 --device=/dev/kvm \
44 --cap-add NET_ADMIN \
45 --stop-timeout 120 \
46 -v /soft/winxp/:/storage/ \
47 dockurr/windows:3.12
48
49
50http://192.168.8.8:8006
下载镜像的速度取决于你的网速。
安装Windows 11系统:
远程桌面访问,用户名为Docker,密码为空:
内部也是可以正常上网的:
安装XP系统:
安装server 2022系统:
通过mstsc访问:
使用docker-compose.yml文件
1cat > docker-compose.yml <<"EOF"
2version: "3"
3services:
4 win2022:
5 image: dockurr/windows
6 container_name: win2022
7 devices:
8 - /dev/kvm
9 cap_add:
10 - NET_ADMIN
11 ports:
12 - 8022:8006
13 - 2289:3389/tcp
14 - 2289:3389/udp
15 stop_grace_period: 2m
16 restart: on-failure
17 environment:
18 VERSION: "2022"
19 RAM_SIZE: "8G"
20 CPU_CORES: "8"
21 DISK_SIZE: "100G"
22EOF
23
24
25
26docker rm -f win2022
27docker compose up -d
28
29docker logs -f win2022
本地iso安装(推荐)
1-- 1、将安装文件zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso重命名为custom.iso 并将其放入宿主机的/soft/winxp/文件夹中以跳过下载。
2
3-- 2、开始安装 winxp
4docker rm -f winxp
5docker run -itd --name winxp -h winxp \
6-e VERSION="winxp" \
7-e RAM_SIZE="4G" \
8-e CPU_CORES="4" \
9-e DISK_SIZE="50G" \
10 -p 8066:8006 \
11 -p 2689:3389 \
12 --device=/dev/kvm \
13 --cap-add NET_ADMIN \
14 --stop-timeout 120 \
15 -v /soft/winxp/:/storage/ \
16 dockurr/windows:3.12
17
18
19http://192.168.8.8:8066
经过漫长的等待,可以正常访问了:
总结
1、默认情况下,会安装 Windows 11,并且会分配 2 个 CPU 核心和 4 GB 内存,以及 64GB 硬盘大小。
2、可使用自己的系统镜像:-e VERSION: "https://example.com/win.iso"
,也可以使用离线的本地镜像,方法为:将本地镜像重命名 为custom.iso
并将其放入空的 /storage 文件夹中以跳过下载。
3、mstsc远程桌面访问:用户名为Docker,密码为空
4、Linux宿主机可以使用wsl2
5、默认通过8006的web界面访问是通过vnc访问的,操作起来有延迟,推荐mstsc访问。
6、建议将系统的镜像文件在本地保存一份,新建容器的时候使用本地镜像。
7、默认情况下,容器使用桥接网络,与主机共享 IP 地址。若不指定IP地址,则每台windows的IP都相同,我这里是20.20.20.1
,Windows查看是20.20.20.21
:
1[root@dbaup winxp]# docker exec -it winxp bash
2root@winxp:/# ifconfig
3dockerbridge: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
4 inet 20.20.20.1 netmask 255.255.255.0 broadcast 20.20.20.255
5 ether d2:4b:6a:85:5a:49 txqueuelen 1000 (Ethernet)
6 RX packets 10277 bytes 10130428 (9.6 MiB)
7 RX errors 0 dropped 0 overruns 0 frame 0
8 TX packets 4218 bytes 465099 (454.1 KiB)
9 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
10
11
12[root@dbaup ~]# docker exec -it win2022 bash
13root@win2022:/# ifconfig
14dockerbridge: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
15 inet 20.20.20.1 netmask 255.255.255.0 broadcast 20.20.20.255
16 ether 76:78:c6:79:8e:bc txqueuelen 1000 (Ethernet)
17 RX packets 4360 bytes 1783703 (1.7 MiB)
18 RX errors 0 dropped 0 overruns 0 frame 0
19 TX packets 3916 bytes 3223676 (3.0 MiB)
20 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
8、参数中的-e DISK_SIZE="50G"
磁盘空间是立刻分配的,而不是逐渐增大。
9、配置密码可以使用如下的方式:
1-- 启用administrator
2net user administrator /active:yes
3
4-- 新建
5net user administrator lhr /add
6net localgroup administrators administrator /add
7
8-- 修改密码
9net user administrator lhr
11、Windows容器是可以正常访问网络的。
12、缺点:多个Windows容器之间不能互通。(或者其它小伙伴有方法也可以告诉我)
我使用官网如下的配置也不行:
1docker network create -d macvlan \
2 --subnet=168.168.0.0/24 \
3 --gateway=168.168.0.1 \
4 --ip-range=168.168.0.100/28 \
5 -o parent=eth0 winvlan
6
7
8docker rm -f winxp
9docker run -itd --name winxp -h winxp \
10 --net=winvlan --ip 168.168.0.101 \
11 -e VERSION="winxp" \
12 -e RAM_SIZE="4G" \
13 -e CPU_CORES="4" \
14 -e DISK_SIZE="50G" \
15 -p 8066:8006 \
16 -p 2689:3389 \
17 --device=/dev/kvm \
18 --cap-add NET_ADMIN \
19 --stop-timeout 120 \
20 -e DHCP="Y" \
21 --device=/dev/vhost-net \
22 --device-cgroup-rule='c *:* rwm' \
23 -v /soft/winxp/:/storage/ \
24 dockurr/windows:3.12
参考
https://github.com/dockur/windows
https://mp.weixin.qq.com/s/DPrTn8PZ4aeBMpLsbiJ66A
https://mp.weixin.qq.com/s/A31sgv7fdwcLoSVWnKnQbw
https://soulteary.com/2024/03/11/install-windows-into-a-docker-container.html
https://www.appinn.com/install-windows-in-docker/
https://mp.weixin.qq.com/s/ua8au0MVogITB_vsYbhzLw
https://www.hackerchi.top/article/36d9d3aa-d1b4-4698-b272-54a31347a296
https://mp.weixin.qq.com/s/UTjDIAchCSOvRRoSroSWFQ
https://mp.weixin.qq.com/s/gsOqn4V441g_RVtrRtbUqg
https://mp.weixin.qq.com/s/4hbCuZn6zrRg9sGa2s9taw
https://blog.csdn.net/allway2/article/details/122341699
https://www.jackiewu.top/article/windows-in-docker
https://www.dbaup.com/ruhepanduancpushifouzhichiyingjianxunihua.html
noVNC 开源地址:https://github.com/novnc/noVNC
QEMU 开源地址:https://gitlab.com/qemu-project/qemu
QEMU 官网:https://www.qemu.org
系统下载:
https://www.microsoft.com/zh-cn/software-download/windows11
https://www.microsoft.com/en-us/software-download/windows11