docker安装windows镜像制作

老刘

Docker安装Windows镜像制作全流程:从环境搭建到自定义镜像打包

很多开发者在本地调试或者做跨平台测试时,会碰到需要在Docker里跑Windows环境的情况。Docker本身更偏向Linux容器,但微软官方已经提供了完整的Windows容器支持,配合Docker Desktop就能直接拉取、制作、运行Windows镜像。下面这份教程从零开始,覆盖安装、基础镜像获取、Dockerfile编写、镜像构建到常见坑点,适合电脑小白一步步跟着做,也给进阶用户留了优化参数。

先搞清楚能做什么、不能做什么

Windows容器分两类:进程隔离和Hyper-V隔离。普通Win10/Win11家庭版基本用不了,至少需要专业版、企业版或教育版,并且开启Hyper-V和容器功能。镜像体积普遍比Linux大很多,Server Core动辄几GB,Nano Server小一些但兼容性差。另外,Windows容器只能在Windows主机上跑,Linux主机没法直接用官方Windows镜像,除非走虚拟机套娃那条路(后面会简单提)。

目标很明确:装好支持Windows容器的Docker,拉官方基础镜像,再用Dockerfile把你需要的软件、配置打进去,最后得到一个可复用的自定义Windows镜像。

第一步:准备主机环境并安装Docker

1. 检查系统版本和硬件

  • 系统必须是Windows 10 1809及以上,或Windows 11,推荐专业版/企业版。
  • 开启虚拟化:进BIOS把Intel VT-x或AMD-V打开。
  • 内存建议16GB起步,硬盘预留至少50GB空闲(镜像太大了)。
  • 打开PowerShell(管理员),执行下面命令确认Hyper-V是否可用:
    Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V

    如果State不是Enabled,执行:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

    重启电脑。

2. 安装Docker Desktop

去Docker官网下载最新Docker Desktop for Windows安装包,一路下一步即可。安装时勾选“Use WSL 2 instead of Hyper-V”(如果系统支持WSL2),但后面做Windows容器时还是要切回Hyper-V模式。

装完后启动Docker Desktop,右下角托盘图标右键,选择“Switch to Windows containers…”。第一次切换会提示重启Docker服务,等它变成“Windows containers”状态就行。可以在命令行验证:

docker version

Client和Server的OS/Arch都显示windows/amd64就说明成功了。

如果提示Hyper-V或容器功能缺失,回到“启用或关闭Windows功能”里把“Hyper-V”“容器”“Windows Hypervisor Platform”全部勾上,再重启。

第二步:拉取官方Windows基础镜像

微软镜像都托管在MCR(Microsoft Container Registry),不要再去Docker Hub乱搜了。常用的有两个:

  • Server Core:兼容性最好,适合装.NET Framework、IIS、传统软件。
  • Nano Server:体积小,但很多老API没有,只适合极简场景。

以Windows Server 2022为例,打开PowerShell执行:

docker pull mcr.microsoft.com/windows/servercore:ltsc2022

ltsc2022是长期支持版本,比较稳定。如果系统是Win11,也可以拉ltsc2022或者对应的windowsservercore标签。拉取过程会比较久,镜像大概4-5GB,耐心等。

验证镜像:

docker images

能看到REPOSITORY为mcr.microsoft.com/windows/servercore的那一行就OK。

想看所有可用标签,可以去微软文档搜“Windows container base images”,里面有完整列表,包括2019、2022、以及带IIS、.NET的现成镜像。

第三步:编写Dockerfile制作自定义镜像

基础镜像只是个干净的Windows,真正有用的是把你自己的程序、依赖、配置加进去。新建一个文件夹,比如D:\docker-win-demo,里面建一个纯文本文件,命名为Dockerfile(没有后缀)。

最简单的示例:安装IIS并放一个测试页面。

# 使用官方Server Core作为基础
FROM mcr.microsoft.com/windows/servercore:ltsc2022

# 安装IIS
RUN powershell -Command \
    Add-WindowsFeature Web-Server; \
    Invoke-WebRequest -Uri https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.10/ServiceMonitor.exe -OutFile C:\ServiceMonitor.exe

# 创建一个简单的默认页面
RUN echo ^<h1^>Hello from Windows Container^</h1^> > C:\inetpub\wwwroot\index.html

# 暴露80端口
EXPOSE 80

# 启动IIS并保持容器运行
ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

解释一下关键点:

  • FROM指定基础镜像,必须和主机Windows版本尽量匹配,不然会报版本不兼容。
  • RUN后面跟PowerShell命令,可以装软件、改注册表、复制文件。多条命令用;连接,最后一行不要分号。
  • EXPOSE只是声明端口,真正映射还得在docker run时用-p
  • ENTRYPOINT保证容器启动后IIS服务一直跑着,否则容器会立刻退出。

如果要装.NET Framework 4.8或者Python、Node之类,直接在RUN里写安装命令就行。例如装Chocolatey再装软件:

RUN powershell -Command \
    Set-ExecutionPolicy Bypass -Scope Process -Force; \
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; \
    iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')); \
    choco install python -y

把需要的文件(比如你的exe、配置文件)放到Dockerfile同目录,然后用COPY指令拷进去:

COPY myapp.exe C:\app\
COPY config.json C:\app\

第四步:构建并运行镜像

在Dockerfile所在目录打开PowerShell,执行构建命令:

docker build -t my-windows-iis:1.0 .

-t后面是镜像名字和标签,最后的.表示当前目录。构建过程会一层层执行Dockerfile里的指令,第一次会比较慢,因为要下载和安装组件。

构建成功后查看:

docker images

能看到my-windows-iis

运行容器:

docker run -d -p 8080:80 --name win-iis-test my-windows-iis:1.0

-d后台运行,-p 8080:80把容器80端口映射到主机8080。浏览器打开http://localhost:8080,如果看到刚才写的Hello页面,就说明镜像制作成功。

查看日志和进入容器调试:

docker logs win-iis-test
docker exec -it win-iis-test powershell

进去后可以随意执行命令检查环境。

进阶优化和常见坑

镜像体积优化

Windows镜像天生臃肿,能做的优化有限:

  • 优先用Nano Server(mcr.microsoft.com/windows/nanoserver:ltsc2022),但很多软件装不上。
  • 把多个RUN合并成一条,减少层数。
  • 构建完用docker history看哪一层最大,针对性精简。
  • 不用的缓存清理:docker builder prune

版本匹配问题

最常见的报错是“The container operating system does not match the host operating system”。解决办法:

  • 主机是Win10 21H2,就拉ltsc2019或对应半年度通道镜像。
  • 主机是Win11或Server 2022,用ltsc2022
  • 实在不行,用--isolation=hyperv强制Hyper-V隔离:
    docker run -d --isolation=hyperv -p 8080:80 my-windows-iis:1.0

网络和权限

Windows容器默认用NAT网络,有时访问外网慢,可以指定DNS:

docker run -d --dns 8.8.8.8 ...

如果要挂载主机目录,注意路径格式用C:\host\path:C:\container\path,并且主机目录权限要够。

许可和商业使用

微软Windows容器镜像可以免费用于开发和测试,但生产环境需要合法的Windows Server许可证。个人学习完全没问题,公司项目上线前确认授权。

在Linux主机上跑Windows?

官方不支持。变通方案是用QEMU模拟,或者直接上Windows虚拟机再在里面装Docker,性能损耗大,只适合临时验证。真正生产还是建议Windows主机或Azure上的Windows容器实例。

完整实战小案例:制作带.NET的Web应用镜像

假设你有一个简单的ASP.NET应用发布目录publish,Dockerfile可以这样写:

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2022
WORKDIR /inetpub/wwwroot
COPY publish/ .
EXPOSE 80

构建、运行后,应用就直接在容器里跑起来了,省去每次装IIS和运行时的麻烦。

通过以上步骤,你已经掌握了Docker安装Windows镜像并制作自定义镜像的完整链路。从环境检查、基础镜像拉取、Dockerfile编写到构建运行,每一步都可以直接复制命令执行。后续如果要做多阶段构建、CI/CD自动打包,或者对接Kubernetes的Windows节点,都可以在这个基础上继续扩展。记住先保证主机版本和镜像标签匹配,再慢慢往里面加业务逻辑,成功率会高很多。

文章版权声明:文章内容均来源于各大短视频平台搜集以及修改和删减新增,如有侵权或者违规,请联系站长进行删除,如需转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,1人围观)

还没有评论,来说两句吧...

目录[+]