📢gitzw.com上线了,功能陆续更新中,如有问题或反馈请在下方反馈/建议中给我们留言。
在 Docker 中运行 Windows 实战指南

在 Docker 中运行 Windows 实战指南

📌 本文速览

通过本教程,你将学会如何在 Docker 容器中运行 Windows 操作系统,并掌握其配置和优化技巧。

🎯 进阶📖 15 章⏱ ≈61 分钟读完🔄 更新于 2026-07-19
源项目:github.com/dockur/windows

1. 环境准备与依赖安装

本章要搭建好运行 Windows 容器的基础环境,确保所有必要的软件和驱动都已正确安装。

首先确认你的系统满足以下要求:

  • 如果使用 Linux 主机,需安装 Docker 或 Podman,并且主机支持 KVM。
  • 如果使用 Windows 11,需安装 Docker Desktop 并启用嵌套虚拟化功能。
  • 至少有 4GB 内存和 64GB 空闲硬盘空间。

我们先检查 Docker 是否已安装。打开终端输入:

docker --version

这会显示当前 Docker 版本号,确认 Docker 已正确安装。

接着检查 KVM 支持情况,在终端运行:

lsmod | grep kvm

如果返回包含 kvm 的行,则表示 KVM 模块已加载。

如果没有看到 kvm,可能需要手动加载模块:

sudo modprobe kvm-intel  # 对于 Intel 处理器
# 或者
sudo modprobe kvm-amd   # 对于 AMD 处理器

然后再次运行 lsmod | grep kvm 确认模块是否成功加载。

对于 Windows 用户,确保 Docker Desktop 已启用嵌套虚拟化:

  1. 打开 Docker Desktop 设置。
  2. 进入 Resources -> WSL Integration -> Enable integration with required distros。
  3. 切换到 General -> Use the WSL 2 based engine。
  4. 在 Experimental features 下勾选 "Use nested virtualization"。

最后验证一下 Docker 是否能正常工作。运行以下命令启动一个简单的容器:

docker run hello-world

如果一切顺利,你会看到一条欢迎信息,表明 Docker 可以正常使用了。

如果你遇到权限问题,请尝试将用户添加到 docker 组:

sudo usermod -aG docker $USER && newgrp docker

注销后重新登录生效。

搞定以上步骤后,你就完成了基本的环境准备和依赖安装。接下来可以开始部署 Windows 容器了。

2. 快速启动 Windows 容器

本章要解决的问题是如何快速启动一个 Windows 容器。完成这章后,你可以直接运行一个 Windows 容器并在其中执行一些基本操作。

前提条件:确保已经按照上一章的步骤正确安装了 Docker,并且启用了嵌套虚拟化功能。

我们先来拉取并运行一个默认的 Windows 11 Pro 容器镜像。首先,创建一个新的目录用于存放我们的 Docker Compose 文件:

mkdir windows-container && cd windows-container

接着,在该目录下创建一个 docker-compose.yml 文件,内容如下:

version: '3.8'
services:
  wincontainer:
    image: dockur/windows
    environment:
      VERSION: "11"
    ports:
      - "3389:3389"
    volumes:
      - ./data:/data

这个文件定义了一个名为 wincontainer 的服务,使用 dockur/windows 镜像,默认下载的是 Windows 11 Pro 版本,并映射了远程桌面端口 3389。

保存好文件后,直接运行以下命令启动容器:

docker-compose up -d

搞定!这条命令会在后台启动容器。如果你想查看容器的日志以确认一切正常,可以运行:

docker-compose logs -f wincontainer

如果你遇到权限问题或者 Docker 没有正确识别 WSL 2 引擎,请检查上一章提到的设置是否都已正确配置。

为了方便管理多个容器实例,建议为不同的项目使用独立的工作目录和命名空间。这样既可以避免冲突又能简化调试过程。

本章小结

  • 创建了一个新的工作目录用于存放 Docker Compose 文件。
  • 编写了 docker-compose.yml 来定义和配置 Windows 容器。
  • 使用 docker-compose up -d 命令启动容器。
  • 学习了如何通过日志监控容器的状态。

3. 选择与配置 Windows 版本

本章要解决的问题是如何选择和配置不同版本的 Windows 在 Docker 容器中运行。完成之后,你可以根据项目需求灵活地指定所需的 Windows 版本。

前置条件:确保你已经按照前几章的指导设置了 Docker 环境,并且有一个基本的 docker-compose.yml 文件。

第一步操作:打开你的 docker-compose.yml 文件。我们先来修改其中的 environment 部分,以选择不同的 Windows 版本。

假设你想使用 Windows 10 Pro 替换默认的 Windows 11 Pro,编辑 docker-compose.yml 如下:

version: '3.8'
services:
  wincontainer:
    image: dockur/windows
    environment:
      VERSION: "10"
    ports:
      - "3389:3389"
    volumes:
      - ./data:/data

预期结果:保存文件后,Docker 将会拉取并使用 Windows 10 Pro 版本来创建容器。

如果你遇到错误信息如 unknown version specified,请检查 VERSION 参数是否拼写正确并且符合表格中的选项。

接下来我们来看一下可用的不同 Windows 版本及其对应的参数:

版本 大小
11 Windows 11 Pro 7.9 GB
11l Windows 11 LTSC 4.7 GB
11e Windows 11 Enterprise 6.6 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 7.6 GB
2022 Windows Server 2022 6.0 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

例如,如果你想使用较轻量级的 LTSC 版本节省磁盘空间,可以选择相应的值(如 "WINLTSC""WINLTSCE")。

最后,记得重启你的容器以应用更改:

docker-compose down
docker-compose up -d

搞定!

一个实际的例子:假设你在开发一个旧版软件兼容性测试环境,你需要运行一个基于 Windows XP 的容器。你可以简单地将上述配置中的 VERSION 改为 "xp" 并重新部署容器即可快速搭建所需环境。

本章小结

  • 修改了 docker-compose.yml 文件中的 environment 部分来指定不同的 windows 版本。
  • 查看了可用的不同 windows 版本及其对应的参数。
  • 学习了如何重启容器以应用新的配置。

4. 调整存储与磁盘大小

本章要解决的问题是如何调整 Docker 容器中的存储和磁盘大小。通过学习本章,你能掌握如何设置容器的初始磁盘容量以及如何扩展现有磁盘的空间。

前置条件:确保你已经按照上一章的指导设置了 Windows 版本,并且容器能够正常启动。

我们先修改 docker-compose.yml 文件来调整磁盘大小。打开你的 docker-compose.yml 文件,找到 environment 部分,添加或修改 DISK_SIZE 参数:

services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
      VERSION: "11"
      DISK_SIZE: "256G"
    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

这段配置将磁盘大小设置为 256GB。根据你的需求调整这个数值。

接着,重启你的容器以应用更改:

docker-compose down
docker-compose up -d

搞定!这会停止当前运行的容器并重新启动一个新的容器,应用新的磁盘大小设置。

如果你遇到错误信息类似 Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/var/lib/docker/volumes/...\\\" to rootfs \\\"/var/lib/docker/overlay2/...\\\" at \\\"/storage\\\" caused \\\"no space left on device\\\"",这意味着你的主机没有足够的空间来分配给新设置的磁盘大小。检查并清理一些不必要的文件或者增加主机的硬盘空间。

一个小例子:假设你要开发一个大型数据库应用程序,并且需要大量的本地存储空间来存放测试数据集。你可以将 DISK_SIZE 设置为 "512G" 来满足这个需求。

本章小结

  • 修改了 docker-compose.yml 文件中的 DISK_SIZE 环境变量来指定不同的磁盘大小。
  • 学习了如何重启容器以应用新的配置。
  • 注意到了可能由于主机空间不足导致的错误及解决方案。

5. 设置 CPU 和内存资源

本章要解决的问题是如何调整 Docker 中 Windows 容器的 CPU 和内存资源,通过设置环境变量来控制容器使用的资源量。读完本章后,你可以根据需求自定义 Windows 容器的 CPU 核心数和内存大小。

前置条件:确保你已经按照前几章的步骤成功启动了一个基本的 Windows 容器,并且熟悉 Docker 的基本操作。

我们先来修改容器的 CPU 核心数和内存大小。假设我们要将 CPU 核心数设置为 4,内存设置为 8GB。

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

这段 YAML 配置指定了容器可以使用的最大内存量为 8GB,以及可以使用的 CPU 核心数为 4。

接着,在你的 docker-compose.yml 文件中添加上述环境变量配置。如果没有 docker-compose.yml 文件,则创建一个新的文件并添加以下内容:

version: '3.8'
services:
  windows_container:
    image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
    environment:
      RAM_SIZE: "8G"
      CPU_CORES: "4"
    deploy:
      resources:
        limits:
          cpus: '4.0'
          memory: 8g

如果你遇到错误信息invalid mount config for type "bind": bind source path does not exist 或其他类似挂载路径不存在的问题,请检查你的文件路径是否正确。

记住一点,确保你的主机有足够的物理资源来支持这些配置。否则,可能会导致系统不稳定或者无法启动容器。

举个例子,假如你在开发一个需要大量计算能力的应用程序,并且希望利用更多 CPU 资源进行处理。你可以将 CPU_CORES 设置得更高一些,同时增加 RAM_SIZE 来满足应用程序的需求。

本章小结

  • 学习了如何通过环境变量配置 Windows 容器的 CPU 和内存资源。
  • 修改了 docker-compose.yml 文件以包含新的资源配置。
  • 注意到主机资源限制的重要性,并学会了如何避免常见的配置错误。

6. 启用 USB 与文件共享

本章要解决的问题是如何在 Docker 容器中启用 USB 设备访问和文件共享功能,让你能够方便地与 Windows 容器交换数据,并使用外部硬件设备。

前置条件:

  • 已经按照上一章配置好了 docker-compose.yml 文件。
  • 主机操作系统支持 USB 传递(Linux 需要有 /dev/kvm 访问权限,Windows 需要开启嵌套虚拟化)。

我们先从文件共享开始。假设你想将主机上的某个目录挂载到 Windows 容器内,以便于文件交换。

volumes:
  - ./host_folder:/container_folder

这行代码将主机上的 ./host_folder 挂载到容器内的 /container_folder 目录。记得替换为实际的目录路径。

接着,我们要启用 USB 设备访问。首先,在 docker-compose.yml 中添加以下内容:

devices:
  - /dev/bus/usb:/dev/bus/usb

这行代码允许容器访问主机的所有 USB 设备。请注意,这样做会暴露所有 USB 设备给容器,可能带来安全风险。

如果你只想让容器访问特定的 USB 设备,可以指定具体的设备路径。例如:

devices:
  - /dev/bus/usb/001/002:/dev/bus/usb/001/002

这里的 /dev/bus/usb/001/002 是你要共享的具体 USB 设备路径。你可以通过 lsusb 命令查看具体设备的路径。

完整的 docker-compose.yml 示例如下:

version: '3.8'

services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
      VERSION: "11"
      RAM_SIZE: "8G"
      CPU_CORES: "4"
    devices:
      - /dev/kvm
      - /dev/net/tun
      - /dev/bus/usb:/dev/bus/usb
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    volumes:
      - ./windows:/storage
      - ./host_folder:/container_folder # 新增的文件共享配置
    restart: always
    stop_grace_period: 2m

如果你遇到错误信息如 invalid mount config for type "bind": bind source path does not exist 或者 permission denied on device "/dev/bus/usb",请检查你的文件路径是否正确以及是否有足够的权限访问该设备。

记住一点,在生产环境中谨慎配置 USB 设备共享,确保安全性。

举个例子,假设你正在开发一个图像处理软件,并且需要频繁地导入和导出图片文件。你可以将本地的图片库目录挂载到容器内的工作目录中。同时,如果这个软件还需要连接相机进行实时拍摄,则可以通过上述方法将相机对应的 USB 设备传递给容器。

本章小结

  • 学习了如何在 docker-compose.yml 中配置文件共享。
  • 掌握了如何启用对所有或特定 USB 设备的访问。
  • 注意到了配置过程中可能出现的一些常见错误及解决方法。

7. 配置网络连接方式

本章要解决的问题是如何配置不同的网络模式来满足各种使用需求。通过完成本章的学习,你能灵活地设置 Docker 容器的网络连接方式,无论是 NAT 模式还是更高级的 macvlan/macvtap。

前置条件:

  • 已经按照前几章完成了 Docker 安装和基本配置。
  • 确保你的 Docker 版本支持所需的网络驱动(macvlan 和 macvtap 可能需要特定内核模块)。

我们先来看一下默认的 NAT 模式。NAT 是最常用的模式,Docker 默认会创建一个内部网络,并通过宿主机的一个 IP 地址转发流量。

# 在 docker-compose.yml 中添加或修改 network 部分
networks:
  default:
    driver: bridge

这行代码设置了默认的桥接网络模式,即 NAT。

如果你想让容器获得独立的 IP 地址,可以使用 macvlan 模式。macvlan 允许容器直接连接到物理网络接口。

# 在 docker-compose.yml 中添加自定义网络部分
networks:
  my_macvlan_network:
    driver: macvlan
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1
    driver_opts:
      parent: eth0 # 替换为你的网卡名称

这段代码创建了一个名为 my_macvlan_network 的 macvlan 网络,并指定了子网和网关地址。记得将 parent 参数替换为你实际使用的物理网卡名称(例如 eth0enp3s0)。

接着,在服务中指定使用这个新的网络:

services:
  windows:
    networks:
      my_macvlan_network:
        ipv4_address: 192.168.1.200 # 可选:静态分配 IP 地址

这样就将 Windows 容器连接到了 macvlan 网络,并赋予了一个独立的 IP 地址。

如果你遇到错误信息如 driver failed programming external connectivity on endpoint ... (Error starting userland proxy: listen tcp 0.0.0.0:xxxxx: bind: address already in use),请检查端口是否已经被占用或者是否有其他服务冲突。

记住一点,在配置 macvlan 或 macvtap 网络时,务必确认你有足够的权限来管理这些网络接口,并且了解相关的网络安全风险。

举个例子,假设你在公司局域网内搭建了一个用于测试的新系统。为了确保这个新系统的网络行为不会影响现有业务,你可以将其置于一个隔离的 VLAN 内。这时就可以利用 macvlan 模式来实现这一点,只需将上述配置中的子网和网关设置为公司的测试 VLAN 对应的信息即可。

本章小结

  • 学习了如何在 docker-compose.yml 中配置不同类型的 Docker 网络。
  • 掌握了如何设置 NAT、macvlan 和 macvtap 模式的具体步骤。
  • 注意到了在网络配置过程中可能出现的一些常见错误及其解决方法。

8. 使用 RDP 连接到 Windows 容器

本章要解决的问题是如何通过远程桌面协议(RDP)连接到 Docker 中运行的 Windows 容器,读完后你能轻松地使用 RDP 客户端访问容器内的 Windows 系统。

前置条件:你需要已经成功启动了一个 Windows 容器,并且知道它的 IP 地址。如果你还没有启动容器,请参考第二章《快速启动 Windows 容器》进行操作。

我们先打开终端或命令行工具,确保你的 Docker 容器正在运行。

docker ps

这会列出所有正在运行的容器,记下你要连接的 Windows 容器的 ID 或名称。

接着,我们需要获取该容器的 IP 地址。

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id_or_name>

<container_id_or_name> 替换为你实际使用的容器 ID 或名称。执行这条命令后你会看到类似 172.17.0.2 的输出,这就是你的容器 IP 地址。

如果你遇到错误信息如 Error response from daemon: No such container: <container_id_or_name>,请检查输入的容器 ID 或名称是否正确。

记住一点,在生产环境中使用固定的 IP 地址更为可靠。你可以参考第七章的内容来配置静态 IP 地址。

举个例子,假设你已经有一个名为 win-container 的 Windows 10 容器在运行,并且通过上述命令获得了它的 IP 地址 172.17.0.3。现在我们可以使用任何支持 RDP 协议的客户端来连接这个容器。

首先,在你的电脑上下载并安装适用于你操作系统的 RDP 客户端:

  • Android 用户可以从 Google Play 商店下载 Microsoft Remote Desktop 应用。
  • iOS 用户可以在 App Store 下载 Microsoft Remote Desktop 应用。
  • Linux 用户可以使用 FreeRDP。
  • Windows 用户可以直接使用自带的 mstsc 应用程序。

然后打开 RDP 客户端,新建一个连接,输入刚才获得的容器 IP 地址 172.17.0.3 并保存设置。

最后尝试连接这个地址,默认情况下用户名为 Docker,密码为 admin。请注意首次登录时可能会有安全警告提示,按照提示完成必要的设置即可进入 Windows 界面。

本章小结

  • 学习了如何获取 Docker 容器的 IP 地址。
  • 掌握了通过 RDP 连接 Docker 中运行的 Windows 容器的方法。
  • 注意到了在不同操作系统上安装和配置 RDP 客户端的基本步骤。

9. 自定义用户名和密码

本章要解决的问题是如何自定义 Docker 中运行的 Windows 容器的用户名和密码。读完后,你可以轻松地更改默认的登录凭据,以便更好地管理容器内的访问权限。

前提是你已经有一个正在运行的 Windows 容器,并且可以通过 RDPWeb 观看器访问它。

我们先从修改默认用户名和密码开始。假设你已经有一个名为 win-container 的容器在运行:

docker exec -it win-container cmd

这会进入容器内部的命令行界面

接着,我们需要创建一个新的用户账户并设置密码。以下命令会在容器内创建一个新用户 myuser 并设置密码 mypassword

net user myuser mypassword /add

确保替换 myusermypassword 为你想要使用的用户名和密码。

如果你遇到错误信息如 System error 5 has occurred. Access is denied.,可能是因为你在非管理员权限下执行命令。你需要先切换到管理员权限:

net localgroup administrators myuser /add

这会将新用户添加到管理员组中。

接下来,我们要禁用默认的 Docker 用户以防止未授权访问:

net user Docker /active:no

这条命令会停用默认的 Docker 用户账户。

最后,记得重启容器以使更改生效:

docker restart win-container

现在你可以使用新的用户名和密码通过 RDP 或 Web 观看器登录到你的 Windows 容器了。

本章小结

  • 学习了如何通过命令行在 Docker 容器内创建新用户并设置密码。
  • 掌握了如何停用默认的管理员账户以提高安全性。
  • 知道了如何重启容器以应用这些更改。

10. 加入 Active Directory 域

本章要解决的问题是如何让 Windows 容器加入 Active Directory 域,这样可以更好地集成到现有的企业环境中。读完后你能让你的 Docker 容器成为域的一部分,并自动使用指定账户登录。

前置条件:你已经有一个运行中的 Windows 容器,并且知道你的 Active Directory 域名和一个有足够权限的域账户。

第一步操作,编辑你的 docker-compose.yml 文件,添加或修改 environment 部分来包含域名信息

version: '3'
services:
  windows_container:
    image: dockur/windows
    environment:
      - DOMAIN=example.com
      - USERNAME=mydomainuser
      - PASSWORD=mypassword

这里 DOMAIN 是你的 AD 域名,USERNAMEPASSWORD 是你用来加入域的账户凭证。确保替换为实际值。

接着,重新部署容器以应用这些更改:

docker-compose up --force-recreate

这条命令会重建并启动容器,使其尝试加入指定的 Active Directory 域。

如果你遇到错误信息如 The specified network name is no longer available,可能是由于容器无法解析域控制器的 DNS 地址。检查你的网络配置和 DNS 设置是否正确。

如果你看到类似 Logon failure: unknown user name or bad password. 的错误,则需要确认提供的用户名和密码是否正确无误。

记住一点,在生产环境中使用强密码策略,并定期更新密码以保证安全

一个小例子:假设你的公司域名为 company.local,并且你有一个管理员账户 adminuser 密码为 P@ssw0rd!23。那么你的 docker-compose.yml 应该如下所示:

version: '3'
services:
  windows_container:
    image: dockur/windows
    environment:
      - DOMAIN=company.local
      - USERNAME=adminuser
      - PASSWORD=P@ssw0rd!23

然后运行 docker-compose up --force-recreate 来启动容器并让它加入域。

本章小结

  • 编辑了 docker-compose.yml 文件以包含必要的环境变量。
  • 使用 docker-compose up --force-recreate 重启容器并尝试加入 Active Directory 域。
  • 解决了一些常见的连接和认证问题。

11. 音频流传输配置

本章要解决的问题是如何在 Docker 容器中启用和配置音频流传输,确保你可以通过浏览器RDP 正常听到声音。完成本章后,你应该能够在 Windows 容器内播放音频并通过指定的方式将其输出到主机或其他设备。

前置条件:

  • 已经成功启动并配置了一个 Windows 容器。
  • 确保你的 Docker 主机支持音频设备访问(如果需要)。
  • 如果使用的是 Docker Compose,请准备好 docker-compose.yml 文件。

我们先来修改 docker-compose.yml 文件以启用音频流传输。打开你的 docker-compose.yml 并添加以下环境变量:

environment:
  AUDIO: "Y"

这行代码启用了音频功能。记得保存文件。

接着,我们需要重新创建容器以使更改生效。运行以下命令:

docker-compose up --force-recreate

这条命令会停止当前运行的容器并根据新的配置重新创建一个新的容器实例。

如果你遇到权限问题,可能是因为 Docker 没有访问主机音频设备的权限。确保你的 Docker 用户组有权访问 /dev/snd 设备。可以将用户添加到 audio 组:

sudo usermod -a -G audio $USER

然后注销并重新登录以使组更改生效。

为了进一步验证音频设置是否正确,我们可以尝试在容器内部播放一段简单的音频文件。首先,进入正在运行的容器:

docker exec -it <container_id> bash

替换 <container_id> 为你实际使用的容器 ID 或名称。进入容器后,使用以下命令安装一个简单的媒体播放工具(如 mpg123):

apt-get update && apt-get install mpg123 -y

下载一个测试音频文件:

wget http://www.lindberg.no/testtone.wav

最后,使用 mpg123 播放这个文件:

mpg123 testtone.wav

如果一切正常,你应该能够听到播放的声音。

一个小例子:假设你想在一个已经存在的 Windows 10 容器中启用音频流传输,并且希望可以通过浏览器查看时听到声音。首先编辑你的 docker-compose.yml 如下所示:

version: '3'
services:
  windows_container:
    image: dockur/windows
    container_name: windows_container_10
    environment:
      VERSION: "10"
      AUDIO: "Y"
    devices:
      - /dev/kvm
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006/tcp
      - 8006:8006/udp
      - 3389:3389/tcp
      - 3389:3389/udp
    volumes:
      - ./windows:/storage
    restart: always
    stop_grace_period: 2m

然后运行以下命令来重启容器:

docker-compose up --force-recreate

这样就完成了对 Windows 容器的音频流传输配置。

本章小结

  • 修改了 docker-compose.yml 文件以启用音频功能。
  • 学习了如何处理可能的权限问题以便 Docker 访问主机的音频设备。
  • 使用 mpg123 测试了在容器内的音频播放效果。
  • 提供了一个具体的例子展示如何在一个现有的 Windows 容器中启用和测试音频流传输功能。

12. 监控与性能优化

本章要解决的问题是如何监控和优化 Docker 中运行的 Windows 容器的性能。通过学习本章,你可以掌握如何查看容器的资源使用情况,并进行相应的调整以提高效率

前置条件:

  • 已经按照之前的章节成功启动并配置了 Windows 容器。
  • 熟悉基本的 Docker 命令和 docker-compose 的使用方法。

首先,我们需要安装一些工具来帮助我们监控容器的性能。我们可以使用 cAdvisor 来收集和展示容器的各种指标。

docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

这一步会启动 cAdvisor 并将其绑定到主机的 8080 端口,方便我们通过浏览器访问监控数据。

打开浏览器,访问 http://localhost:8080,你会看到一个界面显示所有正在运行的 Docker 容器及其资源使用情况。重点关注你的 Windows 容器的各项指标如 CPU、内存、网络流量等。

接下来,我们要调整一些设置来优化性能。假设你想增加分配给 Windows 容器的内存和 CPU 核心数。编辑你的 docker-compose.yml 文件:

environment:
  RAM_SIZE: "12G"
  CPU_CORES: "6"

记得保存文件后重新启动容器:

docker-compose up --force-recreate

这样就增加了容器可以使用的内存和 CPU 核心数。

如果你发现某个进程占用了大量资源,可以通过任务管理器或者 PowerShell 查看详细信息并采取措施。例如,在 PowerShell 中运行以下命令来查看当前进程列表:

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

这会列出占用内存最多的前十个进程。

最后,为了更好地管理和监控多个容器,可以考虑使用 Portainer 或者 Rancher 这样的管理平台。这里简单演示一下如何安装 Portainer:

docker volume create portainer_data
docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

访问 http://localhost:9000 即可进入 Portainer 的管理界面,直观地查看和管理所有的 Docker 资源。

本章小结

  • 使用 cAdvisor 监控 Docker 容器的资源使用情况。
  • 调整 RAM_SIZECPU_CORES 环境变量来优化容器性能。
  • 使用 PowerShell 查看和管理 Windows 内部进程。
  • 安装 Portainer 方便地管理和监控多个 Docker 资源。

13. 故障排除与常见问题

本章要解决的问题是帮助你在使用 Docker 运行 Windows 容器时遇到的各种常见问题,并提供相应的故障排除方法。读完本章后,你应该能够快速定位并解决大部分常见的错误和问题。

前置条件:

  • 已经按照前面章节成功安装并运行了 Docker
  • 至少有一个正在运行的 Windows 容器实例。
  • 对基本的 Docker 命令有一定了解。

我们先从一些常见的错误信息开始排查。

docker logs <container_id>

这条命令用于查看指定容器的日志,可以帮助你找到容器启动失败的原因。

接着,检查容器的状态:

docker ps -a

这个命令会列出所有容器及其状态,包括已停止的容器。确保你的 Windows 容器处于运行状态(STATUS 列显示 UP)。

如果你遇到权限问题,比如设备挂载失败,可能是因为没有足够的权限访问 /dev/kvm 或其他设备。尝试以 root 用户运行 Docker 命令或者添加当前用户到 docker 组:

sudo usermod -aG docker $USER

然后重新登录生效。

如果容器无法启动并且日志中有类似 failed to initialize KVM: permission denied 的错误信息,请确认宿主机上的 KVM 支持已经正确启用并且有适当的权限设置。

有时候网络配置也会导致问题。确保端口映射正确无误:

docker inspect <container_id>

通过这个命令可以详细查看容器的配置信息,包括端口映射是否按预期工作。

记住一点,在处理复杂的问题时,逐步缩小范围是非常有用的策略。你可以尝试单独运行一个最简单的配置来验证各个部分的功能性。

举个例子,假设你想测试基本的 RDP 连接是否正常工作,可以简化配置如下:

services:
  windows-test:
    image: dockurr/windows
    container_name: windows-test
    environment:
      VERSION: "10"
    ports:
      - 3389:3389/tcp
      - 3389:3389/udp
    restart: always

然后使用以下命令启动这个服务:

docker-compose up -d

等待一段时间后,尝试通过 RDP 客户端连接到 localhost 的 3389 端口。如果能成功连接,则表明基础配置没有问题。如果有任何异常,请根据日志进一步诊断具体原因。

本章小结

  • 使用 docker logs 查看容器日志以获取更多信息。
  • 检查容器状态以确认是否正常运行。
  • 解决权限不足的问题可以通过调整用户组或使用 root 权限。
  • 使用 docker inspect 检查详细的容器配置信息。
  • 逐步简化配置以隔离和解决问题的根本原因。

14. 与其他虚拟化方案对比

本章要解决的问题是如何将 Docker 中的 Windows 容器与其他常见的虚拟化方案进行对比,帮助你理解各自的优势和适用场景。读完这章后,你应该能够根据具体需求选择合适的虚拟化技术。

上一章我们已经完成了基本的 RDP 测试,并确保了基础配置没有问题。现在我们来看看 Docker 中的 Windows 容器和其他虚拟化方案有哪些不同之处。

首先列出一些常用的虚拟化方案供比较:

  • Docker + Windows 容器
  • VirtualBox
  • VMware Workstation/Fusion
  • Hyper-V

接下来我们详细对比这些方案的特点。

对比表格

特征 Docker + Windows 容器 VirtualBox VMware Workstation/Fusion Hyper-V
性能 较好,尤其是有 KVM 支持 可接受 很好 很好
易用性 适合开发者和自动化部署 用户友好,图形界面 图形界面,易于管理 图形界面,集成在 Windows 内
存储管理 绑定卷简单 动态分配磁盘空间 高级存储选项 集成存储解决方案
资源分配 灵活设置 CPU 和内存 灵活 灵活 灵活
文件共享 支持绑定卷 共享文件夹 共享文件夹 共享文件夹
网络配置 多种模式支持(NAT, macvlan, etc.) 多种模式支持 多种模式支持 多种模式支持
支付成本 免费 商业版付费 商业版付费 内置于 Windows Pro 或更高版本免费
平台兼容性 主要在 Linux 上使用 KVM,Windows 11 跨平台(Linux, macOS, Windows) 跨平台(Linux, macOS, Windows) 仅限 Windows

关键差异详解

性能

  • Docker + Windows 容器:借助 KVM 技术可以获得接近原生的性能表现。
  • 其他虚拟机:通常也能提供不错的性能,但在某些情况下可能不如 Docker 结合 KVM 来得高效。

易用性

  • Docker + Windows 容器:更适合开发人员和需要自动化的场景。
  • 其他虚拟机:提供了直观的图形界面,对非技术人员更为友好。

存储管理

  • Docker + Windows 容器:通过绑定卷的方式进行存储管理非常方便。
  • 其他虚拟机:提供了动态分配磁盘空间等功能,但也相对复杂一些。

资源分配

  • 所有方案都允许灵活地为虚拟机分配 CPU 和内存资源。

文件共享

  • 所有方案均支持主机与容器之间的文件共享功能。

网络配置

  • Docker 提供了多种网络配置选项,而其他虚拟机也有类似的能力。

成本

  • Docker 是开源且免费的。
  • VirtualBox 和 VMware Workstation/Fusion 属于商业软件,需购买许可证。
  • Hyper-V 是内置在某些版本的 Windows 中的免费工具。

示例场景分析

假设你需要在一个开发环境中快速搭建多个不同的 Windows 版本实例来进行测试。在这种情况下,Docker 的灵活性和自动化能力会显得尤为突出。你可以轻松编写脚本来启动、停止和销毁容器实例,并且很容易实现持续集成/持续部署(CI/CD)流程。相比之下,在这种频繁变更的需求下使用传统虚拟机可能会更加繁琐。

另一方面,如果你是一个家庭用户或者 IT 小白想要运行一些简单的应用程序或游戏,那么 VirtualBox 或 VMware 可能会更容易上手,并且它们提供的图形界面让用户无需深入了解底层技术细节就能完成日常任务。

注意事项

  1. 如果你在 Linux 上使用 Docker,请确保你的系统启用了 KVM 支持以获得最佳性能。
  2. 在选择具体的虚拟化方案之前,请仔细评估你的实际需求和技术背景。
  3. 不同的操作系统可能会影响你的选择范围,请注意检查各产品的兼容性要求。

本章小结

  • Docker + Windows 容器适用于需要高性能、高灵活性和自动化部署的开发环境。
  • VirtualBox 和 VMware Workstation/Fusion 更适合普通用户或IT小白使用。
  • Hyper-V 作为内置工具,在某些特定环境下具有独特优势。
  • 根据具体需求和技术背景选择合适的虚拟化方案。

15. 实际项目中的应用案例

实际项目中的应用案例

本章通过具体的应用场景展示如何在实际项目中使用 Docker 来运行 Windows 容器。读完本章后,你能掌握如何在 CI/CD 流程中自动部署 Windows 环境,以及如何利用 Docker 的灵活性来管理多个 Windows 实例。

前置条件

  • 已经按照上一章的要求安装了 Docker 并启用了 KVM 支持。
  • 至少 4 GB 内存和 64 GB 空闲磁盘空间。
  • 熟悉基本的 Docker 操作。

应用案例 1:自动化测试环境

假设你是一家软件公司的开发团队,需要为不同版本的 Windows 创建自动化测试环境。你可以使用 Docker Compose 文件来自动生成这些环境,并通过 CI/CD 流水线进行管理。

步骤 1:创建 Docker Compose 文件

version: '3'
services:
  win10:
    image: dockurr/windows
    container_name: win10
    environment:
      VERSION: "10"
    devices:
      - /dev/kvm
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    volumes:
      - ./win10:/storage
    restart: always
    stop_grace_period: 2m

  win11:
    image: dockurr/windows
    container_name: win11
    environment:
      VERSION: "11"
    devices:
      - /dev/kvm
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    ports:
      - 8007:8006
      - 3390:3389/tcp
      - 3390:3389/udp
    volumes:
      - ./win11:/storage
    restart: always
    stop_grace_period: 2m

这个文件定义了两个服务:一个用于 Windows 10,另一个用于 Windows 11。每个服务都映射了不同的端口以便区分。

步骤 2:启动容器

docker-compose up -d

这行命令会在后台启动两个容器。你可以通过访问 http://localhost:8006http://localhost:8007 来分别查看这两个 Windows 实例的状态页面。

步骤 3:集成到 CI/CD 流水线

在 Jenkins 或 GitLab CI 中添加构建步骤来拉取最新的镜像并更新容器:

stages:
  - deploy

deploy_win_envs:
  stage: deploy
  script:
    - docker-compose pull && docker-compose up --force-recreate --build --detach --remove-orphans --renew-anon-volumes --no-deps win10 win11

这样每次推送代码时都会自动更新测试环境。

应用案例 2:家庭娱乐中心

如果你是一个家庭用户,想在家里搭建一个集成了多种游戏和应用程序的娱乐中心,可以使用单个强大的 Docker 容器来运行各种版本的 Windows。

步骤 1:编写 Docker Compose 文件

version: '3'
services:
  gaming_windows_7u:
    image: dockurr/windows
    container_name: gaming_windows_7u
    environment:
      VERSION: "7u"
      AUDIO: "Y"
    devices:
      - /dev/kvm:/dev/kvm:rwm,/dev/snd:/dev/snd:rwm,/dev/input/event*:/dev/input/event*:rwm,/dev/dri/card*:/dev/dri/card*:rwm,/sys/class/backlight/acpi_video*/brightness:/sys/class/backlight/acpi_video*/brightness:rwm,/sys/class/backlight/acpi_video*/max_brightness:/sys/class/backlight/acpi_video*/max_brightness:rwm,/proc/bus/input/devices:/proc/bus/input/devices:rwm,/proc/asound/cards:/proc/asound/cards:rwm,/etc/Xauthority:/etc/Xauthority,rw,bind,:/root/.Xauthority,rw,bind,:/tmp/.Xauth*,rw,bind,:/var/run/dbus/system_bus_socket,rw,bind,:/run/user/$UID/pulse/native,rw,bind,
    cap_add:
      - SYS_PTRACE # For debugging purposes if needed.
      - NET_ADMIN # Network configuration.
    ports:
      - "5904:xrdp/tcp"
      - "5905:vncserver/xvnc/tcp"
      - "5906:vncserver/websockify/tcp"
    volumes:
      - ./gaming_storage:/storage # Persistent storage for games and apps.

在这个配置中,我们选择了 Windows 7 Ultimate 版本,并开启了音频支持。还暴露了一些设备节点以支持图形加速和其他输入设备。

步骤 2:启动容器

docker-compose up --build --detach gaming_windows_7u && echo "Container started successfully."

这行命令会构建并启动容器。完成后可以通过 VNC 或 RDP 访问这个娱乐中心。

注意事项

  • 确保主机有足够的硬件资源(CPU、GPU、内存)来运行这些容器。
  • 对于生产环境,请考虑安全性措施如防火墙规则、用户权限设置等。
  • 在家庭环境中,定期备份重要数据以防意外丢失。

示例总结

通过上述两个案例可以看到,Docker 提供了一种灵活而强大的方式来管理和部署不同版本的 Windows 环境。无论是企业级的自动化测试还是个人的家庭娱乐中心建设,都可以充分利用 Docker 的特性简化操作流程并提高效率。

本章小结

  • 使用 Docker Compose 文件可以方便地管理多个 Windows 容器实例。
  • 结合 CI/CD 工具可以在代码提交时自动更新测试环境。
  • 单个强大容器可用于搭建综合性的家庭娱乐中心。
  • 注意资源配置和安全设置以满足不同应用场景的需求。

🔗 相关推荐

📦 相关项目