

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為 Amazon ECS Linux 任務使用 Docker 的虛擬網路
<a name="networking-networkmode-bridge"></a>

僅 Amazon EC2 執行個體上託管的 Amazon ECS 任務支援 `bridge` 網路模式。

在 `bridge` 模式下，您正在使用虛擬網路橋接器，在主機和容器的網路之間建立一個層。如此一來，您就可以建立將主機連接埠重新對應至容器連接埠的連接埠映射。映射可以是靜態或動態模式。

![此圖顯示使用橋接網路模式與靜態連接埠映射的網路架構。](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/images/networkmode-bridge.png)


透過靜態連接埠映射，您可以明確定義要對應至容器連接埠的主機連接埠。使用上述範例，主機上的 `80` 連接埠會對應至容器上的連接埠 `3000`。若要與容器化應用程式通訊，請將流量傳送至 Amazon EC2 執行個體 IP 地址的連接埠 `80`。從容器化應用程式的角度來看，其可以看到連接埠 `3000` 上的入站流量。

如果您只想變更流量連接埠，則適用於靜態連接埠映射。但是，這仍然與使用 `host` 網路模式具有相同的缺點。您不能在每台主機上執行多個任務的執行個體化。這是因為靜態連接埠映射僅允許單一容器對應至連接埠 80。

為了解決這個問題，可以考慮使用具有動態連接埠映射的 `bridge` 網路模式，如下圖所示。

![此圖顯示使用橋接網路模式與動態連接埠映射的網路架構。](http://docs.aws.amazon.com/zh_tw/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>

若要設定透過 IPv6 通訊的 `bridge` 模式，您必須更新 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
```