type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
前几天有位朋友告诉我,CA 里面出了一个可以安装 Win 系统在 Docker 容器中的项目,我看了眼感觉挺有意思,就把安装过程和一些注意的点写下来给到大家参考。
dockur/windows
是一个可以将 Windows 系统安装在 Docker 容器中的项目,你可以通过安装 Docker 的形式来去安装并使用 Windows 系统。本文将给大家介绍如何使用这个 Docker 容器去安装各种 Windows 系统,已经相关的配置方法和注意事项。1. 适合轻度应用
由于 Win 系统是运行在 Docker 容器中,相比于虚拟机的形式会有不少的限制,例如无法选择 Machine 类型(i440fx / Q45)、无法像虚拟机那样直通 PCIE 设备(vfio-pci)、由于容器的原因会造成一定的性能损耗等等。
因此,如果你希望正经的使用 Windows 系统虚拟机,建议你不采用 Docker 安装的形式进行使用;相反,如果你只是希望能快速部署一个 Windows 系统用来做一些轻度的使用(如做测试、跑一些简单的脚本或程序等),那么此方法会比较适合你。
2. 获取 XML 模板
你可以直接在 APPS 中搜索和安装
WindowsinDocker
,不过我建议读者可以通过博主修改过的 XML 模板进行配置和安装,复制和粘贴以下命令到 Unraid 的命令行窗口中运行来获取 XML 模板文件:运行命令之后添加 Docker 容器:
3. 安装参数详解
通过查看该 Github 项目的说明以及相关 issues 信息,我将可能用到的相关容器变量和一些必要的说明都添加到了 XML 模板中,由于参数比较多,所以大家请根据自己的实际情况来调整,我会尽可能说明每一个参数的作用和使用方法。
- 额外参数:用于 Docker 容器相关功能的配置。如果你需要将 Unraid 上的 CPU 核显给到虚拟机去使用,那么你可以在额外参数的末尾追加
--device=/dev/dri
,同时将第 14 项参数GPU
的值设置为Y
来为核显添加相应的驱动。
但由于项目刚出来不久,GPU 在容器内的使用不一定能够正常,具体请看文章末尾的问题说明。
VERSION
:用于指定下载什么版本的 Windows 系统,支持的有以下几种值:win11
= Windows 11win10
= Windows 10win81
= Windows 8.1win22
= Windows Server 2022win19
= Windows Server 2019win16
= Windows Server 2016
这里不建议使用容器默认下载的 Win 版本,所以这里变量的值可以不填或者保持默认,在后面的VERSION
变量中可以通过填写 http 下载链接的形式下载指定版本的 ISO 系统安装文件。
- 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
。
4. 如何安装其他版本的 Windows 系统
默认情况下如果不指定其他版本的 Win 系统,容器会自动下载并安装由容器作者所指定的版本,由于作者是国外的,所以下载的也是英文版的官方 Windows,虽然安装好之后可以通过更改语言来使用,但是考虑到国内大多数用户要么习惯用一些非官方的版本,要么习惯通过第三方的网站下载 ISO 文件,所以我建议大家不去使用容器默认的方式去下载 Windows 安装镜像,你可以通过下述两种方式进行下载。
4.1 通过下载指定的 ISO 系统镜像进行安装
假如你希望安装其他地方的系统镜像,你可以在
VERSION
变量中输入 ISO 镜像的下载地址,例如:Win 系统的下载地址可以从微软官方获取,或者读者也可以从博主的软件仓库中获取:
作者仓库中的这些 Win 系统镜像也是从微软官方获取而来,请大家放心使用。
4.2 通过使用已有的 ISO 系统镜像进行安装
如果说你已经下载有了相应的 Win 系统 ISO 安装镜像,那么你可以按照下面的方法将让 Docker 去使用已有的镜像进行安装而不是使用下载链接进行下载并安装:
- 重命名 ISO 文件:首先,你需要将已经下载好的
.iso
镜像文件进行重命名,将文件名字更改为custom.iso
。
- 上传到 Unraid :然后,将
custom.iso
文件上传到容器内部/storage
路径所对应的 Unraid 存储路径,假如说这个路径是/mnt/user/WininDocker
,那么就将文件放到这个目录下。
- 删除多余文件:删除先前安装过的、残留下来的其他文件,只保留
custom.iso
。
- 更改变量值:将
VERSION
变量的值改为custom.iso
:
最后运行容器进行安装即可。
5. 手动安装说明
默认情况下容器会自动帮你安装 Windows 系统,如果你希望手动进行安装,那么你需要将
MANUAL
参数设置为 Y
,这样你在安装的过程就跟在虚拟机上安装的过程是一样的。相信大家也都安装过 Win 虚拟机了,所以我也不过多赘述具体的手动安装过程,不过可能个别新手朋友还不是很清楚,所以我提供一些截图给到给我去参考。
6. 问题说明
Q:安装的时候无法分区该如何解决?
A:如果你在安装的时候遇到了无法分区的情况,如下图所示:
那么有可能是由于使用了
qcow2
虚拟硬盘格式问题造成的,你可以尝试删掉除了 ISO 镜像文件以外的其他残留文件,然后将 DISK_FMT
和 ALLOCATE
变量的值分别设置为 raw
和 N
,然后再重新进行安装。如果经过上述的尝试还是不行,那么你还可以通过尝试将
/storage
的路径映射修改为 /mnt/disk1/xxx
或者 /mnt/cache/xxx
之类的地址,以此来绕开 Unraid 的 SHFS 文件系统,而不是使用 /mnt/user/xxx
:Q:核显添加到容器后不能正常使用
该项目的作者目前也说明了核显在容器中不能正常被 Windows 使用,其中涉及到的技术问题比较复杂,而且由于该项目也是刚刚出来没多久,所以还有不少地方在等待优化。
除了核显之外,Nvidia 显卡等相关 GPU 设备的讨论可以在这个 issues 这查找到相关的信息:
GPU Passthrough
Updated Aug 19, 2024
- 作者:JackieWu
- 链接:https://www.jackiewu.top/article/windows-in-docker
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。