【实用github项目】把 Windows 装进 Docker 容器里
本文最后更新于 2024-10-10,
若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。
本站只有Telegram群组为唯一交流群组, 点击加入
文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请
最近买了一台4H8G的主机,但是商家不允许安装Windows系统,于是在基于ubuntu系统上另辟蹊径,采用容器来安装windows达到使用windows系统的效果。
项目地址:https://github.com/dockur/windows
安装 Ubuntu 操作系统和 Docker
这套方案中采用了 KVM 加速,所以体验最好的方案是使用或者安装一个 Linux 环境,如果你本身就在使用 Ubuntu 之类的支持 KVM 非常方便的操作系统的话,那么只需要安装 Docker 就好啦。
安装Docker🐳
你也可以使用下面的命令一键安装(除中国大陆网络)
curl -fsSL https://test.docker.com -o test-docker.sh&&sudo sh test-docker.sh
获取 WIndows 操作系统光盘
虽然项目会根据用户指令,从 dl.bobpony.com
、archive.org
,以及微软官网自动下载合适的英文版系统镜像,但如果你想更快的完成系统的安装,或者想快速的启动多个 Windows Docker 容器,那么手动下载 Windows 光盘还是非常有必要的。
开源项目包含了一些自动安装的预设配置,不过,这需要使用英文版的操作系统,你可以从这里下载。
当然,如果你需要使用中文版的操作系统,也可以从MSDN下载,在初始化操作系统的时候,相比英文操作系统你需要额外点一些“下一步”。
获取 Windows in Docker 容器镜像
获取在 Docker 中运行 Windows 的容器镜像很简单:
docker pull dockurr/windows
当然,如果不能够直接下载,也可以选择本地构建:
git clone https://github.com/dockur/windows.git
cd windows
docker build -t dockurr/windows .
利用Docker-compose搭建更加方便
services:
windows:
image: dockurr/windows
container_name: windows
environment:
VERSION: "ltsc10"
LANGUAGE: "Chinese"
REGION: "en-US"
KEYBOARD: "en-US"
DISK_SIZE: "32G"
RAM_SIZE: "6G"
CPU_CORES: "4"
USERNAME: "按需修改"
PASSWORD: "按需修改"
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
volumes:
- /root/win:/storage
restart: always
将上面的配置保存为 docker-compose.yml
,然后使用 docker compose up
或 docker compose -d
启动服务
如何选择 Windows 版本?
默认情况下,将安装 Windows 11。但您可以将 VERSION
环境变量添加到 Compose 文件中,以指定要下载的备用 Windows 版本:
environment:
VERSION: "win11"
从以下值中选择:
系统 | 版本 | 大小 |
---|---|---|
win11 |
Windows 11 专业版 | 5.4 GB |
ltsc11 |
Windows 11 LTSC | 4.2 GB |
win11e |
Windows 11 企业版 | 5.8 GB |
win10 |
Windows 10 专业版 | 5.7 GB |
ltsc10 |
Windows 10 LTSC | 4.6 GB |
win10e |
Windows 10 企业版 | 5.2 GB |
win8 |
Windows 8.1 专业版 | 4.0 GB |
win8e |
Windows 8.1 企业版 | 3.7 GB |
win7 |
Windows 7 企业版 | 3.0 GB |
vista |
Windows Vista 企业版 | 3.0 GB |
winxp |
Windows XP 专业版 | 0.6 GB |
2025 |
Windows Server 2025 | 5.0 GB |
2022 |
Windows Server 2022 | 4.7 GB |
2019 |
Windows 服务器 2019 | 5.3 GB |
2016 |
Windows 服务器 2016 | 6.5 GB |
2012 |
Windows 服务器 2012 | 4.3 GB |
2008 |
Windows 服务器 2008 | 3.0 GB |
2003 |
Windows 服务器 2003 | 0.6 GB |
要安装 ARM64 版本的 Windows,请使用dockur/windows-arm。
如何更改存储位置?
要更改存储位置,请在撰写文件中包括以下绑定挂载:
volumes:
- /var/win:/storage
将示例路径替换 /var/win
为所需的存储文件夹。
如何更改磁盘大小?
要扩展 64 GB 的默认大小,请将 DISK_SIZE
设置添加到您的撰写文件中,并将其设置为您的首选容量:
environment:
DISK_SIZE: "256G"
也可以用于将现有磁盘调整为更大的容量而不会丢失任何数据。
如何与主机共享文件?
打开“文件资源管理器”,点击“网络”部分,你会看到一台名为的计算机 host.lan
。双击它,它会显示一个名为的文件夹 Data
,可以通过撰写文件将其绑定到主机上的任何文件夹:
volumes:
- /home/user/example:/shared
示例文件夹 /home/user/example
将以 形式提供 \\host.lan\Data
。
提示
你可以将此路径映射到 Windows 中的驱动器号,以便于访问。
如何安装自定义图像?
为了下载上面列表中无法选择的不受支持的 ISO 映像,请在 VERSION
环境变量中指定该 ISO 的 URL,例如:
environment:
VERSION: "https://example.com/win.iso"
你也可以跳过下载并使用本地文件,通过以下方式将其绑定到你的配置文件中:
volumes:
- /home/user/example.iso:/custom.iso
将示例路径替换为你想要的 ISO 文件的文件名,在这种情况下将忽略 VERSION
的值。
安装后如何运行脚本?
要在安装后运行你自己的脚本,可以创建一个名为的文件 install.bat
,并将其与所需的任何其他文件(例如要安装的软件)一起放在文件夹中。然后将该文件夹绑定到你的撰写文件中,如下所示:
volumes:
- /home/user/example:/oem
示例文件夹 /home/user/example
将在安装过程中被复制到 C:\OEM
,并且包含 install.bat
将在最后一步执行。
如何进行手动安装?
最好使用自动安装,因为它会调整各种设置以防止在虚拟环境中运行 Windows 时出现常见问题。
但是,如果你坚持手动执行安装,请将以下环境变量添加到您的撰写文件中:
environment:
MANUAL: "Y"
如何更改 CPU 或 RAM 的数量?
默认情况下,容器最多允许使用 2 个 CPU 核心和 4 GB RAM。
如果你想调整这个,您可以使用以下环境变量指定所需的数量:
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
如何配置用户名和密码?
默认情况下,Docker
安装过程中会创建一个名为的用户,其密码为空。
如果你想使用不同的凭据,您可以在撰写文件中更改它们:
environment:
USERNAME: "bill"
PASSWORD: "gates"
如何选择 Windows 语言?
默认情况下,将下载英文版 Windows。但您可以将 LANGUAGE
环境变量添加到 Compose 文件中,以指定替代语言:
environment:
LANGUAGE: "French"
你可以选择:🇦🇪阿拉伯语、🇧🇬保加利亚语、🇨🇳中文、🇭🇷克罗地亚语、🇨🇿捷克语、🇩🇰丹麦语、🇳🇱荷兰语、🇬🇧英语、🇪🇪爱沙尼亚语、🇫🇮芬兰语、🇫🇷法语、🇩🇪德语、🇬🇷希腊语、🇮🇱希伯来语、🇭🇺匈牙利语、🇮🇹意大利语、🇯🇵日语、🇰🇷韩语、🇱🇻拉脱维亚语、🇱🇹立陶宛语, 🇳🇴 挪威语、🇵🇱 波兰语、🇵🇹 葡萄牙语、🇷🇴 罗马尼亚语、🇷🇺 俄语、🇷🇸 塞尔维亚语、🇸🇰 斯洛伐克语、🇸🇮 斯洛文尼亚语、🇪🇸 西班牙语、🇸🇪 瑞典语、🇹🇭 泰语、🇹🇷 土耳其语和🇺🇦 乌克兰语。
如何选择键盘布局?
如果你想要使用非所选语言默认的键盘布局或区域设置,则可以添加带有文化代码 KEYBOARD
的 REGION
变量,如下所示:
environment:
REGION: "en-US"
KEYBOARD: "en-US"
安装完成后,更改这些值将不会产生任何影响。在这种情况下,请使用 Windows 内的控制面板。
如何使用 RDP 连接?
网络查看器主要用于安装期间使用,因为它的图像质量较低,并且没有音频或剪贴板。
Docker
因此,为了获得更好的体验,您可以使用任何 Microsoft 远程桌面客户端使用用户名并将密码留空来连接到容器的 IP 。
Play Store 提供适用于Android的 RDP 客户端, Apple Store 提供适用于iOS 的RDP 客户端。对于 Linux,您可以使用FreeRDP mstsc
;对于 Windows,只需在搜索框中输入即可。
如何为容器分配单独的 IP 地址?
默认情况下,容器使用桥接网络,与主机共享 IP 地址。
如果要为容器分配单独的 IP 地址,可以按如下方式创建 macvlan 网络:
docker network create -d macvlan \
--subnet=192.168.0.0/24 \
--gateway=192.168.0.1 \
--ip-range=192.168.0.100/28 \
-o parent=eth0 vlan
请务必修改这些值以匹配你的本地子网。
创建网络后,将撰写文件更改为如下所示:
services:
windows:
container_name: windows
..<snip>..
networks:
vlan:
ipv4_address: 192.168.0.100
networks:
vlan:
external: true
这种方法的另一个好处是您不再需要执行任何端口映射,因为所有端口都会默认公开。
由于 macvlan 的设计不允许 Docker 主机与主机之间进行通信,因此无法从 Docker 主机访问此 IP 地址。如果担心此问题,您需要创建第二个 macvlan作为解决方法。
Windows 如何从我的路由器获取 IP 地址?
为macvlan配置容器后,Windows 就可以像真正的 PC 一样通过向路由器请求 IP 成为家庭网络的一部分。
要启用此模式,请将以下行添加到您的撰写文件中:
environment:
DHCP: "Y"
devices:
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'
在这种模式下,容器和 Windows 将各自拥有单独的 IP。
如何添加多个磁盘?
要创建其他磁盘,请像这样修改你的组合文件:
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
volumes:
- /home/example:/storage2
- /mnt/data/example:/storage3
如何直通磁盘?
可以通过以下方式将磁盘设备添加到配置文件中来直接传递磁盘设备:
devices:
- /dev/sdb:/disk1
- /dev/sdc:/disk2
/disk1
如果您希望它成为主驱动器(将在安装期间格式化),请使用,并使用更高 /disk2
版本将其添加为辅助驱动器(将保持不变)。
如何直通 USB 设备?
要直通 USB 设备,首先通过 lsusb
命令查找其供应商和产品 ID,然后将它们添加到您的撰写文件中,如下所示:
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
- /dev/bus/usb
如果设备是 USB 磁盘驱动器,请等到安装完成后再连接。否则安装可能会失败,因为磁盘的顺序可能会被重新排列。
如何验证我的系统是否支持 KVM?
要验证你的系统是否支持 KVM,请运行以下命令:
sudo apt install cpu-checker
sudo kvm-ok
如果您收到错误,kvm-ok
指示无法使用 KVM 加速,请检查:
- 您的 BIOS 中已启用虚拟化扩展(
Intel VT-x
或)。AMD SVM
- 您正在使用支持它们的操作系统,例如 Linux 或 Windows 11(不幸的是,macOS 和 Windows 10 不支持)。
- 如果您在虚拟机内运行容器,则您启用了“嵌套虚拟化”。
- 您没有使用云提供商,因为大多数云提供商不允许其 VPS 进行嵌套虚拟化。
如果您根本没有收到任何错误 kvm-ok
,但容器仍然抱怨 /dev/kvm
缺少内容,则将其添加 privileged: true
到您的撰写文件(或 --privileged
您的 run
命令)中可能会有所帮助,以排除任何权限问题。
如何在容器中运行 macOS?
你可以使用dockur/macos来实现这一点。除了自动安装之外,它们具有许多相同的功能。
开始使用
当一切就绪后,我们可以使用两个方式来访问这个运行在 Docker 中的 Windows。
第一种方法,是使用浏览器访问容器所在主机的 IP地址:8006
。
第二种方法,是使用支持 RDP 远程访问功能的软件,在软件服务器地址和端口内容中分别填写 IP地址
和 3389
,在用户名栏填写 你配置文件的用户名
,密码 你配置文件的密码
即可。
Enjoy!