在docker中运行windows容器

突发奇想,在docker服务器中运行windows系统,省去安装虚拟机的必要。仅供娱乐!

说到docker服务往往大家想的都是部署服务,其实docker还可以用来创建系统容器,比如Linux系统、windows系统、甚至是MacOS也可以在docker容器中运行。

官方文档:https://hub.docker.com/u/dockurr

1.前置条件

本次的docker服务是在Cento7中运行的,同时需要你的系统支持虚拟化。如果你是群晖用户也是可以创建windows容器的。

2.开启虚拟化

2.1以下针对Linux用户的操作

检查cpu是否支持虚拟化:

grep vmx /proc/cpuinfo

如果没有vmx的信息输出,说明是不支持虚拟化的,也就是无法玩了。

查看是否加载kvm模块:

lsmod | grep kvm

如果没有加载使用以下命令进行加载:

modprobe kvm
modprobe kvm-intel

模块加载完成后可以查看到kvm设备

ls /dev/kvm

3.部署

3.1通过docker命令创建

通过docker run 命令来创建windows的容器:

docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows

容器创建完成后,通过终端可以看到会去下载win11的系统版本,也就是默认是win11系统。

3.2通过docker-compose形式创建

推荐使用此方式,docker-compose.yaml内容如下:

version: "3"
services:
  windows:
    image: dockurr/windows
    container_name: windows
    devices:
      - /dev/kvm
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    stop_grace_period: 2m
    restart: on-failure

当容器正确运行后,通过访问http://容器服务器IP:8006端口,等待自动安装后即可使用windows系统。也可以通过访问映射的3389端口使用远程桌面(mstsc)的形式访问由容器创建的windows容器。

4.用法

4.1更换windows版本

在docker-compose.yaml中,通过指定环境变量来更换容器运行的系统版本:

version: "3"
services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
          VERSION: "win11"
      ....

此处的:

VERSION: "win11"

可以指定的系统版本有:

系统版本 镜像大小
Win11 Windows 11 Pro 6.4 GB
win10 Windows 10 Pro 5.8 GB
ltsc10 Windows 10 LTSC 4.6 GB
win81 Windows 8.1 Pro 4.2 GB
win7 Windows 7 SP1 3.0 GB
vista Windows Vista SP2 3.6 GB
winxp Windows XP SP3 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 R2 4.3 GB
2008 Windows Server 2008 R2 3.0 GB
core11 Tiny 11 Core 2.1 GB
tiny11 Tiny 11 3.8 GB
tiny10 Tiny 10 3.6 GB

如果觉得下载慢可以手动指定下载地址:

environment:
  VERSION: "https://example.com/win.iso"

4.2修改CPU或者ARM的数量

默认情况下:2个cpu内核和4GB RAM,这是win11的最低要求。也可以通过修改环境变量来配置数量:

environment:
  RAM_SIZE: "8G"
  CPU_CORES: "4"

4.3更改磁盘大小

默认磁盘的大小是64GB,可以通过环境变量来调整大小:

environment:
  DISK_SIZE: "1024G"

5官方文档

Docker 容器内的 Windows。

特征 ✨

  • 多语言
  • ISO 下载器
  • KVM加速
  • 基于 Web 的查看器

用法 🐳

通过 Docker Compose:

services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
      VERSION: "win11"
    devices:
      - /dev/kvm
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    stop_grace_period: 2m

通过 Docker CLI:

docker run -it --rm -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows

通过 Kubernetes:

kubectl apply -f kubernetes.yml

常见问题 💬

我该如何使用它?

很简单!步骤如下:

  • 启动容器并使用 Web 浏览器连接到端口 8006
  • 当奇迹发生时,坐下来放松一下,整个安装将全自动进行。
  • 看到桌面后,您的 Windows 安装就可以使用了。

享受您的全新机器,别忘了为这个 repo 加星标!

如何选择 Windows 版本?

默认情况下,将安装 Windows 11。但是,您可以将环境变量添加到撰写文件中,以便指定要下载的替代 Windows 版本:VERSION

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

[!提示] 若要安装 ARM64 版本的 Windows,请使用 dockur/windows-arm

如何选择 Windows 语言?

默认情况下,将下载英文版的 Windows。但是,您可以将环境变量添加到撰写文件中,以便指定替代语言:LANGUAGE

environment:
  LANGUAGE: "French"

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

如何选择键盘布局?

如果要使用不是所选语言默认值的键盘布局或区域设置,则可以使用区域性代码添加 and 变量,如下所示:KEYBOARD`REGION`

environment:
  REGION: "en-US"
  KEYBOARD: "en-US"

[!注意]
在执行安装后,更改这些值将不起作用。在这种情况下,请使用 Windows 中的控制面板。

如何更改存储位置?

要更改存储位置,请在 compose 文件中包含以下绑定挂载:

volumes:
  - /var/win:/storage

将示例路径替换为所需的存储文件夹。/var/win

如何更改磁盘的大小?

要扩展默认大小 64 GB,请将设置添加到撰写文件并将其设置为首选容量:DISK_SIZE

environment:
  DISK_SIZE: "256G"

[!提示] 这也可用于将现有磁盘的大小调整为更大的容量,而不会丢失任何数据。

如何与主机共享文件?

打开“文件资源管理器”,然后单击“网络”部分,您将看到一台名为 .双击它,它将显示一个名为 的文件夹,该文件夹可以通过 compose 文件绑定到主机上的任何文件夹:host.lan`Data`

volumes:
  -  /home/user/example:/shared

示例文件夹将作为 ./home/user/example` \host.lan\Data`

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

如何安装自定义映像?

要下载无法从上述列表中选择的不受支持的 ISO 映像,请在环境变量中指定该 ISO 的 URL,例如:VERSION

environment:
  VERSION: "https://example.com/win.iso"

或者,您也可以跳过下载并使用本地文件,方法是通过以下方式将其绑定到您的撰写文件中:

volumes:
  - /home/user/example.iso:/custom.iso

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

安装后如何运行脚本?

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

volumes:
  -  /home/user/example:/oem

示例文件夹将在安装过程中复制到,包含将在最后一步中执行。/home/user/example`C:\OEMinstall.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"
如何使用 RDP 进行连接?

网络查看器主要用于安装过程中,因为它的图像质量很低,并且没有音频或剪贴板。

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

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

如何为容器分配单个 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 主机访问此 IP 地址,这不允许两者之间的通信。如果这是一个问题,您需要创建第二个 macvlan 作为解决方法。

Windows 如何从我的路由器获取 IP 地址?

macvlan 配置容器后,Windows 可以通过从路由器请求 IP 成为家庭网络的一部分,就像真正的 PC 一样。

要启用此模式,请将以下行添加到撰写文件中:

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 设备,请先通过命令查找其供应商和产品 ID,然后将它们添加到您的撰写文件中,如下所示:lsusb

environment:
  ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
  - /dev/bus/usb

[!重要提示] 如果设备是 U 盘驱动器,请等到安装完成后再连接。否则,安装可能会失败,因为磁盘的顺序可能会重新排列。

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

要验证您的系统是否支持 KVM,请运行以下命令:

sudo apt install cpu-checker
sudo kvm-ok

如果您收到无法使用 KVM 加速的错误提示,请检查是否:kvm-ok

  • 虚拟化扩展(或)在 BIOS 中启用。Intel VT-x`AMD SVM`
  • 您正在运行支持它们的操作系统,例如 Linux 或 Windows 11(不幸的是,macOS 和 Windows 10 没有)。
  • 如果在虚拟机中运行容器,则启用了“嵌套虚拟化”。
  • 您没有使用云提供商,因为他们中的大多数都不允许对其 VPS 进行嵌套虚拟化。

如果您根本没有收到任何错误,但容器仍然抱怨缺少,则添加到您的撰写文件(或命令)中可能会有所帮助,以排除任何权限问题。kvm-ok`/dev/kvmprivileged: true–privilegedrun`

如何在容器中运行 macOS?

为此,您可以使用 dockur/macos。除了自动安装外,它共享许多相同的功能。

这个项目合法吗?

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

文档更新时间: 2024-06-28 13:13   作者:李延召