PowerShell 是批量创建和管理 Windows 容器最直接、可脚本化的方式,需先启用 Containers 和 Hyper-V 功能并重启,再安装 Docker 服务,最后通过循环批量拉取镜像、创建容器、统一监控与清理。PowerShell 是批量创建和管理 Windows 容器最直接、可脚本化的方式。它不依赖图形界面,适合重复部署、CI/CD 或多节点运维场景。关键在于把容器操作转化为可循环、可参数化的命令序列。
准备容器运行环境(一次执行,全机生效)
windows 容器需要底层系统支持,必须先启用对应功能:
- 以管理员身份运行 PowerShell,执行:
Install-WindowsFeature -Name Containers - 如需进程级隔离以外的强隔离(推荐生产),追加:
Install-WindowsFeature -Name Microsoft-Hyper-V-All - 重启生效:
Restart-Computer -Force - 重启后验证:
Get-Service docker, vmms 应显示 Running;
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V 状态为 Enabled
安装 Docker 引擎并设为服务(无需手动安装包)
PowerShell 可直接下载、解压、注册 Docker 服务:
- 下载稳定版(示例为 26.1.4,建议替换为最新版链接):
Invoke-WebRequest -Uri "https://download.docker.com/win/static/stable/x86_64/docker-26.1.4.zip" -OutFile "$env:TEMP\docker.zip" - 解压到标准路径:
Expand-Archive "$env:TEMP\docker.zip" -DestinationPath "$env:ProgramFiles\Docker" - 注册并启动服务:
"$env:ProgramFiles\Docker\dockerd.exe" --register-service
Set-Service docker -StartupType Automatic; Start-Service docker - 验证:
docker version 查看服务端版本;
docker info | Select-String "Isolation" 确认默认隔离模式
批量拉取镜像 + 创建容器(用循环或配置驱动)
避免逐条敲命令,用数组或 CSV 驱动批量操作:
- 定义容器配置列表(例如多个 IIS 实例):
$containers = @(@{Name="web01"; Image="mcr.microsoft.com/windows/servercore/iis:ltsc2022"; Port=8081}, @{Name="web02"; Image="mcr.microsoft.com/windows/servercore/iis:ltsc2022"; Port=8082}) - 批量拉取镜像(去重后执行):
$images = $containers.Image | Sort-Object -Unique
foreach ($img in $images) { docker pull $img } - 批量创建并运行容器:
foreach ($c in $containers) {
& docker run -d --name $c.Name -p "$($c.Port):80" --isolation=hyperv $c.Image
} - 附加网络更稳妥(提前建好 NAT 网络):
docker network create -d nat --subnet=172.29.0.0/16 win-containers
再在 run 命令中加 --network win-containers
统一监控与清理(按条件批量操作)
用 PowerShell 解析 JSON 输出,实现精准批量控制:
- 查出所有以 "web" 开头的运行中容器 ID:
docker ps --filter "name=^web" --format "{{.ID}}" | ForEach-Object { $_ } - 批量停止并删除:
docker ps -q --filter "name=^web" | ForEach-Object { docker stop $_; docker rm $_ } - 批量查看日志(带时间戳):
docker ps --filter "name=^web" --format "{{.Names}}" | ForEach-Object { Write-Host "`n=== Logs for $_ ==="; docker logs $_ --since "30m" } - 导出容器 IP 到 CSV:
docker ps --format "{{.Names}}|{{.NetworkSettings.Networks.nat.IPAddress}}" | ConvertFrom-Csv -Delimiter "|" -Header Name,IP | Export-Csv .\container-ips.csv -NoTypeInformation











