在Docker中启动Windows容器体验(将Windows系统融入Docker世界)

教育   2024-12-18 18:15   陕西  

简介

万物皆可 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"

可选的值有:

ValueVersionSize
win11Windows 11 Pro6.4 GB
win11eWindows 11 Enterprise5.8 GB
win10Windows 10 Pro5.7 GB
ltsc10Windows 10 LTSC4.6 GB
win10eWindows 10 Enterprise5.2 GB



win8Windows 8.1 Pro4.0 GB
win8eWindows 8.1 Enterprise3.7 GB
win7Windows 7 Enterprise3.0 GB
vistaWindows Vista Enterprise3.0 GB
winxpWindows XP Professional0.6 GB



2022Windows Server 20224.7 GB
2019Windows Server 20195.3 GB
2016Windows Server 20166.5 GB
2012Windows Server 20124.3 GB
2008Windows Server 20083.0 GB



core11Tiny 11 Core2.1 GB
tiny11Tiny 113.8 GB
tiny10Tiny 103.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 设备的 VendorIDProductID ,然后将这些信息添加到配置中:

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


AiDBA
【PostgreSQL培训认证】【Oracle OCP、OCM、高可用(RAC+DG+OGG)培训认证】【MySQL OCP培训认证】【GreenPlum培训】【SQL Server培训】官网:www.dbaup.com,学习不止数据库
 最新文章