Docker容器内运行Windows系统

Windows

Docker 容器内运行的 Windows。

功能 ✨

  • ISO 下载器
  • KVM 加速
  • 基于网页的浏览器

使用方法🐳

通过 Docker Compose:
yaml 复制代码
services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
      VERSION: "11"
    devices:
      - /dev/kvm
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    volumes:
      - ./windows:/storage
    restart: always
    stop_grace_period: 2m
Via Docker CLI:
bash 复制代码
docker run -it --rm --name windows -p 8006:8006 --device=/dev/kvm --device=/dev/net/tun --cap-add NET_ADMIN -v "${PWD:-.}/windows:/storage" --stop-timeout 120 dockurr/windows
Via Kubernetes:
shell 复制代码
kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/master/kubernetes.yml

常见问题解答 💬

如何使用?

非常简单!步骤如下:

  • 启动容器并使用 Web 浏览器连接到 8006 端口

  • 静待奇迹发生,整个安装过程将完全自动完成。

  • 看到桌面后,您的 Windows 安装即可使用。

享受您的新机器吧,别忘了为这个仓库点赞!

如何选择 Windows 版本?

默认情况下,系统会安装 Windows 11 Pro。但您可以将 VERSION 环境变量添加到 Compose 文件,以指定要下载的其他 Windows 版本:

yaml 复制代码
  environment:
    VERSION: "11"

Select from the values below:

Value Version Size
11 Windows 11 Pro 5.4 GB
11l Windows 11 LTSC 4.7 GB
11e Windows 11 Enterprise 4.0 GB
10 Windows 10 Pro 5.7 GB
10l Windows 10 LTSC 4.6 GB
10e Windows 10 Enterprise 5.2 GB
8e Windows 8.1 Enterprise 3.7 GB
7u Windows 7 Ultimate 3.1 GB
vu Windows Vista Ultimate 3.0 GB
xp Windows XP Professional 0.6 GB
2k Windows 2000 Professional 0.4 GB
2025 Windows Server 2025 5.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
2003 Windows Server 2003 0.6 GB

要安装 ARM64 版本的 Windows,请使用 dockur/windows-arm

如何更改存储位置?

要更改存储位置,请在 Compose 文件中添加以下绑定挂载:

yaml 复制代码
  volumes:
    - ./windows:/storage

将示例路径“./windows”替换为所需的存储文件夹或命名卷。

如何更改磁盘大小?

要扩展默认的 64 GB 大小,请在 Compose 文件中添加“DISK_SIZE”设置,并将其设置为您所需的容量:

yaml 复制代码
  environment:
    DISK_SIZE: "256G"

这也可以用来将现有磁盘调整到更大的容量,而不会丢失任何数据。

如何与主机共享文件?

打开“文件资源管理器”,点击“网络”部分,您将看到一个名为“host.lan”的计算机。

双击它,它将显示一个名为“Data”的文件夹,您可以通过 Compose 文件将其绑定到主机上的任何文件夹:

yaml 复制代码
  volumes:
    -  ./example:/data

示例文件夹 ./example 将以 \\host.lan\Data 的形式提供。

您可以将此路径映射到 Windows 中的驱动器号,以便于访问。

如何更改 CPU 或 RAM 的大小?

默认情况下,容器最多可以使用 2 个 CPU 核心和 4 GB RAM。
如果您想调整此设置,可以使用以下环境变量指定所需的大小:

yaml 复制代码
environment:
  RAM_SIZE: "8G"
  CPU_CORES: "4"

如何配置用户名和密码?

默认情况下,安装过程中会创建一个名为“Docker”的用户,其密码为“admin”。
如果您想使用不同的凭据,可以在 Compose 文件中进行配置(仅在安装前进行):

yaml 复制代码
  environment:
    USERNAME: "bill"
    PASSWORD: "gates"

如何选择 Windows 语言?

默认情况下,系统会下载英文版 Windows。
但在安装之前,您可以将 LANGUAGE 环境变量添加到 Compose 文件中,以指定其他语言:

yaml 复制代码
environment:
  LANGUAGE: "French"

您可以选择:🇦🇪阿拉伯语、🇧🇬保加利亚语、🇨🇳中文、🇭🇷克罗地亚语、🇨🇿捷克语、🇩🇰丹麦语、🇳🇱荷兰语、🇬🇧英语、🇪🇪爱沙尼亚语、🇫🇮芬兰语、🇫🇷法语、🇩🇪德语、🇬🇷希腊语、🇮🇱希伯来语、🇭🇺匈牙利语、🇮🇹意大利语、🇯🇵日语、🇰🇷韩语、🇱🇻拉脱维亚语、🇱🇹立陶宛语, 🇳🇴 挪威语、🇵🇱 波兰语、🇵🇹 葡萄牙语、🇷🇴 罗马尼亚语、🇷🇺 俄语、🇷🇸 塞尔维亚语、🇸🇰 斯洛伐克语、🇸🇮 斯洛文尼亚语、🇪🇸 西班牙语、🇸🇪 瑞典语、🇹🇭 泰语、🇹🇷 土耳其语和 🇺🇦 乌克兰语。

如何选择键盘布局?

如果您想使用非所选语言默认的键盘布局或语言环境,您可以像这样添加 KEYBOARDREGION 变量(安装前):

yaml 复制代码
environment:
  REGION: "en-US"
  KEYBOARD: "en-US"

如何选择版本?

Windows Server 提供了一个极简的 Core 版本,没有 GUI。要选择非标准版本,您可以在安装前添加一个 EDITION 变量,如下所示:

yaml 复制代码
environment:
  EDITION: "core"

如何安装自定义镜像?

要下载不受支持的 ISO 镜像,请在 VERSION 环境变量中指定其 URL:

yaml 复制代码
environment:
VERSION: "https://example.com/win.iso"

或者,您也可以跳过下载过程,改用本地文件,方法是将其绑定到您的 Compose 文件中,如下所示:

yaml 复制代码
volumes:
- ./example.iso:/boot.iso

将示例路径 ./example.iso 替换为您所需的 ISO 文件的文件名。在这种情况下,VERSION 的值将被忽略。

如何在安装后运行脚本?

要在安装后运行您自己的脚本,您可以创建一个名为 install.bat 的文件,并将其与所需的任何其他文件(例如,要安装的软件)一起放在一个文件夹中。

然后在您的 Compose 文件中绑定该文件夹,如下所示:

yaml 复制代码
volumes:
- ./example:/oem

示例文件夹 ./example 将被复制到 C:\OEM,其中包含的 install.bat 将在自动安装的最后一步执行。

如何执行手动安装?

建议坚持使用自动安装,因为它会调整各种设置,以防止在虚拟环境中运行 Windows 时出现常见问题。
但是,如果您坚持手动安装并自行承担风险,请在 Compose 文件中添加以下环境变量:

yaml 复制代码
environment:
  MANUAL: "Y"

如何使用 RDP 连接?

Web 查看器主要用于安装期间,因为它的图像质量较低,并且没有音频或剪贴板等功能。

为了获得更好的体验,您可以使用任何 Microsoft 远程桌面客户端连接到容器的 IP,用户名为“Docker”,密码为“admin”。

Play Store 提供适用于 Android 的 RDP 客户端,Apple Store 提供适用于 iOS 的 RDP 客户端。对于 Linux,您可以使用 FreeRDP,对于 Windows,只需在搜索框中输入“mstsc”即可。

如何为容器分配单独的 IP 地址?

默认情况下,容器使用桥接网络,与主机共享 IP 地址。

如果您想为容器分配单独的 IP 地址,可以按如下方式创建 macvlan 网络:

bash 复制代码
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

请务必修改这些值以匹配您的本地子网。
创建网络后,请将 Compose 文件更改为如下所示:

yaml 复制代码
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 可以通过向路由器请求 IP 地址成为您家庭网络的一部分,就像一台真正的 PC 一样。

要启用此模式,容器和 Windows 将拥有单​​独的 IP 地址,请在 Compose 文件中添加以下行:

yaml 复制代码
environment:
DHCP: "Y"
devices:
- /dev/vhost-net
device_cgroup_rules:
- 'c *:* rwm'

如何添加多个磁盘?

要创建更多磁盘,请按如下方式修改 Compose 文件:

yaml 复制代码
environment:
DISK2_SIZE: "32G"
DISK3_SIZE: "64G"
volumes:
- ./example2:/storage2
- ./example3:/storage3

如何直通磁盘?

可以通过将磁盘设备或分区添加到 Compose 文件来直接直通磁盘:

yaml 复制代码
devices:
  - /dev/sdb:/disk1
  - /dev/sdc1:/disk2

如果您希望将 /disk1 用作主驱动器(安装过程中会进行格式化),请使用 /disk2 及更高版本将其添加为辅助驱动器(安装过程中不会进行任何改动)。

如何透传 USB 设备?

要透传 USB 设备,首先使用 lsusb 命令查找其供应商和产品 ID,然后将它们添加到您的 Compose 文件中,如下所示:

yaml 复制代码
environment:
  ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
  - /dev/bus/usb

如果设备是 USB 磁盘驱动器,请等到安装完全完成后再连接。否则,安装可能会失败,因为磁盘的顺序可能会被重新排列。

如何验证我的系统是否支持 KVM?

首先使用以下图表检查您的软件是否兼容:

Product Linux Win11 Win10 macOS
Docker CLI
Docker Desktop
Podman CLI
Podman Desktop

之后,您可以在 Linux 中运行以下命令来检查您的系统:

bash 复制代码
sudo apt install cpu-checker
sudo kvm-ok

如果您收到来自 kvm-ok 的错误,指示无法使用 KVM,请检查:

  • 您的 BIOS 中是否启用了虚拟化扩展(“Intel VT-x” 或 “AMD SVM”)。

  • 如果您在虚拟机中运行容器,则是否启用了“嵌套虚拟化”。

  • 您没有使用云服务提供商,因为大多数云服务提供商不允许其 VPS 使用嵌套虚拟化。

如果您没有收到来自 kvm-ok 的任何错误,但容器仍然提示缺少 KVM 设备,则建议您在 Compose 文件中添加 privileged: true(或在 docker 命令中添加 sudo),以排除任何权限问题。

如何在容器中运行 macOS?

您可以使用 dockur/macos 来实现。除了自动安装之外,它与 macos 有很多相同的功能。

如何在容器中运行 Linux 桌面?

在这种情况下,您可以使用 qemus/qemu

这个项目合法吗?

是的,该项目仅包含开源代码,不分发任何受版权保护的材料。代码中发现的任何产品密钥都只是 Microsoft 为试用目的提供的通用占位符。因此,根据所有适用法律,该项目均视为合法。

关于项目

Docker容器内运行Windows系统。
MIT
Shell
46,778
3440
229
2024-01-14
2025-10-10

增长趋势 - stars