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

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

Docker 公式ドキュメントからの翻訳、原文: https://docs.docker.com/network/overlay/

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

スウォームを初期化するか、Docker ホストを既存のスウォームに参加させると、ホスト上に 2 つの新しいネットワークが作成されます。

クラスター サービスに関連する制御とデータ転送を処理するために、Ingress と呼ばれるオーバーレイ ネットワークが使用されます。クラスター サービスを作成し、それをユーザー定義のオーバーレイ ネットワークに接続しない場合は、デフォルトで 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 に参加させる必要があります。

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

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

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

$ docker ネットワーク作成 -d オーバーレイ my-overlay

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

$ docker network create -d オーバーレイ --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 ネットワーク作成 --opt 暗号化 --driver オーバーレイ --attachable my-attachable-multi-host-network

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

ほとんどのユーザーは、Ingress ネットワークを構成する必要はありません。しかし、Docker 17.05 以降のバージョンでは、これが可能になります。この機能は、自動的に選択されたサブネットがネットワーク上の既存のネットワークと競合する場合、または MTU などの他の低レベルのネットワーク設定を変更する必要がある場合に役立ちます。

入力ネットワークを変更するには、ネットワークを削除してから作成する必要があります。これには、クラスターにサービスを作成する前に変更を完了する必要があります。ポートを公開するサービスがある場合は、Ingress ネットワークを削除する前にそれらを削除します。

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

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

入力ネットワークを削除します。

$ docker ネットワーク rm イングレス

警告! ルーティング メッシュ ネットワークを削除する前に、スウォーム内のすべてのノードが同じ Docker エンジン バージョンを実行していることを確認してください。そうでない場合、削除が有効にならない可能性があり、新しく作成された Ingress ネットワークの機能に支障をきたす可能性があります。

本当に続行しますか? [y/N]

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

$ dockerネットワークを作成\
 --ドライバーオーバーレイ \
 --イングレス\
 --サブネット=10.11.0.0/16 \
 --ゲートウェイ=10.11.0.2 \
 --opt com.docker.network.mtu=1200 \
 私のイングレス

注: イングレス ネットワークには任意の名前を付けることができますが、指定できる名前は 1 つだけです。 2 つ目を作成しようとすると失敗します。

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

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

docker_gwbridge は、オーバーレイ ネットワーク (入力ネットワークを含む) を特定の docker デーモンの物理ネットワークに接続する仮想ブリッジです。クラスターを初期化するか、Docker ホストをクラスターに参加させると、Docker によって自動的に作成されますが、これは Docker デバイスではありません。 Docker ホストのカーネル内に存在します。設定を変更する場合は、ホストをクラスターに追加する前に変更するか、クラスターからホストを一時的に削除する必要があります。

Dockerを停止する

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

$ sudo ip link set docker_gwbridge をダウンさせる

$ sudo ip リンク del 名前 docker_gwbridge

3. Dockerを起動し、クラスターに参加したり初期化したりしないでください。

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

$ dockerネットワークを作成\
--サブネット 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 \
ドッカー

5. クラスターを初期化または参加します。ブリッジはすでに存在するため、Docker はデフォルト構成でブリッジを再度作成しません。

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

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

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

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

構文が長いほど、説明が不要になるため、より適しています。

パラメータ説明する
-p 8080:80 o または -p published=8080,target=80サービスのTCPポート80をルーターのポート8080にマッピングする
-p 8080:80/udp または -p published=8080,target=80,protocol=udpサービスのUDPポート80をルーターのポート8080にマッピングする
-p 8080:80/tcp -p 8080:80/udp または -p published=8080,target=80,protocol=tcp -p published=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 を指定します。クラスターに参加する各ノードでこれを実行する必要があります。

オーバーレイネットワーク上の個々のコンテナで実行可能な操作

スタンドアロンコンテナをオーバーレイネットワークに接続する

Ingress ネットワークは --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にマッピングします。

以上が、Docker のオーバーレイ ネットワークに関する詳細な説明です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明
  • Dockerコンテナがホスト間で通信する方法の詳細な説明
  • Docker クロスホストネットワーク (オーバーレイ) の実装
  • Docker コンテナのホスト間通信 - オーバーレイ ネットワーク

<<:  JS+Canvas が抽選ホイールを引く

>>:  MySQLストアドプロシージャを変更する詳細な手順

推薦する

Linux で測位バックグラウンド サービスが時々クラッシュする問題の解決方法

問題の説明最近のバックグラウンドサービスでは、特定の命令の要求データをディスクに保存する新しい機能が...

HTMLのセマンティクスといくつかの簡単な最適化についての簡単な説明

1. セマンティゼーションとは何ですか? Bing辞書の説明セマンティクス化とは、適切な HTML ...

Typescript の as、疑問符、感嘆符の詳細な説明

1. asキーワードはアサーションを示すTypescript では、アサーションを表現する方法が 2...

VSCode+CMake+Clang+GCC 環境構築チュートリアル (Win10 の場合)

大学院入試に備えて、C/C++ を使って基本的なデータ構造とアルゴリズムを実装する予定です。アルゴリ...

MySQL インデックス プッシュダウン (ICP) の簡単な理解と例

序文Index Condition Pushdown (ICP) は、MySQL 5.6 の新機能で...

CSSはインラインブロックのずれの問題を解決します

もうナンセンスじゃない、郵便番号HTML部分 <div class="positio...

docker に openjdk をインストールして jar パッケージを実行する方法

画像をダウンロード docker プル openjdkデータボリュームの作成java_appデータボ...

Visual Studio Codeを使用してMySqlデータベースに接続し、クエリを実行します。

Visual Studio Code は、Microsoft が開発した強力なテキスト エディター...

Vue3.0 手書き拡大鏡効果

達成される効果は、固定ズームが 2 倍になり、マウスが左側の画像領域に入るとマスク レイヤーが表示さ...

Linux 上での MySQL データベースのインストールと Java プロジェクトの構成に関する詳細なグラフィック説明

1. MySQLデータベースをインストールする① ダウンロードして解凍し、/opt/softディレク...

MySQL 外部キー (FOREIGN KEY) の使用例の詳細な説明

はじめに: すべてのデータを 1 つのテーブルに保存することのデメリット表の構成構造は複雑で不明瞭で...

CSSでフレックス配置を表示する(レイアウトツール)

display: flex レイアウトに関しては、深く理解している人もいますし、私も他の人の作業か...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

vsFTP 3.0.3 のコンパイルとインストールの詳細な分析

脆弱性の詳細VSFTP は、GPL に基づいてリリースされた Unix ライクなシステムで使用される...

タグのターゲットリンクを iframe に向ける方法

コードをコピーコードは次のとおりです。 <iframe id="myFrameId&...