Dockerにおけるオーバーレイネットワークの詳しい説明

以下の内容は Docker の公式 Web サイトからの翻訳です。
オーバーレイ (オーバーレイ) ネットワークは、複数の Docker デーモンが配置されているホスト間に分散ネットワークを作成します。このネットワークはホスト固有のネットワークをオーバーライドし、コンテナー (クラスター サービス内のコンテナーを含む) がホスト固有のネットワークに接続して安全に通信できるようにします。どうやら docker は、docker デーモンのソースコンテナと宛先コンテナ間のデータグラムのルーティングを処理します。

クラスター (swarm) を初期化するか、既存のクラスターに Docker ホストを追加すると、ホスト上に 2 つの新しいネットワークが作成されます。

Ingress と呼ばれるオーバーレイ ネットワークは、クラスター サービスに関連する制御とデータ送信を処理するために使用されます。クラスター サービスを作成し、それをユーザー定義のオーバーレイ ネットワークに接続しない場合、デフォルトでイングレス ネットワークに接続されます。

docker_gwbridge というブリッジ ネットワーク。この Docker デーモンをクラスター内の他のデーモンに接続するために使用されます。

ユーザー定義のブリッジ ネットワークを作成するのと同じように、 docker network create コマンドを使用してユーザー定義のオーバーレイ ネットワークを作成できます。サービスとコンテナは同時に複数のネットワークに接続できます。サービスとコンテナは、それらが接続されているネットワーク上の他のオブジェクトとのみ通信できます。

クラスター化されたサービスと個々のコンテナーの両方をオーバーレイ ネットワークに接続できますが、両方のデフォルトの動作と構成は異なります。したがって、このトピックの以下の内容は、すべてのオーバーレイ ネットワークに適用される内容、クラスター サービス内のネットワークに適用される内容、個々のコンテナーで使用されるオーバーレイ ネットワークに適用される内容の 3 つの部分に分かれています。

すべてのオーバーレイ ネットワークに適用される操作

オーバーレイネットワークを作成する

✅前提条件

オーバーレイ ネットワークを使用する Docker デーモンに必要なファイアウォール ルール

オーバーレイ ネットワーク内の Docker ホストが相互に通信できるようにするには、次のポートを開く必要があります。

  1. TCP ポート 2377、クラスター管理に関連する通信に使用されます。

  2. ノード間の通信用の TCP および UDP ポート 7946

  3. UDP ポート 4789、オーバーレイ ネットワーク上のデータ送信に使用されます。

オーバーレイ ネットワークを作成する前に、docker swarm init を介して docker デーモンを swarm マネージャーとして初期化するか、docker swarm join を介して既存の swarm に参加させる必要があります。

いずれの場合も、イングレスと呼ばれるオーバーレイ ネットワークがデフォルトで作成され、使用されます。クラスター サービスを使用する予定がない場合でも、これを実行してください。

後で、ユーザー定義のオーバーレイ スタイルのネットワークを作成できます。

クラスター サービスで使用するオーバーレイ ネットワークを作成するには、以下に示すコマンドを使用します。

docker network create -d overlay my-overlay

swarm サービスと個々のコンテナーが他の Docker デーモンの個々のコンテナーと通信するために使用できるネットワークを作成するには、 --attachable フラグを追加します。

docker network create -d overlay --attachable my-attachable-overlay

IP アドレス範囲、サブネット、ゲートウェイ、その他のオプションを指定できます。詳細については、「docker network create --help」を参照してください。

オーバーレイネットワーク上の暗号化された送信

すべてのサービス管理関連の送信は、デフォルトで GCM モードの AES アルゴリズムを使用して暗号化されます。クラスター内の管理ノードは、暗号化に使用されるキーを 12 時間ごとにローテーションします。

アプリケーション データを暗号化するには、ネットワークの作成時に --opt encrypted を追加します。このパラメータは、vxlan レベルでの IPSEC 暗号化をサポートします。この操作は無視できないパフォーマンスの低下を引き起こすため、運用環境に適用する前にテストする必要があります。

オーバーレイ暗号化を有効にすると、Docker はサービスがスケジュールされているネットワーク内のすべてのノードに IPSEC トンネルを作成します。これらのトンネルも GCM モードの AES アルゴリズムを使用して暗号化され、暗号化キー (キー) は 12 時間ごとに自動的に更新されます。

暗号化通信を行うオーバーレイネットワークに Windows ノードを追加しないでください。

オーバーレイ ネットワーク上の暗号化通信は Windows をサポートしていません。Windows ノードが暗号化通信を使用してオーバーレイ ネットワークに接続しようとしても、エラーは報告されませんが、このノードは他のノードと通信できなくなります。

クラスターモードのオーバーレイネットワークと個々のコンテナー

オーバーレイ ネットワーク機能は、 --opt encrypted --attachable を指定するか、管理対象外のコンテナをネットワークに追加することで使用できます。

docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network

デフォルトのイングレスネットワークを変更する

ほとんどのユーザーは、イングレス ネットワークを構成する必要はありません。ただし、docker17.05 以降ではこれが可能になります。この機能は、自動的に選択されたサブネットがネットワーク内の既存のネットワークと競合する場合、または MTU などの他の基礎となるネットワーク設定を変更する必要がある場合に役立ちます。

イングレスネットワークを変更するには、ネットワークを削除して再作成する必要があります。これには、クラスター内にサービスを作成する前に変更を完了する必要があります。ポートを公開するサービスがある場合は、イングレス ネットワークを削除する前にそれらを削除してください。

Ingress ネットワークが存在しない場合、ポートが公開されていない既存のサービスは引き続きサービスを提供できますが、負荷分散機能はありません。ポート 80 を公開する WordPress サービスなど、ポートを公開するサービスが影響を受けます。

docker network Inspection ingress を使用してイングレス ネットワークを確認し、コンテナー内のイングレスに接続されているすべてのサービスを削除します。これらのサービスは、ポート 80 を公開する WordPress サービスなど、ポートを公開するサービスです。これらすべてのサービスが停止していない場合、次のステップは失敗します。

イングレスネットワークを削除します。

docker network rm ingress

WARNING! Before removing the routing-mesh network, make sure all the nodes in your swarm run the same docker engine version. Otherwise, removal may not be effective and functionality of newly created ingress networks will be impaired.

Are you sure you want to continue? [y/N]

3. Ingress タグと必要な構成を使用して、新しいオーバーレイ ネットワークを作成します。次の例では、MTU を 1200、サブネットを 10.11.0.0/16、ゲートウェイを 10.11.0.2 に設定します。

docker network create \
 --driver overlay \
 --ingress \
 --subnet=10.11.0.0/16 \
 --gateway=10.11.0.2 \
 --opt com.docker.network.mtu=1200 \
 my-ingress

注: ingss ネットワークに別の名前を付けることもできますが、名前は 1 つだけです。2 つ目を作成しようとすると失敗します。

4. 最初の手順で停止したサービスを再起動します。

docker_gwbridge インターフェースを変更する

docker_gwbridge は、オーバーレイ ネットワーク (イングレス ネットワークを含む) と特定の Docker デーモンの物理ネットワークを接続するために使用される仮想ネットワーク ブリッジです。クラスターを初期化するかクラスターに Docker ホストを追加すると、Docker は自動的にホストを作成しますが、これは Docker デバイスではありません。Docker ホスト マシンのカーネルに存在します。構成を変更する場合は、ホストをクラスターに追加する前、またはホストをクラスターから一時的に切断する前に変更する必要があります。

ドッカーを停止します

docker_gwbridge インターフェースを削除します

sudo ip link set docker_gwbridge down
sudo ip link del name docker_gwbridge

3. docker を起動します。クラスターへの参加や初期化は行いません。

4. docker network create コマンドを使用して、docker_gwbridge ブリッジとカスタム設定を手動で作成または再作成します。次の例では、10.11.0.0/16 サブネットを使用します。

docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

5. クラスターを初期化するか、クラスターに参加します。ブリッジはすでに存在しているため、docker はデフォルト設定でブリッジを作成しません。

クラスターサービスでの操作

オーバーレイ ネットワーク上でポートを公開する

同じオーバーレイ ネットワークに接続されているクラスター サービスは、すべてのポートを相互に公開します。サービスの外部からポートにアクセスできるようにする場合は、docker service create または docker service update で -p または –publish を使用してポートを公開する必要があります。

従来のコロン区切り構文と新しいカンマ区切り構文の両方がサポートされています。

ある意味一目瞭然なので、構文は長い方が良いです。

パラメータの説明
-p 8080:80 o または -ppublished=8080,target=80 サービスの TCP ポート 80 をルートのポート 8080 にマップします
-p 8080:80/udp または -ppublished=8080,target=80,protocol =udp は、サービスの UDP ポート 80 をルートのポート 8080 にマップします
-p 8080:80/tcp -p 8080:80/udp または -ppublished=8080,target=80,protocol=tcp -ppublished=8080 ,target =80,protocol=udp は、サービスの TCP ポート 80 をルートのポート 8080 にマッピングし、サービスの UDP ポート 80 をルートのポート 8080 にマッピングします。

パラメータ 説明
-p 8080:80 oまたは-p 公開=8080、ターゲット=80 サービスの TCP ポート 80 をルートのポート 8080 にマップします
-p 8080:80/udp または -p 公開 = 8080、ターゲット = 80、プロトコル = udp サービスの UDP ポート 80 をルートのポート 8080 にマップします。
-p 8080:80/tcp -p 8080:80/udp または -ppublished=8080,target=80,protocol=tcp -ppublished=8080,target=80,protocol=udp サービスの TCP ポート 80 をルートのポート 8080 にマッピングし、サービスの UDP ポート 80 をルートのポート 8080 にマッピングします。

クラスターサービス用のバイパスルーター

デフォルトでは、クラスター サービスはルーター ネットワーク経由でポートを公開します。任意のクラスター ノード上の公開ポートに接続すると (そのポートで表されるサービスが実行されているかどうかに関係なく)、指定されたサービスを実行しているノードにリダイレクトされます。Docker は、クラスター サービスのロード バランサーとして効果的に機能します。ルーティング ネットを使用するサービスは、仮想 IP モード (VIP) で実行されます。サービスがノード上で実行されている場合でも (--global フラグを使用して)、ルーティング メッシュが使用されます。ルーテッド メッシュを使用する場合、どのノードがクライアントのリクエストを処理するかは保証されません。

ルーティング ネットをバイパスするには、DNS ラウンド ロビン (DNSRR) モードでサービスを開始できます。--endpoint-mode フラグを dnsrr に設定します。サービスの前で独自のロード バランサーを実行する必要があります。Docker ホスト上のサービス名に対する DNS クエリは、指定されたサービスを実行しているノードの IP アドレスのセットを返します。このリストを使用してノード間のトラフィックのバランスを取るようにロード バランサーを構成します。

制御フローとデータフローを分離する

デフォルトでは、制御トラフィックはクラスター マネージャーと通信し、同じネットワーク上で実行されているアプリケーション間で送信されますが、制御トラフィックは暗号化されます。さまざまなストリームにさまざまなネットワーク インターフェイスを使用するように Docker を構成できます。クラスターを初期化または参加するときは、それぞれ --advertise-addr と --datapath-addr を指定します。これは、クラスターに参加する各ノードで行う必要があります。

オーバーレイ ネットワーク上のスタンドアロン コンテナで利用できる操作

個々のコンテナをオーバーレイ ネットワークに接続する

イングレス ネットワークは --attachable フラグを指定せずに作成されました。つまり、スタンドアロン コンテナーではなく、クラスター サービスのみがそれを使用できます。--attachablebiaojid オーバーレイで作成されたユーザー定義のネットワークにスタンドアロン コンテナを接続できます。これにより、異なる Docker 上で実行されている独立したコンテナが、特定の Docker ホスト上でルーティングを設定しなくても通信できるようになります。

パブリッシュポート

パラメータ 説明
p 8080:80 サービスの TCP ポート 80 をルートのポート 8080 にマップします
p 8080:80/udp サービスの UDP ポート 80 をルートのポート 8080 にマップします。
p 8080:80/tcp -p 8080:80/udp サービスの TCP ポート 80 をルートのポート 8080 にマッピングし、サービスの UDP ポート 80 をルートのポート 8080 にマッピングします。

おすすめ

転載: blog.csdn.net/baidu_38956956/article/details/128318514