

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Windows 应用程序移到容器
<a name="windows-containers-main"></a>

## 概述
<a name="windows-containers-overview"></a>

根据 [CNCF Annual Survey 2021](https://www.cncf.io/reports/cncf-annual-survey-2021/)，96% 的组织正在使用或评估容器来实现基础设施的现代化。这是因为容器可以帮助您的组织降低风险，提高运营效率和速度，并实现敏捷性。您还可以使用容器来降低应用程序的运行成本。本节为跨 AWS 容器服务（包括[亚马逊弹性容器服务 (Amazon ECS)、Amazon Elastic Kubernetes Service（](https://aws.amazon.com/ecs/)[Amazon EK](https://aws.amazon.com/eks/) S）和。[AWS Fargate](https://aws.amazon.com/fargate/)

## 成本优势
<a name="windows-containers-cost-benefits"></a>

以下信息图显示了企业根据[优化和许可评估AWS (OLA) 建议，将其 ASP.NET Framework 应用程序整合到亚马逊弹性计算云 (Amazon EC2)AWS 实例](https://aws.amazon.com/optimization-and-licensing-assessment/)上可以节省的成本。以下信息图显示了通过将应用程序移到 Windows 容器可以节省的额外费用。



![\[ASP.NET 合并\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/asp_net_consolidation.png)


 AWS OLA 建议企业进行提升，转向单个 t3.small 实例。如以下性能利用率分析所示，该企业可以通过在本地服务器上运行七个 ASP.NET 应用程序来实现这些节省。



![\[性能利用率分析\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/optimize-costs-microsoft-workloads/images/perform_util_analysis-partA.png)


进一步分析表明，通过在容器上运行工作负载，该企业可以节省更多成本。容器可减少操作系统对系统资源（如 CPU、RAM 和磁盘使用量）的开销（在下一节中介绍）。在这种情况下，企业可以将所有七个应用程序整合到一个 t3.large 实例，但仍有 3 GB 的备用 RAM。通过使用容器代替 Amazon EC2，迁移到容器可以帮助企业在计算和存储方面平均节省 64% 的成本。

## 成本优化建议
<a name="windows-containers-rec"></a>

以下部分提供了通过整合应用程序和使用容器来优化成本的建议。

### 减少 Windows on Amazon EC2 占用空间
<a name="windows-containers-ec2-footprint"></a>

Windows 容器允许您将更多的应用程序整合到更少的 EC2 实例上，从而减少您的 Windows on Amazon EC2 占用空间。例如，假定您有 500 个 ASP.NET 应用程序。如果每个 Windows on Amazon EC2 应用程序运行一个核心，则等于 500 个 Windows 实例 (t3.small)。如果假设使用 Windows 容器（采用 t3.large）的比例为 1:7（根据 EC2 实例类型/大小，该比例可能会大幅增加），那么您只需要大约 71 个 Windows 实例。这意味着您的 Windows on Amazon EC2 占用空间减少了 85.8%。

### 降低 Windows 许可成本
<a name="windows-containers-licensing-costs"></a>

如果您许可 Windows 实例，则无需许可在该实例上运行的容器。因此，使用 Windows 容器整合 ASP.NET 应用程序可以显著降低 Windows 许可成本。

### 减少存储占用空间
<a name="windows-containers-storage-footprint"></a>

每次启动新的 EC2 实例时，都需要创建一个新的 Amazon Elastic Block Store（Amazon EBS）卷并支付相应的费用来存放操作系统。随着规模的扩展，成本也会随之增加。如果您使用容器，则可以降低存储成本，因为所有容器都共享相同的基本操作系统。此外，容器使用层的概念，将容器映像的不可变部分重复用于所有基于该映像的正在运行的容器。在上述示例方案中，所有容器都运行 .NET Framework，因此所有容器都共享中间且不可变的 ASP.NET 框架层。

### 将 end-of-support服务器迁移到容器
<a name="windows-containers-end-support"></a>

对 Windows Server 2012 和 Windows Server 2012 R2 的支持已于 2023 年 10 月 10 日结束。您可以迁移在 Windows Server 2012 或之前版本上运行的应用程序，方法是将它们容器化为在新操作系统上运行。这样，您就可以避免在不合规的操作系统上运行应用程序，同时利用容器提供的成本效益、更低的风险、运营效率、速度及敏捷性。

使用这种方法需要考虑的一个警告是，您的应用程序是否需要与当前使用的操作系统版本 APIs 相关的特定内容（例如 COM Interop）。在这种情况下，您必须测试将应用程序迁移到较新的 Windows 版本。Windows 容器会将基本容器映像（例如 Windows Server 2019）与容器主机的操作系统（例如 Windows Server 2019）保持一致。通过更改 Dockerfile 内的基础映像并部署到一组运行最新版本的 Windows 的新主机，测试和迁移到容器可以让将来更轻松地升级操作系统。

### 删除第三方管理工具和许可证
<a name="windows-containers-third-party"></a>

管理服务器机群需要使用多种第三方系统操作工具进行修补和配置管理。这些都会使基础设施管理变得复杂，而且您通常还会产生第三方许可成本。如果您在上使用容器 AWS，则无需在操作系统方面管理任何内容。容器运行时管理容器。这意味着底层主机是临时的，可以很容易地被替换。无需直接管理容器主机即可运行容器。此外，您还可以使用免费工具 AWS Systems Manager Session Manager ，例如轻松访问主机和解决问题。

### 改进控制和可移植性
<a name="windows-containers-control-portability"></a>

与对 EC2 实例相比，容器可让您更精细地控制服务器资源（如 CPU 和 RAM）。对于 EC2 实例，您可以通过选择实例系列、实例类型和 [CPU 选项](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html)来控制 CPU 和 RAM。但是，使用容器，您可以精确定义要分配给 ECS 任务定义中的容器或分配给 [Amazon EKS 中的容器组（pod）](https://docs.aws.amazon.com/eks/latest/userguide/fargate-pod-configuration.html)的 CPU 或 RAM 数量。实际上，我们建议为 Windows 容器[指定容器级 CPU 和内存](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows_task_definitions.html)。此粒度级别带来了成本效益。请考虑以下示例代码：

```
json
{
    "taskDefinitionArn": "arn:aws:ecs:us-east-1:123456789012:task-definition/demo-service:1",
    "containerDefinitions": [
        {
            "name": "demo-service",
            "image": "mcr.microsoft.com/dotnet/framework/samples:aspnetapp-windowsservercore-ltsc2019",
            "cpu": 512,
            "memory": 512,
            "links": [],
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 0,
                    "protocol": "tcp"
                }
            ],
```

### 加速创新
<a name="windows-containers-innovation"></a>

迁移到容器可以更轻松地实现开发生命周期各个阶段的自动化，包括构建、测试及部署应用程序。如果将这些流程自动化，就能让开发和运营团队有更多时间专注于创新。

### 降低 TCO
<a name="windows-containers-tco"></a>

迁移到容器通常可以减少对许可证管理和端点保护工具的依赖。由于容器是临时计算单元，因此您可以自动化和简化诸如修补、扩展以及备份和恢复之类的管理任务。这可以降低管理和操作基于容器的工作负载的 TCO。与虚拟机相比，容器效率更高，因为它们可以最大限度地部署应用程序，从而提高应用程序基础设施资源的利用率。

### 缩小技能差距
<a name="windows-containers-skills-gap"></a>

AWS 提供项目和沉浸式学习日，以提高客户开发团队在容器和技术 DevOps 方面的技能。其中包括动手实践咨询和支持。

### 重构到 .NET 5\$1 并使用 Linux 容器
<a name="windows-containers-refactor-net"></a>

虽然您可以通过将 .NET Framework 应用程序迁移到容器来降低成本，但如果在 AWS上将遗留 .NET 应用程序重构为云原生替代方案，则可以进一步节省成本。

### 消除许可成本
<a name="windows-containers-licensing-costs"></a>

将您的应用程序从 Windows 上的.NET Framework 重构为 Linux 上的.NET Core 可节省大约 45% 的成本。

### 访问最新的增强功能
<a name="windows-containers-enhancements"></a>

将应用程序从 Windows 上的.NET Framework 重构为 Linux 上的.NET Core 可让您访问最新的增强功能，例如 Graviton2。Graviton2 的性能比同类实例性价比高出 40%。

### 提高了安全性和性能
<a name="windows-containers-security-performance"></a>

将应用程序从 Windows 上的 .NET Framework 重构为 Linux 容器上的 .NET Core 可提高安全性和性能。这是因为您可以获得最新的安全补丁，受益于容器隔离，且可以访问新功能。

### 使用 Windows 容器，而不是在一个 IIS 的实例上运行多个应用程序
<a name="windows-containers-iis"></a>

请考虑使用 Windows 容器而不是使用互联网信息服务（IIS）在一个 EC2 Windows 实例上运行多个应用程序具有以下优点：
+ **安全性**：容器提供了开箱即用的安全级别，这是通过 IIS 级别的隔离无法实现的。如果一个 IIS 网站或应用程序遭入侵，则所有其他托管式网站都将暴露且易受攻击。容器逃逸的情况很少见，且比通过 Web 漏洞控制服务器更难被利用。
+ **灵活性**：能够在进程隔离的情况下运行容器并拥有自己的实例，从而可以提供更精细的联网选项。容器还提供跨许多 EC2 实例的复杂分发方法。将应用程序整合到单个 IIS 实例上时，您将无法获得这些好处。
+ **管理开销**：服务器名称指示（SNI）会产生需要管理和自动化的开销。此外，您还必须努力处理典型的操作系统管理操作，例如修补、BSOD 问题排查（如果没有自动扩缩）、端点保护等。根据[安全最佳实践](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/jj635855(v=ws.11))配置 IIS 站点是一项耗时且持续的工作。您甚至可能需要设置[信任级别](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh831532(v=ws.11))，这也会增加管理开销。容器的设计目标是无状态且不可变。最终，如果您改用 Windows 容器，您的部署将更快、更安全、更可重复。

## 后续步骤
<a name="windows-containers-next-steps"></a>

投资现代基础架构来运行您的传统工作负载可为您的组织带来巨大好处。 AWS 容器服务使您可以更轻松地管理您的底层基础架构，无论是在本地还是在云中，因此您可以专注于创新和业务需求。 AWS 如今，云端所有容器中有将近80％在运行。 AWS 为几乎所有用例提供了一组丰富的容器服务。要开始使用，请参阅 [AWS上的容器](https://aws.amazon.com/containers/)。

## 其他资源
<a name="windows-containers-resources"></a>
+ [使用 ECS 容量提供商和 EC2 竞价型实例优化容器工作负载](https://aws.amazon.com/blogs/containers/optimize-cost-for-container-workloads-with-ecs-capacity-providers-and-ec2-spot-instances/)的成本（AWS 博客）
+ [Amazon ECS 和 AWS Fargate的成本优化核对清单](https://aws.amazon.com/blogs/containers/cost-optimization-checklist-for-ecs-fargate/)（AWS 博客）
+ [AWS Graviton2 上的 Amazon EKS 现已上市：多架构应用程序的注意事项（博客](https://aws.amazon.com/blogs/containers/eks-on-graviton-generally-available/)）AWS 
+ [Kubernetes 的成本优化（博客） AWS](https://aws.amazon.com/blogs/containers/cost-optimization-for-kubernetes-on-aws/)AWS 
+ 通过 [Karpenter 整合优化你的 Kubernetes 计算成本](https://aws.amazon.com/blogs/containers/optimizing-your-kubernetes-compute-costs-with-karpenter-consolidation/)（博客）AWS 