

# 将 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
```