# Windows 部署：制品、DSC 与容器边界

> 发布不可变制品，用 PowerShell DSC 或流水线管配置，并分清 Windows 容器何时省事、何时添乱。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

三层：

1. **制品** — 带版本的构建（zip/msi/镜像），不可变。
2. **配置** — DSC/流水线，不在服务器上手改。
3. **发布** — 交换/暂存、健康检查、回滚。

还在 RDP 拷文件，就答不出“现在跑的是什么”。

## 制品

- 构建一次，同一字节部署到每个节点。
- 版本化（`app-2026.10.29-1`），保留校验和。
- 包含 `web.config`、迁移、静态资源。
- 保留最近 N 个制品回滚。

## 配置

PowerShell DSC 可强制 IIS 站点/池状态：

```powershell
Configuration WebTier {
  Import-DscResource -ModuleName PSDesiredStateConfiguration, WebAdministration
  Node 'localhost' {
    WindowsFeature IIS { Name = 'Web-Server'; Ensure = 'Present' }
    WebAppPool AppPool {
      Name = 'apppool'; Ensure = 'Present'
      managedRuntimeVersion = ''
    }
    WebSite Site {
      Name = 'app'; PhysicalPath = 'C:\sites\app'
      ApplicationPool = 'apppool'; State = 'Started'
      Ensure = 'Present'
    }
  }
}
```

DSC 需要 WebAdministration DSC 资源（或 `xWebAdministration`）和 pull/apply 方案。不是一行命令。

## 发布

- 部署到 staging 槽/目录；预热。
- 切站点根或绑定；保留旧目录。
- 健康检查 `/readyz`；失败回滚。
- 低峰发布；看 5xx/延迟。

## 容器

Windows 容器适合：

- 应用自包含且兼容 Windows；
- 需要 dev/prod 一致；
- 已有容器编排。

添乱的情况：

- 应用依赖宿主 IIS 模块/COM/注册表；
- 基础镜像大小/版本不匹配（Server 2022 vs 2025）；
- 没有 registry/补丁流水线。

> **警告: 容器不消除补丁**
>
> Windows 容器仍需打补丁的基础镜像、重建应用镜像和 registry。VM 都补不了，镜像也补不了。

## 验证

```powershell
(Get-Item C:\sites\app\app.dll).VersionInfo.FileVersion
Get-WebSite app | Select-Object Name,PhysicalPath,State
```

部署版本与制品一致，站点根指向你以为的位置。

## 实验室边界

E1。实验室手工部署（IIS 站点、Nginx zip、PHP zip），没有 DSC 或容器。流水线是 Server 2025 的生产方法。

## 来源

- [Microsoft Learn — PowerShell DSC](https://learn.microsoft.com/zh-cn/powershell/dsc/overview)
- [Microsoft Learn — Windows 容器](https://learn.microsoft.com/zh-cn/virtualization/windowscontainers/about/)
- [Microsoft Learn — Web Deploy](https://learn.microsoft.com/zh-cn/iis/publish/using-web-deploy/introduction-to-web-deploy)

---

来源页面: https://winbook.fyi/zh/server/ops/deploy/
