

# EC2 的 Amazon ECS 任务联网选项
<a name="task-networking"></a>

Amazon EC2 实例上托管的 Amazon ECS 任务的联网行为取决于任务定义中所定义的*网络模式*。我们建议您使用 `awsvpc` 网络模式，除非您特别需要使用其他网络模式。

以下是可用的网络模式。


| 网络模式 | EC2 上的 Linux 容器 | EC2 上的 Windows 容器 | Description | 
| --- | --- | --- | --- | 
|  `awsvpc`  |  支持  |  是  |  向任务分配其自己的弹性网络接口（ENI）和主要私有 IPv4 或 IPv6 地址。这将为任务提供与 Amazon EC2 实例相同的网络属性。  | 
|  `bridge`  |  是  |  否  |  任务使用 Linux 上的 Docker 内置虚拟网络，该网络在托管任务的每个 Amazon EC2 实例内运行。Linux 上的内置虚拟网络使用 `bridge` Docker 网络驱动程序。如果未在任务定义中指定网络模式，则这是 Linux 上的默认网络模式。  | 
|  `host`  |  是  |  否  |  任务通过直接映射容器端口到托管任务的 Amazon EC2 实例的 ENI，使用会绕过 Docker 内置虚拟网络的主机网络。动态端口映射不可在此网络模式中使用。使用此模式的任务定义中的容器必须指定具体的 `hostPort` 号。主机上的端口号不可被用于多个任务。因此，您不可以在单个 Amazon EC2 实例上运行相同任务定义的多个任务。  | 
|  `none`  |  是  |  否  |  任务没有外部网络连接。  | 
|  `default`  |  否  |  是  |  任务使用 Windows 上的 Docker 内置虚拟网络，该网络在托管任务的每个 Amazon EC2 实例内运行。Windows 上的内置虚拟网络使用 `nat` Docker 网络驱动程序。如果未在任务定义中指定网络模式，则这是 Windows 上的默认网络模式。  | 

有关 Linux 上的 Docker 联网的更多信息，请参阅 *Docker 文档*中的[联网概述](https://docs.docker.com/engine/network/)。

有关 Windows 上的 Docker 联网的更多信息，请参阅 Microsoft *Windows 上的容器文档*中的 [Windows 容器联网](https://learn.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture)。

## 在仅 IPv6 模式下使用 VPC
<a name="networking-ipv6-only"></a>

在仅 IPv6 配置中，Amazon ECS 任务仅通过 IPv6 进行通信。要为仅 IPv6 配置设置 VPC 和子网，您必须向 VPC 添加 IPv6 CIDR 数据块，并创建仅包含 IPv6 CIDR 数据块的新子网。有关更多信息，请参阅《Amazon VPC 用户指南》**中的[为 VPC 添加 IPv6 支持](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html)和[创建子网](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。

您还必须使用 IPv6 目标更新路由表，并为安全组配置 IPv6 规则。有关更多信息，请参阅《Amazon VPC 用户指南》**中的[配置路由表](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html)和[配置安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

请注意以下事项：
+ 您可以通过直接更新服务以使用仅 IPv6 子网，或者创建仅 IPv6 并行服务并使用 Amazon ECS 蓝绿部署将流量转移到新服务，来将仅 IPv4 或双堆栈 Amazon ECS 服务更新为仅 IPv6 配置。有关 Amazon ECS 蓝绿部署的更多信息，请参阅[Amazon ECS 蓝/绿部署](deployment-type-blue-green.md)。
+ 仅 IPv6 Amazon ECS 服务必须使用带有 IPv6 目标组的双堆栈负载均衡器。如果您要迁移位于应用程序负载均衡器或网络负载均衡器后面的现有 Amazon ECS 服务，则可以创建新的双堆栈负载均衡器并转移来自旧负载均衡器的流量，或者更新现有负载均衡器的 IP 地址类型。

  有关网络负载均衡器的更多信息，请参阅《网络负载均衡器用户指南》**中的[创建网络负载均衡器](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html)和[更新网络负载均衡器的 IP 地址类型](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-ip-address-type.html)。有关应用程序负载均衡器的更多信息，请参阅《应用程序负载均衡器用户指南》**中的[创建应用程序负载均衡器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html)和[更新应用程序负载均衡器的 IP 地址类型](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-ip-address-type.html)。
+ Windows 不支持仅 IPv6 配置。您必须使用经 Amazon ECS 优化的 Linux AMI 才能在仅 IPv6 配置中运行任务。有关经 Amazon ECS 优化的 Linux AMI 的更多信息，请参阅[经 Amazon ECS 优化的 Linux AMI](ecs-optimized_AMI.md)。
+ 当您启动一个容器实例来在仅 IPv6 配置中运行任务时，必须使用 `--enable-primary-ipv6` EC2 参数为该实例设置主 IPv6 地址。
**注意**  
如果没有主 IPv6 地址，则以主机或桥接网络模式在容器实例上运行的任务将无法向负载均衡器或 AWS Cloud Map 注册。

  有关运行 Amazon EC2 实例的 `--enable-primary-ipv6` 的更多信息，请参阅《AWS CLI 命令参考》**中的 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)。

  有关使用AWS 管理控制台启动容器实例的更多信息，请参阅 [启动 Amazon ECS Linux 容器实例](launch_container_instance.md)。
+ 默认情况下，Amazon ECS 容器代理会通过查看实例的默认 IPv4 和 IPv6 路由来尝试检测容器实例是否与仅 IPv6 配置兼容。要覆盖此行为，您可以在实例的 `/etc/ecs/ecs.config` 文件中将 ` ECS_INSTANCE_IP_COMPATIBILITY` 参数设置为 `ipv4` 或 `ipv6`。
+ 任务必须使用 `1.99.1` 或更高版本的容器代理。有关如何检查您的实例正在使用的代理版本以及根据需要进行更新的信息，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。
+ 对于仅 IPv6 配置中的 Amazon ECS 任务，如果要与仅 IPv4 端点通信，您可以设置 DNS64 和 NAT64，以将网络地址从 IPv6 转换为 IPv4。有关更多信息，请参阅 *Amazon VPC 用户指南*中的 [DNS64 和 NAT64](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-nat64-dns64.html)。
+ 在仅 IPv6 配置中，Amazon ECS 工作负载在从 Amazon ECR 拉取映像时必须使用 Amazon ECR 双堆栈映像 URI 端点。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》**中的[通过 IPv6 发出请求入门](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
**注意**  
Amazon ECR 不支持仅 IPv6 配置中的任务可使用的双堆栈接口 VPC 端点。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》**中的[通过 IPv6 发出请求入门](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
+ 仅 IPv6 配置不支持 Amazon ECS Exec。

### 支持 Amazon ECS 仅 IPv6 模式的 AWS 区域
<a name="networking-ipv6-only-regions"></a>

在 Amazon ECS 可用的以下 AWS 区域，您可以在仅 IPv6 配置中运行任务：
+ 美国东部（俄亥俄州）
+ 美国东部（弗吉尼亚州北部）
+ 美国西部（北加利福尼亚）
+ 美国西部（俄勒冈州）
+ 非洲（开普敦）
+ 亚太地区（香港）
+ 亚太地区（海得拉巴）
+ 亚太地区（雅加达）
+ 亚太地区（墨尔本）
+ 亚太地区（孟买）
+ 亚太地区（大阪）
+ 亚太地区（首尔）
+ 亚太地区（新加坡）
+ 亚太地区（悉尼）
+ 亚太地区（东京）
+ 加拿大（中部）
+ 加拿大西部（卡尔加里）
+ 中国（北京）
+ 中国（宁夏）
+ 欧洲地区（法兰克福）
+ 欧洲地区（伦敦）
+ 欧洲地区（米兰）
+ 欧洲地区（巴黎）
+ 欧洲（西班牙）
+ 以色列（特拉维夫）
+ 中东（巴林）
+ 中东（阿联酋）：
+ 南美洲（圣保罗）
+ AWS GovCloud（美国东部）
+ AWS GovCloud（美国西部）

# 为 Amazon ECS 任务分配网络接口
<a name="task-networking-awsvpc"></a>

`awsvpc` 网络模式提供的任务联网功能使 Amazon ECS 任务具有与 Amazon EC2 实例相同的联网属性。使用 `awsvpc` 网络模式可简化容器联网，因为您可以更好地控制您的应用程序相互之间以及与 VPC 内其他服务之间的通信方式。`awsvpc` 网络模式还为您的容器提供了更高的安全性，使您能够在任务中更精细地使用安全组和网络监视工具。您也可以利用其他 Amazon EC2 联网功能（例如 VPC 流日志），以便监控来往于您的任务的流量。此外，属于同一任务的容器可以通过 `localhost` 接口进行通信。

任务弹性网络接口（ENI）是 Amazon ECS 的完全托管功能。Amazon ECS 创建 ENI 并将它附加到具有指定安全组的 Amazon EC2 实例。任务在 ENI 上发送和接收网络流量的方式与 Amazon EC2 实例使用其主要网络接口的方式相同。预设情况下，每个任务 ENI 都会分配一个专用 IPv4 地址。如果您的 VPC 启用了双堆栈模式，并且您使用带有 IPv6 CIDR 数据块的子网，则任务 ENI 也将收到 IPv6 地址。每个任务只能有一个 ENI。

这些 ENI 在您账户的 Amazon EC2 控制台中可见。您的账户无法分离或修改 ENI。这是为了防止意外删除与正在运行的任务关联的 ENI。您可以在 Amazon ECS 控制台中或使用 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) API 操作查看任务的 ENI 连接信息。当任务停止或服务缩减时，将分离并删除任务 ENI。

当您需要提高的 ENI 密度时，请使用 `awsvpcTrunking` 账户设置。Amazon ECS 还会为您的容器实例创建和附加“中继”网络接口。中继网络接口完全由 Amazon ECS 托管。在您从 Amazon ECS 集群中终止或注销容器实例时，将删除中继 ENI。有 `awsvpcTrunking` 账户设置的更多信息，请参阅 [先决条件](container-instance-eni.md#eni-trunking-launching)。

您可以在任务定义的 `networkMode` 参数中指定 `awsvpc`。有关更多信息，请参阅 [网络模式](task_definition_parameters.md#network_mode)。

然后在运行任务或创建服务时使用 `networkConfiguration` 参数，其中包含用于放置任务的一个或多个子网，以及用于附加到 ENI 的一个或多个安全组。有关更多信息，请参阅 [网络配置](service_definition_parameters.md#sd-networkconfiguration)。这些任务放置在与这些子网相同的可用性区域中的兼容 Amazon EC2 实例上，并且指定的安全组与为该任务预置的 ENI 相关联。

## Linux 注意事项
<a name="linux"></a>

 在使用 Linux 操作系统时考虑以下事项。
+ 如果您在 `awsvpc` 模式下使用 a p5.48xlarge 实例，则在该实例上运行的任务不能超过 1 个。
+ 使用 `awsvpc` 网络模式的任务和服务需要与 Amazon ECS 服务相关的角色，从而向 Amazon ECS 提供代表您调用其他 AWS 服务的权限。此角色是在创建集群时（或者在 AWS 管理控制台 中创建或更新服务时）自动为您创建的。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。您也可以使用以下 AWS CLI 命令创建服务相关的角色：

  ```
  aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name ecs.amazonaws.com
  ```
+ 您的 Amazon EC2 Linux 实例需要版本 `1.15.0` 或更高版本的容器代理运行使用 `awsvpc` 网络模式。如果您正在使用经 Amazon ECS 优化的 AMI，您的实例将需要不低于 `1.15.0-4` 版本的 `ecs-init` 程序包。
+ 在 VPC 上启用 `enableDnsHostnames` 和 `enableDnsSupport` 选项时， Amazon ECS使用任务联网和 Amazon 提供的（内部）DNS 主机名来填充任务的主机名。如果未启用这些选项，则任务的 DNS 主机名将被设置为随机主机名。有关 VPC 的 DNS 设置的更多信息，请参阅《Amazon VPC 用户指南》**中的[在您的 VPC 中使用 DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。
+ 每个使用 `awsvpc` 网络模式的 Amazon ECS 任务都会接收到自己的弹性网络接口（ENI），该网络接口附加到托管它的 Amazon EC2 实例。可以附加到 Amazon EC2 Linux 实例的网络接口数量有默认配额。主网络接口算作该配额中的一个。例如，默认情况下，最多只能将三个 ENI 附加到一个 `c5.large` 实例。实例的主网络接口计为一个。您可以向该实例再附加 2 个 ENI。由于每个使用 `awsvpc` 网络模式的任务均需一个 ENI，因此，您通常只能在该实例类型上运行 2 个此类任务。要详细了解每种实例类型的默认 ENI 限制，请参阅《Amazon EC2 用户指南》中的[每种实例类型的每个网络接口的 IP 地址数](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)**。
+ Amazon ECS 支持使用支持的实例类型启动 Amazon EC2 Linux 实例，并增加 ENI 密度。当您选择加入 `awsvpcTrunking` 账户设置并将使用这些实例类型的 Amazon EC2 Linux 实例注册到集群时，这些实例具有更高的 ENI 配额。将这些实例与此更高配额结合使用意味着您可以在每个 Amazon EC2 Linux 实例上放置更多的任务。为了将增加的 ENI 密度与中继功能结合使用，您的 Amazon EC2 实例必须使用版本 `1.28.1` 或更高版本的容器代理。如果您正在使用经 Amazon ECS 优化的 AMI，您的实例将还需要不低于版本 `1.28.1-2` 的 `ecs-init` 软件包。有关选择使用 `awsvpcTrunking` 账户设置的更多信息，请参阅 [通过账户设置访问 Amazon ECS 功能](ecs-account-settings.md)。有关 ENI 中继的更多信息，请参阅[增加 Amazon ECS Linux 容器实例网络接口](container-instance-eni.md)。
+ 当在 Amazon EC2 Linux 实例上托管使用 `awsvpc` 网络模式的任务时，不会为您的任务 ENI 提供公有 IP 地址。要访问互联网，必须在配置为使用 NAT 网关的私有子网中启动任务。有关更多信息，请参阅*《Amazon VPC 用户指南》*中的 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。入站网络访问必须从使用私有 IP 地址的 VPC 内进行，或者通过 VPC 内的负载均衡器进行路由。在公有子网中启动的任务无法访问互联网。
+ Amazon ECS 仅为您识别连接到 Amazon EC2 Linux 实例的 ENI。如果您手动将 ENI 附加到您的实例，Amazon ECS 可能会尝试向没有足够网络适配器的实例添加任务。这可能会导致任务超时并转为取消预置状态，然后变为已停止状态。我们建议您不要手动将 ENI 附加到实例。
+ Amazon EC2 Linux 实例必须注册到可以考虑在 `awsvpc` 网络模式下放置任务的 `ecs.capability.task-eni` 功能。运行版本 `1.15.0-4` 或更高版本的 `ecs-init` 的实例注册自动有此属性。
+ 创建并连接到 Amazon EC2 Linux 实例的 ENI 不能手动分离或由您的账户修改。这是为了防止意外删除与正在运行的任务关联的 ENI。要释放任务的 ENI，请停止该任务。
+ 在运行任务或创建使用 `awsvpc` 网络模式的服务时，限制为可在 `awsVpcConfiguration` 中指定 16 个子网和 5 个安全组。有关更多信息，请参阅 *Amazon Elastic Container Service API 参考*中的 [AwsVpcConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AwsVpcConfiguration.html)。
+ 在用 `awsvpc` 网络模式启动任务时，Amazon ECS 容器代理会为每个任务创建一个附加的 `pause` 容器，然后在任务定义中启动该容器。然后，它通过运行 [amazon-ecs-cni-plugins](https://github.com/aws/amazon-ecs-cni-plugins) CNI 插件来配置 `pause` 容器的网络命名空间。然后，该代理会启动任务中的其余容器，以使其共享 `pause` 容器的网络堆栈。这意味着，一个任务中的所有容器均可通过 ENI 的 IP 地址来寻址，并且这些容器可以通过 `localhost` 接口相互通信。
+ 任务使用 `awsvpc` 网络模式的服务只支持应用程序负载均衡器和网络负载均衡器。当您为这些服务创建任何目标组时，必须选择 `ip` 作为目标类型。切勿使用 `instance`。这是因为使用 `awsvpc` 网络模式的任务与 ENI 而不是 Amazon EC2 Linux 实例关联。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。
+ 如果您的 VPC 进行了更新以更改其使用的 DHCP 选项集，则无法将这些更改应用于现有任务。在应用这些更改的情况下启动新任务，验证它们是否正常工作，然后停止现有任务以安全地更改这些网络配置。

## Windows 注意事项
<a name="windows"></a>

 以下是使用 Windows 操作系统时的注意事项：
+ 使用经 Amazon ECS 优化的 Windows Server 2016 AMI 的容器实例无法托管使用 `awsvpc` 网络模式的任务。如果您的集群包含经 Amazon ECS 优化的 Windows Server 2016 AMI 和支持 `awsvpc` 网络模式的 Windows AMI，则使用 `awsvpc` 网络模式的任务不会在 Windows 2016 Server 实例上启动。而是会在支持 `awsvpc` 网络模式的实例上启动。
+ 您的 Amazon EC2 Windows 实例需要版本 `1.57.1` 或更高版本的容器代理为使用 `awsvpc` 网络模式的 Windows 容器使用 CloudWatch 指标。
+ 使用 `awsvpc` 网络模式的任务和服务需要与 Amazon ECS 服务相关的角色，从而向 Amazon ECS 提供代表您调用其他 AWS 服务的权限。此角色是在创建集群时（或者在 AWS 管理控制台 中创建或更新服务时）自动为您创建的。有关更多信息，请参阅 [对 Amazon ECS 使用服务相关角色](using-service-linked-roles.md)。您也可以使用以下 AWS CLI 命令创建服务相关角色。

  ```
  aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name ecs.amazonaws.com
  ```
+ 您的 Amazon EC2 Windows 实例需要版本 `1.54.0` 或更高版本的容器代理运行使用 `awsvpc` 网络模式。在引导实例时，必须配置 `awsvpc` 网络模式所需的选项。有关更多信息，请参阅 [引导启动 Amazon ECS Windows 容器实例以传递数据](bootstrap_windows_container_instance.md)。
+ 在 VPC 上同时启用 `enableDnsHostnames` 和 `enableDnsSupport` 选项时，Amazon ECS 会使用 Amazon 提供的（内部）DNS 主机名来填充任何主机名。如果未启用这些选项，则任务的 DNS 主机名为随机主机名。有关 VPC 的 DNS 设置的更多信息，请参阅《Amazon VPC 用户指南》**中的[在您的 VPC 中使用 DNS](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。
+ 每个使用 `awsvpc` 网络模式的 Amazon ECS 任务都会接收到自己的弹性网络接口（ENI），该网络接口附加到托管它的 Amazon EC2 Windows 实例。可以附加到 Amazon EC2 Windows 实例的网络接口数量有默认配额。主网络接口算作该配额中的一个。例如，默认情况下，最多只可将三个 ENI 附加到一个 `c5.large` 实例。实例的主网络接口计为其中一个。您可以向该实例再附加 2 个 ENI。由于每个使用 `awsvpc` 网络模式的任务均需一个 ENI，因此，您通常只能在该实例类型上运行 2 个此类任务。要详细了解每种实例类型的默认 ENI 限制，请参阅《Amazon EC2 用户指南》中的[每种实例类型的每个网络接口的 IP 地址数](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-eni.html#AvailableIpPerENI)**。
+ 当在 Amazon EC2 Windows 上托管使用 `awsvpc` 网络模式时，不会为您的任务 ENI 提供公有 IP 地址。要访问互联网，请在配置为使用 NAT 网关的私有子网中启动任务。有关更多信息，请参阅*《Amazon VPC 用户指南》*中的 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。入站网络访问必须使用私有 IP 地址从 VPC 内进行，或者通过 VPC 内的负载均衡器进行路由。在公有子网中启动的任务无法访问互联网。
+ Amazon ECS 仅为您识别已附加到 Amazon EC2 Windows 实例的 ENI。如果您手动将 ENI 附加到您的实例，Amazon ECS 可能会尝试向没有足够网络适配器的实例添加任务。这可能会导致任务超时并转为取消预置状态，然后变为已停止状态。我们建议您不要手动将 ENI 附加到实例。
+ Amazon EC2 Windows 实例必须注册到可以考虑在 `awsvpc` 网络模式下放置任务的 `ecs.capability.task-eni` 功能。
+  您不能手动修改或分离创建并连接到 Amazon EC2 Windows 实例的 ENI。这是为了防止您意外删除与正在运行的任务关联的 ENI。要释放任务的 ENI，请停止该任务。
+  当运行任务或创建使用 `awsvpc` 网络模式的服务时，您最多只能在 `awsVpcConfiguration` 中指定 16 个子网和 5 个安全组。有关更多信息，请参阅 *Amazon Elastic Container Service API 参考*中的 [AwsVpcConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AwsVpcConfiguration.html)。
+ 在用 `awsvpc` 网络模式启动任务时，Amazon ECS 容器代理会为每个任务创建一个附加的 `pause` 容器，然后在任务定义中启动该容器。然后，它通过运行 [amazon-ecs-cni-plugins](https://github.com/aws/amazon-ecs-cni-plugins) CNI 插件来配置 `pause` 容器的网络命名空间。然后，该代理会启动任务中的其余容器，以使其共享 `pause` 容器的网络堆栈。这意味着，一个任务中的所有容器均可通过 ENI 的 IP 地址来寻址，并且这些容器可以通过 `localhost` 接口相互通信。
+ 任务使用 `awsvpc` 网络模式的服务只支持应用程序负载均衡器和网络负载均衡器。当您为这些服务创建任何目标组时，必须选择 `ip` 而不是 `instance` 作为目标类型。这是因为使用 `awsvpc` 网络模式的任务与 ENI 而不是 Amazon EC2 Windows 实例关联。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。
+ 如果您的 VPC 进行了更新以更改其使用的 DHCP 选项集，则无法将这些更改应用于现有任务。在应用这些更改的情况下启动新任务，验证它们是否正常工作，然后停止现有任务以安全地更改这些网络配置。
+ 在 EC2 Windows 配置中使用 `awsvpc` 网络模式时，不支持以下内容：
  + 双堆栈配置
  + IPv6
  + ENI 中继

## 在双堆栈模式下使用 VPC
<a name="task-networking-vpc-dual-stack"></a>

在双堆栈模式下使用 VPC 时，您的任务可通过 IPv4 或 IPv6 或两者进行通信。IPv4 和 IPv6 地址彼此独立。因此，您必须在 VPC 中分别针对 IPv4 和 IPv6 配置路由和安全设置。有关如何将 VPC 配置为双堆栈模式的更多信息，请参阅《Amazon VPC 用户指南》**中的[迁移到 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。

如果您使用互联网网关或仅出站互联网网关配置 VPC，则可以在双堆栈模式下使用 VPC。通过这样做，分配了 IPv6 地址的任务可以通过互联网网关或仅限出口的互联网网关访问互联网。NAT 网关是可选项。有关更多信息，请参阅 *Amazon VPC 用户用户指南*中的[互联网网关](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)和 [Egress-only 互联网网关](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html)。

如果满足以下条件，则向 Amazon ECS 任务分配 IPv6 地址：
+ 托管该任务的 Amazon EC2 Linux 实例正在使用版本 `1.45.0` 或更高版本的容器代理。有关如何检查您的实例正在使用的代理版本以及根据需要进行更新的信息，请参阅[更新 Amazon ECS 容器代理](ecs-agent-update.md)。
+ `dualStackIPv6` 账户设置为已启用。有关更多信息，请参阅 [通过账户设置访问 Amazon ECS 功能](ecs-account-settings.md)。
+ 您的任务是使用 `awsvpc` 网络模式。
+ 您的 VPC 和子网已为 IPv6 配置。配置包括在指定子网中创建的网络接口。有关如何将 VPC 配置为双堆栈模式的更多信息，请参阅《Amazon VPC 用户指南》**中的[迁移到 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html) 和[修改子网的 IPv6 寻址属性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-ipv6)。

# 将 Amazon ECS 容器端口映射到 EC2 实例网络接口
<a name="networking-networkmode-host"></a>

`host` 网络模式仅支持 Amazon EC2 实例上托管的 Amazon ECS 任务。在 Fargate 上使用 Amazon ECS 时不支持该功能。

`host` 网络模式是 Amazon ECS 支持的最基本的网络模式。使用主机模式时，容器的网络连接直接绑定到运行容器的底层主机。

![\[该图显示了使用主机网络模式的容器的网络架构。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/networkmode-host.png)


假设您正在运行一个 Node.js 容器，其中包含一个 Express 应用程序，该应用程序监听类似于上图所示端口的端口 `3000`。使用 `host` 网络模式时，容器使用底层主机 Amazon EC2 实例的 IP 地址在端口 3000 上接收流量。不建议使用此模式。

使用这种网络模式有明显的缺点。在每台主机上只能运行一个任务的单个实例化。这是因为只有第一个任务可以绑定到 Amazon EC2 实例上所需的端口。使用 `host` 网络模式时，也无法重新映射容器端口。例如，如果应用程序需要侦听特定的端口号，则您无法直接重新映射该端口号。相反，您必须通过更改应用程序配置来管理所有端口冲突。

使用 `host` 网络模式还存在安全影响。此模式允许容器模拟主机，并允许容器连接到主机上的私有环回网络服务。

# 将 Docker 的虚拟网络用于 Amazon ECS Linux 任务
<a name="networking-networkmode-bridge"></a>

`bridge` 网络模式仅支持 Amazon EC2 实例上托管的 Amazon ECS 任务。

在 `bridge` 模式下，您使用虚拟网桥在主机和容器的网络之间创建一个层。这样，您就可以创建将主机端口重新映射到容器端口的端口映射。映射可以是静态，也可以是动态。

![\[该图显示了使用桥接网络模式和静态端口映射的网络架构。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/networkmode-bridge.png)


使用静态端口映射，您可以明确定义要映射到容器端口的主机端口。使用上面的示例，主机上的端口 `80` 被映射到容器上的端口 `3000`。要与容器化应用程序通信，您需要将流量发送到 Amazon EC2 实例的 IP 地址的端口 `80`。从容器化应用程序的角度来看，它可以看到端口 `3000` 上的入站流量。

如果您只想更改流量端口，则静态端口映射是合适的。但是，这仍然具有与使用 `host` 网络模式相同的缺点。在每台主机上只能运行一个任务的单个实例化。这是因为静态端口映射仅允许将单个容器映射到端口 80。

要解决此问题，请考虑使用带有动态端口映射的 `bridge` 网络模式，如下图所示。

![\[该图显示了使用桥接网络模式和动态端口映射的网络架构。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/networkmode-bridge-dynamic.png)


通过不在端口映射中指定主机端口，您可以让 Docker 从临时端口范围中选择未使用的随机端口，并将其分配为容器的公共主机端口。例如，监听容器上端口 `3000` 的 Node.js 应用程序可能会被分配一个随机的大数值端口，例如 Amazon EC2 主机上的 `47760`。这样做意味着您可以在主机上运行该容器的多个副本。此外，还可以在主机上为每个容器分配自己的端口。容器的每个副本都会在端口 `3000` 上接收流量。但是，向这些容器发送流量的客户端使用随机分配的主机端口。

Amazon ECS 可帮助您跟踪为每项任务随机分配的端口。它通过自动更新负载均衡器目标组和 AWS Cloud Map 服务发现以包含任务 IP 地址和端口列表来实现此目的。这样可以更轻松地使用通过动态端口使用 `bridge` 模式运行的服务。

但是，使用 `bridge` 网络模式的一项缺点是，很难将服务锁定为服务通信。由于服务可能会分配给任何随机的、未使用的端口，因此有必要在主机之间开放广泛的端口范围。但是，要创建特定的规则，使某项特定服务只能与另一项特定服务进行通信并不容易。这些服务没有用于安全组网络规则的特定端口。

## 为仅 IPv6 工作负载配置桥式联网模式
<a name="networking-networkmode-bridge-ipv6-only"></a>

要配置 `bridge` 模式以通过 IPv6 进行通信，您必须更新 Docker 进程守护程序设置。请使用以下内容更新 `/etc/docker/daemon.json`：

```
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64",
  "ip6tables": true,
  "experimental": true
}
```

更新 Docker 进程守护程序设置后，您需要重启进程守护程序。

**注意**  
当您更新并重启进程守护程序后，Docker 会在实例上启用 IPv6 转发，这可能会导致使用 Amazon Linux 2 AMI 的实例丢失默认路由。为避免这种情况，请使用下面的命令通过子网的 IPv6 网关添加默认路由。  

```
ip route add default via FE80:EC2::1 dev eth0 metric 100
```