把 Windows 装进 Docker 容器里

news2025/3/13 11:34:05

本篇文章聊聊如何在 Docker 里运行 Windows 操作系统, Windows in Docker Container(WinD)。

写在前面

我日常使用 macOS 和 Ubuntu 来学习和工作,但是时不时会有 Windows 使用的场景,不论是运行某个指定的软件,还是要做一些跨平台软件的功能验证。

在去年开源 soulteary/docker-chatgpt 之前,还折腾过将 Chrome 容器化,提供有界面服务能力容器的事情,如果当时有这个方案,或许折腾过程能更简单一些。

环境准备

我们依旧是先从环境准备开始。想要使用这个方案,我们需要准备的东西有三个:安装了 Docker 的操作系统(我使用 Ubuntu)、Windows 操作系统的安装光盘(从 WinXP ~ Win11 都行)、开源项目 dockur/windows 的 Docker 镜像。

安装 Ubuntu 操作系统和 Docker

这套方案中采用了 KVM 加速,所以体验最好的方案是使用或者安装一个 Linux 环境,如果你本身就在使用 Ubuntu 之类的支持 KVM 非常方便的操作系统的话,那么只需要安装 Docker 就好啦。

如果你确实需要在容器中运行 Windows,想从零开始,可以参考之前的文章《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》的方法来进行实践。安装 Ubuntu 的流程和以往并没有太大不同,依旧是老生常谈的三步曲:下载镜像、制作启动盘、安装系统。

如果你已经有了可以使用的 Linux 环境,可以参考上面文章中的 “更简单的 Docker 安装” 章节,完成基础环境的准备。

完成操作系统和 Docker 的准备后,我们还需要检查操作系统是否支持 KVM,需要先安装 cpu-checker

sudo apt install cpu-checker -y

然后,执行 kvm-ok,顺利的话,将能够看到类似下面的日志输出:

# sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

获取 WIndows 操作系统光盘

虽然开源项目 dockur/windows 会根据用户指令,从 dl.bobpony.comarchive.org,以及微软官网自动下载合适的英文版系统镜像,但如果你想更快的完成系统的安装,或者想快速的启动多个 Windows Docker 容器,那么手动下载 Windows 光盘还是非常有必要的。

开源项目包含了一些自动安装的预设配置,不过,这需要使用英文版的操作系统,你可以从这里下载。

当然,如果你需要使用中文版的操作系统,同样可以从官方下载,在初始化操作系统的时候,相比英文操作系统你需要额外点一些“下一步”。

获取 Windows in Docker 容器镜像

获取在 Docker 中运行 Windows 的容器镜像很简单:

docker pull dockurr/windows

当然,如果不能够直接下载,也可以选择本地构建:

git clone https://github.com/dockur/windows.git
cd windows
docker build -t dockurr/windows .

这个镜像主要依赖了几项技术:

  • qemus/qemu-docker,在容器中使用 QEMU,能够提供接近本机速度的虚拟机的网络、IO 速度等。
  • christgau/wsdd,让容器中的 Windows 能够出现在局域网中的其他设备的共享设备中。(Windows 10 的 1511 版本后,默认开始禁用 SMBv1,NetBIOS 设备发现功能失效,导致其他设备不能对其进行服务发现)。
  • qemus/virtiso,精简到 27MB 的 KVM/QEMU Virtio 驱动程序,能够让 Windows 在 Docker 环境中正常使用。
  • krallin/tini,正确启动 Docker 中 QEMU,以及确保进程异常能够被正确处理,或正确的终止容器进程。

好了,准备工作就绪后,我们就可以开始使用这个有趣的技术方案啦。

基础使用

我们先聊聊最简单的使用方案,启动一个“无状态”的临时的 Windows 操作系统,容器会自动下载我们所需要的镜像:

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

将上面的配置保存为 docker-compose.yml,然后使用 docker compose updocker compose -d 启动服务。

因为我们没有指定本地的镜像,所以如果你的网络环境访问微软 CDN 不够快的话,启动过程需要等待一些时间。

# docker compose up     
[+] Running 2/1
 ✔ Network win_default  Created                                                                                                                                                     0.1s 
 ✔ Container windows    Created                                                                                                                                                     0.1s 
Attaching to windows
windows  | ❯ Starting Windows for Docker v2.04...
windows  | ❯ For support visit https://github.com/dockur/windows
windows  | 
windows  | 
windows  | ❯ Downloading Windows 11...
windows  | [i] Downloading Windows media from official Microsoft servers...
windows  | [i] Downloading Windows 11...
windows  | [+] Got latest ISO download link (valid for 24 hours): https://software.download.prss.microsoft.com/dbazure/Win11_23H2_English_x64v2.iso?t=c603adeb-c6d7-4bb9-b084-875f3beabfc2&P1=1710146067&P2=601&P3=2&P4=ynPQkgNxZoZxQkmfORJRE5yaf94m7ONuLVngMtHmDfsYTooFKSXiAdWXTKJ8dpoF2WuDkUZ4fkP1u%2bhwAh%2brAdghU%2f1ssngioKg2aLDe2UXOG3ESUAGTyRk1q515ONoXIvyJby2xPoKBVoj%2bsNp6ECqosBjx9HllmF3saRvQFPQox6v8kuhtMxyuNiXT%2fYgKppSZOifx34t6YQb0Hpo6gTkLjxlxiFBF42jLt%2blVhf1HW7ELEtvVUW7eAn9UGfs9HF6yC3p1ep7ouKYNrY0Ek0fo%2bn2v%2by3bTGbqg8lHfXjxb6bPHGE6HWP3sSZDZw4JmPt53hr1uQl%2fmjT50p504Q%3
windows  | #=#=#                                                                          
                                                                           windows  | #=#=#                                                                          
                                                                           0.0%
                                                                           0.1%
                                                                           0.2%
                                                                           0.3%
...
#######################################################################   99.7%
#######################################################################   99.8%
#######################################################################  100.0%
######################################################################## 100.0%

windows  | 
windows  | [+] Successfully downloaded Windows image!
windows  | 
windows  | ❯ Extracting Windows 11 image...
windows  | ❯ Adding XML file for automatic installation...
windows  | ❯ Building Windows 11 image...
windows  | ❯ Creating a 64G growable disk image in raw format...
windows  | ❯ Booting Windows using QEMU emulator version 8.2.1 ...
windows  | 
...

当一切就绪后,我们可以使用两个方式来访问这个运行在 Docker 中的 Windows。

第一种方法,是使用浏览器访问容器所在主机的 IP地址:8006

在容器中自动部署的 Windows

容器启动后,会自动下载、部署 Windows,稍等片刻,就能够在浏览器中正常使用它啦:

在浏览器中访问 Windows

第二种方法,是使用支持 RDP 远程访问功能的软件,在软件服务器地址和端口内容中分别填写 IP地址3389,在用户名栏填写 docker,密码保持空白即可。

在 RDP 客户端中访问 Windows

加速使用 Windows 容器

默认情况,每次启动都需要见到它

当然,如果你的网络环境不是那么好,或者你不想每次启动容器都要等待很久,可以使用下面的方法。

让部署使用加速,主要和两个细节有关:是否进行了容器内容的持久化,是否提供了高性能的安装镜像下载方式。

比如,我们在上面的准备工作中,我们预先下载好 Windows 的安装镜像,然后将文件重命名为 win11x64.iso,接着将文件放置在目录的 ./iso 子目录中。那么,借助 Nginx,可以让整个安装部署过程变的飞快。

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
    environment:
      VERSION: "http://winiso/win11x64.iso"
      MANUAL: "N"
    volumes:
      - ./win:/storage
    depends_on:
      - winiso


  winiso:
    image: nginx:alpine
    container_name: winiso
    restart: on-failure
    volumes:
     - ./iso:/usr/share/nginx/html

在上面的配置中,我们增加了一个用来将本地的 Windows 安装文件转换为 dockurr/windows 快速可安装的在线地址的容器。

将配置文件保存为 docker-compose.yml,然后使用 docker compose up 或者 docker compose up -d 启动配置,我们将看到类似下面的日志:

windows  | .
windows  | .
winiso   | 172.20.2.3 - - [11/Mar/2024:03:54:47 +0000] "GET /win11x64.iso HTTP/1.1" 200 6813366272 "-" "Wget/1.21.4" "-"
windows  | . 99% 1.59G 0s
windows  | 
windows  | 6651904K .
windows  |                           
windows  |         100% 1.95G
windows  | =3.7s
windows  | 
windows  | 
windows  | ❯ Extracting downloaded ISO image...
windows  | ❯ Detecting Windows version from ISO image...
windows  | ❯ Detected: Windows 11
windows  | ❯ Adding XML file for automatic installation...
windows  | ❯ Building Windows 11 image...
windows  | ❯ Creating a 64G growable disk image in raw format...
windows  | ❯ Booting Windows using QEMU emulator version 8.2.1 ...

下载镜像的速度马上从几MB、几十MB增加到了接近每秒 2GB,不到 4s 就能完成镜像的下载和处理。

因为在配置中增加了 volumes 卷的持久化(- ./win:/storage),所以我们可以放心的停止或者重新启动容器,而不必担心每次都要重新初始化“一台”新的 Windows Docker 容器。

使用技巧

聊聊其他的使用技巧。

更换 Windows 版本(不提前准备镜像)

如果你的网络环境非常棒,不需要提前下载安装镜像,或者直接使用云主机进行项目部署,那么可以考虑直接调整配置文件中的内容为合适的数值:

environment:
  VERSION: "win11"

支持我们调整使用的值包含:win11win10ltsc10win81win7vistawinxp20222019201620122008

调整 Windows 容器资源配置

默认情况下,这个 Windows 容器会使用 vCPU x2、4GB 内存、64G 的磁盘空间,来满足 Win11 的最低安装需求。我们可以根据自己的实际需求,来动态的调整容器的硬件资源限制。

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

比如,在上面的配置中,我们调整 CPU 核心数到 4,内存到 8GB,磁盘到 256GB。

为容器分配独立的 IP 地址

默认情况下,Docker 会共享宿主机的 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

创建完网卡后,调整上面使用的容器配置,根据自己的需求指定容器 IP 即可:

services:
  windows:
    container_name: windows
    ..<snip>..
    networks:
      vlan:
        ipv4_address: 192.168.0.100

networks:
  vlan:
    external: true

使用一整块磁盘

如果你的主机上有多块磁盘,或者想将某一块磁盘完整的分配给 Windows,可以采用下面的方法,其中 DEVICE 将作为你的主磁盘:

environment:
  DEVICE: "/dev/sda"
  DEVICE2: "/dev/sdb"
devices:
  - /dev/sda
  - /dev/sdb

在 Docker 中的 Windows 使用 USB 设备

我们首先需要使用 lsusb 来获取 USB 设备的 VendorIDProductID ,然后将这些信息添加到配置中:

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

最后

本篇文章先聊到这里,下一篇文章见。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年03月11日
统计字数: 7281字
阅读时间: 15分钟阅读
本文链接: https://soulteary.com/2024/03/11/install-windows-into-a-docker-container.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1518768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

Fix a Tree(树的遍历,判断是否有环 并连成一颗树 )

题意翻译 对于下图中的树&#xff0c; 可以用数组表示为 [2,3,3,2]。这种可以表示树的数组&#xff08;即有效&#xff09;需要符合以下条件&#xff1a; 有且只有一个索引 r &#xff0c;符合pr​r 。其中顶点 r 是树的根。对于所有剩下的 n−1 个顶点 i 一定要有在 i 和 pi…

怎么制作自己的微信小程序店铺?

移动互联网的迅猛发展&#xff0c;微信小程序已成为商家拓展线上业务的重要工具。它不仅能够提供便捷的用户访问体验&#xff0c;还能够帮助商家快速构建起一个功能齐全的在线商城。那么&#xff0c;商家怎么制作自己的微信小程序店铺&#xff1f; 一、准备工作&#xff1a; …

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…

MWC 2024|「Paraverse平行云」展示空间计算时代沉浸式交互体验

&#x1f389;当地时间2月26日&#xff0c;2024年世界移动通信大会&#xff08;MWC2024&#xff09;在巴塞罗那拉开帷幕。作为全球移动通信领域最大的技术展会之一&#xff0c;MWC被视为全球通信行业风向标。 &#x1f680;随着Vision Pro再次点燃全球空间计算技术热情&#xf…

电脑文件msvcr100.dll丢失的多种解决方法,快速修复dll报错问题

当计算机用户遇到“msvcr100.dll丢失”的问题时&#xff0c;可能会感到困扰并急于寻求解决方案。这个提示通常意味着系统中某个关键的动态链接库文件缺失&#xff0c;这可能导致某些应用程序无法正常启动或运行。msvcr100.dll是Microsoft Visual C Redistributable Package的一…

HarmonyOS应用开发-Stage模型开发概述

基本概念 UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。提供了应用UI开发所必需的能力&#xff1a;多种组件、布局计算、动画能力、UI交互、绘制。 方舟开发框架针对开发者提供了两种开发范式&#xff1a; 基于ArkTS…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

【机器学习】无监督学习算法之:层次聚类

层次聚类 1、引言2、层次聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 这周末过的滋润啊。 小鱼&#xff1a;… 每个周末都挺滋润的啊。 小屌丝&#xff1a;啊~ ~ 你这… 小鱼&#xff1a;周末加班&#xf…

从大厂到高校,鸿蒙人才“红透半边天”!

截至目前&#xff0c;继清华大学、北京航空航天大学、武汉大学等985高校开设鸿蒙相关课程后&#xff0c;已经或将要开设鸿蒙相关课程的985、211高校达到近百所&#xff0c;为鸿蒙人才培养提供沃土。 随着鸿蒙系统即将摒弃安卓&#xff0c;鸿蒙原生应用将全面启动的背景下&…

win10从Huggingface下载模型

这里写自定义目录标题 安装CLI工具设置环境变量下载 安装CLI工具 安装Huggingface CLI pip install -U huggingface_hub设置环境变量 设置好变量后&#xff0c;重新启动一个新的命令窗口&#xff0c;cmd或者powershell 下载 huggingface-cli download --resume-download fa…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的安全帽检测系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发先进的安全帽识别系统对提升工作场所的安全性至关重要。本文详细介绍了使用深度学习技术创建此类系统的方法&#xff0c;并分享了完整的实现代码。系统采用了强大的YOLOv8算法&#xff0c;并对其与YOLOv7、YOLOv6、YOLOv5的性能进行了详细比较&#xff0c;…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏…

pytorch(十)循环神经网络

文章目录 卷积神经网络与循环神经网络的区别RNN cell结构构造RNN例子 seq2seq 卷积神经网络与循环神经网络的区别 卷积神经网络&#xff1a;在卷积神经网络中&#xff0c;全连接层的参数占比是最多的。 卷积神经网络主要用语处理图像、语音等空间数据&#xff0c;它的特点是局部…

【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值

作者推荐 视频算法专题 本文涉及知识点 分类讨论 解析几何 LeetCode1330. 翻转子数组得到最大的数组值 给你一个整数数组 nums 。「数组值」定义为所有满足 0 < i < nums.length-1 的 |nums[i]-nums[i1]| 的和。 你可以选择给定数组的任意子数组&#xff0c;并将该子…

3月15日ACwing每日一题

789. 数的范围 - AcWing题库 #include <bits/stdc.h> using namespace std; int n,q; const int N100007; int a[N]; void solve(){//lower_bound是大于等于 upper_bound是大于int num;cin>>num;if(lower_bound(a,an,num)!an&&*lower_bound(a,an,num)num)…

fs模块 之 文件读取

fs 文件读取&#xff1a; 利用文件读取而不是直接打开文本查看的目的是为了实现自动化 读取文件的应用场景:电脑开机/程序运行/播放视频音乐/上传文件... 一、异步读取 &#xff08;1&#xff09;语法&#xff1a;fs.readFile(path,[options],callback); 以之前写的文件写…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…

红队笔记7--Web机器为Linuxdocker逃逸

其实&#xff0c;不知道大家有没有想过&#xff0c;我们之前练习的都是web机器是windows的版本&#xff0c;但是其实&#xff0c;在现实生活中&#xff0c;服务器一般都是Linux的版本&#xff0c;根本不可能用到windows的版本 那么如果是Linux的话&#xff0c;我们就有很多的困…

express+mysql+vue,从零搭建一个商城管理系统14--快递查询(对接快递鸟)

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、安装md5&#xff0c;axios&#xff0c;qs二、新建config/logistics.js三、修改routes/order.js四、添加商品到购物车总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 快递鸟…