🏏WindowsinDocker:安装在 Docker 中的 Windows
00 分钟
2024-1-20
2024-1-19
type
status
date
slug
summary
tags
category
icon
password
notion image
前几天有位朋友告诉我,CA 里面出了一个可以安装 Win 系统在 Docker 容器中的项目,我看了眼感觉挺有意思,就把安装过程和一些注意的点写下来给到大家参考。

1. 适合轻度应用

由于 Win 系统是运行在 Docker 容器中,相比于虚拟机的形式会有不少的限制,例如无法选择 Machine 类型(i440fx / Q45)、无法像虚拟机那样直通 PCIE 设备(vfio-pci)、由于容器的原因会造成一定的性能损耗等等。
因此,如果你希望正经的使用 Windows 系统虚拟机,建议你不采用 Docker 安装的形式进行使用;相反,如果你只是希望能快速部署一个 Windows 系统用来做一些轻度的使用(如做测试、跑一些简单的脚本或程序等),那么此方法会比较适合你。

2. 获取 XML 模板

你可以直接在 APPS 中搜索和安装 WindowsinDocker,不过我建议读者可以通过博主修改过的 XML 模板进行配置和安装,复制和粘贴以下命令到 Unraid 的命令行窗口中运行来获取 XML 模板文件:
运行命令之后添加 Docker 容器:
notion image
notion image

3. 安装参数详解

通过查看该 Github 项目的说明以及相关 issues 信息,我将可能用到的相关容器变量和一些必要的说明都添加到了 XML 模板中,由于参数比较多,所以大家请根据自己的实际情况来调整,我会尽可能说明每一个参数的作用和使用方法。
notion image
notion image
notion image
  1. 额外参数:用于 Docker 容器相关功能的配置。如果你需要将 Unraid 上的 CPU 核显给到虚拟机去使用,那么你可以在额外参数的末尾追加 --device=/dev/dri ,同时将第 14 项参数 GPU 的值设置为 Y 来为核显添加相应的驱动。
    1. 但由于项目刚出来不久,GPU 在容器内的使用不一定能够正常,具体请看文章末尾的问题说明。
  1. VERSION :用于指定下载什么版本的 Windows 系统,支持的有以下几种值:
    1. 这里不建议使用容器默认下载的 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
  1. KVM :值为 /dev/kvm ,用于虚拟化加速,不需要改动,保持默认即可。
  1. WebUI 端口 8006 :用于网页访问,你可以将 8006 改成别的值,后续的安装和操作可以通过浏览器访问 http://ip地址:8006 进行。
  1. 远程桌面 3389 端口: 用于远程桌面,可以将其更改为别的端口好,一般保持默认即可。
  1. CPU_CORES :CPU 核心数,填入整数数值。
  1. RAM_SIZE :内存容量,输入 4G 6G 8G 等数值
  1. DISK_SIZE :Win 虚拟硬盘容量大小,模板默认的数值是 64G ,可以更改为其他的值。
  1. /storage :容器内部的 /storage 路径是 Win 虚拟机读取 ISO 和虚拟硬盘文件的目录,你需要将其映射到 Unraid 的宿主机绝对路径上,模板上默认的路径是 /mnt/user/WinInDocker ,你可以将路径更改为别的地方。
  1. stop_grace_period :等待 Win 系统关机的等待时间,默认是 2 分钟,时间超过 2 分钟后即使 Win 没有完成关机 Docker 也会强制关闭。
  1. MANUAL :是否手动安装,默认值为 Y(是)。这里建议大家都将值设置为 Y ,表示通过手动安装的形式进行系统安装。
  1. VERSION :指定 ISO 镜像的下载路径。你可以将你希望进行使用的 Windows 系统的下载地址复制到这里,Docker 在启动之后就会通过此链接地址下载 Windows 系统进行安装,更具体的说明请看下文的 4. 如何安装其他版本的 Windows 系统
  1. DEVICE :可以通过这里的设置将硬盘添加到 Win 虚拟机中进行使用,格式可以为 /dev/sdb ,或者为了保险起见可以使用 /dev/disk/by-id/ata-xxx_xxxxx 格式来实现,不清楚是什么意思的请不要填写。
  1. GPU :是否将核显给到 Win 虚拟机使用,Y 表示是,N 表示否。
  1. DISK_FMT :虚拟硬盘格式。这里可以选择两种格式 —— rawqcow2 ,如果你遇到安装过程中无法分区的情况,请尝试使用 raw 格式,关于无法分区的问题请看文章末尾的问题说明
  1. ALLOCATE :配合上面的 DISK_FMT 参数使用,如果 DISK_FMT 中设置的是 raw 格式,那么这里的值需要设置为 N

4. 如何安装其他版本的 Windows 系统

默认情况下如果不指定其他版本的 Win 系统,容器会自动下载并安装由容器作者所指定的版本,由于作者是国外的,所以下载的也是英文版的官方 Windows,虽然安装好之后可以通过更改语言来使用,但是考虑到国内大多数用户要么习惯用一些非官方的版本,要么习惯通过第三方的网站下载 ISO 文件,所以我建议大家不去使用容器默认的方式去下载 Windows 安装镜像,你可以通过下述两种方式进行下载。

4.1 通过下载指定的 ISO 系统镜像进行安装

假如你希望安装其他地方的系统镜像,你可以在 VERSION 变量中输入 ISO 镜像的下载地址,例如:
notion image
Win 系统的下载地址可以从微软官方获取,或者读者也可以从博主的软件仓库中获取:
作者仓库中的这些 Win 系统镜像也是从微软官方获取而来,请大家放心使用。
目前包含了 Win11 专业版和 Win10-LTSC 的官方安装镜像
目前包含了 Win11 专业版和 Win10-LTSC 的官方安装镜像
复制链接地址
复制链接地址

4.2 通过使用已有的 ISO 系统镜像进行安装

如果说你已经下载有了相应的 Win 系统 ISO 安装镜像,那么你可以按照下面的方法将让 Docker 去使用已有的镜像进行安装而不是使用下载链接进行下载并安装:
  1. 重命名 ISO 文件:首先,你需要将已经下载好的 .iso 镜像文件进行重命名,将文件名字更改为 custom.iso
  1. 上传到 Unraid :然后,将 custom.iso 文件上传到容器内部 /storage 路径所对应的 Unraid 存储路径,假如说这个路径是 /mnt/user/WininDocker ,那么就将文件放到这个目录下。
    1. notion image
  1. 删除多余文件:删除先前安装过的、残留下来的其他文件,只保留 custom.iso
  1. 更改变量值:VERSION 变量的值改为 custom.iso
    1. notion image
最后运行容器进行安装即可。

5. 手动安装说明

默认情况下容器会自动帮你安装 Windows 系统,如果你希望手动进行安装,那么你需要将 MANUAL 参数设置为 Y ,这样你在安装的过程就跟在虚拟机上安装的过程是一样的。
相信大家也都安装过 Win 虚拟机了,所以我也不过多赘述具体的手动安装过程,不过可能个别新手朋友还不是很清楚,所以我提供一些截图给到给我去参考。
点击左下角的“加载驱动程序”
点击左下角的“加载驱动程序”
vioscsi → win10 / win11 → amd64
vioscsiwin10 / win11amd64
点击右下角“下一步”开始加载 Virtio 虚拟机虚拟硬盘驱动
点击右下角“下一步”开始加载 Virtio 虚拟机虚拟硬盘驱动

6. 问题说明

Q:安装的时候无法分区该如何解决?

A:如果你在安装的时候遇到了无法分区的情况,如下图所示:
notion image
那么有可能是由于使用了 qcow2 虚拟硬盘格式问题造成的,你可以尝试删掉除了 ISO 镜像文件以外的其他残留文件,然后将 DISK_FMTALLOCATE 变量的值分别设置为 rawN ,然后再重新进行安装。
notion image
如果经过上述的尝试还是不行,那么你还可以通过尝试将 /storage 的路径映射修改为 /mnt/disk1/xxx 或者 /mnt/cache/xxx 之类的地址,以此来绕开 Unraid 的 SHFS 文件系统,而不是使用 /mnt/user/xxx
notion image

Q:核显添加到容器后不能正常使用

该项目的作者目前也说明了核显在容器中不能正常被 Windows 使用,其中涉及到的技术问题比较复杂,而且由于该项目也是刚刚出来没多久,所以还有不少地方在等待优化。
除了核显之外,Nvidia 显卡等相关 GPU 设备的讨论可以在这个 issues 这查找到相关的信息:
GPU Passthrough
Updated Feb 6, 2024
 

评论