Amazon ECS Linux タスクに Docker の仮想ネットワークを使用する
bridge ネットワークモードは Amazon EC2 インスタンスでホストされている Amazon ECS タスクにのみサポートされています。
bridge モードでは、仮想ネットワークブリッジを使用してホストとコンテナのネットワーク間にレイヤーを作成します。これにより、ホストポートをコンテナポートに再マップするポートマッピングを作成できます。マッピングは静的または動的に実行することができます。
スタティックポートマッピングでは、どのホストポートをコンテナポートにマッピングするかを明示的に定義できます。上記の例を使用すると、ホスト上のポート 80 はコンテナのポート 3000 にマップされます。コンテナ化されたアプリケーションと通信するには、Amazon EC2 インスタンスの IP アドレスのポート 80 にトラフィックを送信します。コンテナ化されたアプリケーションの観点から見ると、ポート 3000 上のインバウンドトラフィックがわかります。
トラフィックポートのみを変更する場合は、静的ポートマッピングが適しています。ただし、これには host ネットワークモードを使用する場合と同じ欠点があります。各ホストで 1 つのタスクを複数インスタンス化することはできません。これは、静的ポートマッピングでは、1 つのコンテナしかポート 80 にマッピングできないためです。
この問題を解決するには、次の図に示すように、bridge ネットワークモードと動的ポートマッピングを使用することを検討してください。
ポートマッピングでホストポートを指定しないことで、Docker にエフェメラルポート範囲から未使用のポートをランダムに選択させ、それをコンテナのパブリックホストポートとして割り当てることができます。例えば、コンテナのポート 3000 をリッスンしている Node.js アプリケーションには、Amazon EC2 ホスト上の 47760 のようにランダムに大きい番号のポートが割り当てられる場合があります。これにより、そのコンテナの複数のコピーをホスト上で実行できるようになります。さらに、各コンテナにはホスト上の独自のポートを割り当てることができます。コンテナの各コピーは、ポート 3000 でトラフィックを受信します。ただし、これらのコンテナにトラフィックを送信するクライアントは、ランダムに割り当てられたホストポートを使用します。
Amazon ECS は、各タスクにランダムに割り当てられたポートを追跡するのに役立ちます。これは、ロードバランサーのターゲットグループと AWS Cloud Map サービス検出を自動的に更新して、タスクの IP アドレスとポートのリストを取得することによって行われます。このため、ダイナミックポートで bridge モードを使用するときのみにサポートされます。
ただし、bridge ネットワークモードを使用するデメリットの 1 つは、サービス間の通信をロックダウンするのが難しいことです。サービスはランダムで未使用のポートに割り当てられる可能性があるため、ホスト間で幅広いポート範囲を開く必要があります。ただし、特定のサービスが他の 1 つの特定のサービスとしか通信できないように特定のルールを作成するのは簡単ではありません。サービスには、セキュリティグループのネットワークルールに使用する特定のポートはありません。
IPv6-only ワークロードのブリッジネットワークモードの設定
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