原 在Docker中运行Windows系统(把 Windows 装进 Docker 容器里)
简介
万物皆可 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@lhr ~]# lscpu | grep Vir Virtualization: VT-x Virtualization type: full [root@lhr ~]# ll /dev/kvm crw------- 1 root root 10, 232 Jun 21 09:07 /dev/kvm [root@lhr ~]# [root@lhr ~]# virt-host-validate | grep virtualization QEMU: Checking for hardware virtualization : PASS [root@lhr ~]# root@lhrubuntu2204:/# sudo kvm-ok INFO: /dev/kvm exists KVM acceleration can be used root@lhrubuntu2204:/# |
3、docker镜像:
1 2 3 4 5 6 7 8 9 10 | docker pull dockurr/windows -- 下载不了的朋友也可以使用麦老师的镜像 docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/dockurr_windows:3.12 -- 或者自己本地构建 git clone https://github.com/dockur/windows.git cd windows docker build -t dockurr/windows . |
选择Windows操作系统
默认情况下,将会安装Windows 11。但您可以在compose文件中添加VERSION环境变量,以便指定要下载的其他Windows版本。
1 2 | environment: 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
网络:
1 2 3 4 5 | docker network create -d macvlan \ --subnet=168.168.0.0/24 \ --gateway=168.168.0.1 \ --ip-range=168.168.0.100/28 \ -o parent=eth0 winvlan |
创建完网卡后,调整上面使用的容器配置,根据自己的需求指定容器 IP 即可。
1 2 3 4 5 6 7 8 9 10 11 | services: windows: container_name: windows ..<snip>.. networks: vlan: ipv4_address: 192.168.0.100 networks: vlan: external: true |
此方法的一个额外好处是,您不再需要执行任何端口映射,因为所有端口都将默认暴露。重要提示由于macvlan的设计不允许两者之间的通信,因此这个IP地址从Docker主机上将无法访问。如果这是一个问题,您需要创建第二个macvlan 网络作为变通方法。
如何使Windows从我的路由器获取IP地址?
在为容器配置macvlan后,Windows可以通过向路由器请求IP地址,就像一台真实的PC一样,成为家庭网络的一部分。为了启用这种模式,需在您的compose文件中添加以下行:
1 2 3 4 5 6 7 | environment: DHCP: "Y" devices: - /dev/vhost-net device_cgroup_rules: - 'c *:* rwm' |
在这种模式下,容器和Windows系统将各自拥有独立的IP地址。
使用多块磁盘
1 2 3 4 5 6 | environment: DISK2_SIZE: "32G" DISK3_SIZE: "64G" volumes: - /home/example:/storage2 - /mnt/data/example:/storage3 |
使用一整块磁盘
如果你的主机上有多块磁盘,或者想将某一块磁盘完整的分配给 Windows,可以采用下面的方法,其中 DEVICE
将作为你的主磁盘:
1 2 3 4 5 6 | environment: DEVICE: "/dev/sda" DEVICE2: "/dev/sdb" devices: - /dev/sda - /dev/sdb |
在 Docker 中的 Windows 使用 USB 设备
我们首先需要使用 lsusb
来获取 USB 设备的 VendorID
和 ProductID
,然后将这些信息添加到配置中:
1 2 3 4 | environment: ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234" devices: - /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 格式,关于无法分区的问题请看文章末尾的问题说明。
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!