前書き

分散システムを構築してDockerコンテナーを提供する場合、通信とネットワーキングが非常に重要になります。 サービス指向アーキテクチャは、間違いなく、正しく機能するためにコンポーネント間の通信に大きく依存しています。

このガイドでは、コンテナが使用するネットワークを望ましい状態に成形するために使用されるさまざまなネットワーク戦略とツールについて説明します。 Dockerネイティブのソリューションを活用できる場合もあれば、代替プロジェクトを利用する必要がある場合もあります。

ネイティブDockerネットワークの実装

Docker自体は、コンテナ間およびコンテナからホストへの通信に必要なネットワークの基礎の多くを提供します。

Dockerプロセス自体が起動されると、ホストシステムで「+ docker0 +」という新しい仮想ブリッジインターフェースが設定されます。 このインターフェイスにより、Dockerは実行するコンテナ間で使用する仮想サブネットを割り当てることができます。 ブリッジは、コンテナ内のネットワークとホスト上のネットワーク間のインターフェースの主要ポイントとして機能します。

コンテナがDockerによって起動されると、新しい仮想インターフェイスが作成され、ブリッジのサブネット範囲内のアドレスが与えられます。 IPアドレスはコンテナの内部ネットワークに接続され、コンテナのネットワークにホストシステムの「+ docker0 」ブリッジへのパスを提供します。 Dockerは自動的に ` iptables `ルールを設定して転送を許可し、外部世界向けの ` docker0 +`を発信元とするトラフィックのNATマスカレードを設定します。

コンテナはどのようにサービスを消費者に公開しますか?

同じホスト上の他のコンテナは、追加の構成を行わなくても、近隣のサービスからアクセスできます。 ホストシステムは、 `+ docker0 +`インターフェースを起点とするリクエストを適切な場所にルーティングするだけです。

コンテナはポートをホストに公開し、外部から転送されたトラフィックを受信できます。 特定のポートを選択するか、Dockerがランダムで高い未使用のポートを選択できるようにすることで、公開されたポートをホストシステムにマッピングできます。 Dockerは、これらの状況でパケットを正しくルーティングするために、転送ルールと「+ iptables +」設定を処理します。

ポートの公開と公開の違いは何ですか?

コンテナイメージを作成するとき、またはコンテナを実行するときに、ポートを公開するか、ポートを公開するかを選択できます。 この2つの違いは重要ですが、すぐに識別できるとは限りません。

ポートを公開するということは、Dockerが問題のポートがコンテナによって使用されていることに注意することを意味します。 これは、検出目的およびリンクに使用できます。 たとえば、コンテナを検査すると、公開されているポートに関する情報が得られます。 コンテナがリンクされると、元のコンテナで公開されていたポートを示す環境変数が新しいコンテナに設定されます。

デフォルトでは、ポートは公開されているかどうかに関係なく、ホストシステムおよびホスト上の他のコンテナからコンテナにアクセスできます。 ポートを公開すると、ポートの使用が文書化され、その情報が自動化されたマッピングおよびリンクで利用可能になります。

対照的に、ポートを公開すると、ポートがホストインターフェイスにマップされ、外部の世界で使用できるようになります。 コンテナポートは、ホスト上の特定のポートにマッピングするか、Dockerで高い未使用ポートをランダムに自動的に選択できます。

Dockerリンクとは何ですか?

Dockerは、コンテナー間の通信を構成するための「Dockerリンク」と呼ばれるメカニズムを提供します。 新しいコンテナが既存のコンテナにリンクされている場合、新しいコンテナには環境変数を通じて既存のコンテナの接続情報が与えられます。

これにより、新しいコンテナにコンパニオンへのアクセス方法に関する明示的な情報を提供することにより、2つのコンテナ間の通信を簡単に確立できます。 環境変数は、他のコンテナによって公開されているポートに従って設定されます。 IPアドレスおよびその他の情報は、Docker自体によって入力されます。

Dockerのネットワーク機能を拡張するプロジェクト

上記のネットワークモデルは、ネットワーク構築の出発点として適しています。 同じホスト上のコンテナ間の通信は非常に簡単であり、ポートが正しくマッピングされ、接続情報が相手に提供される限り、ホスト間の通信は通常のパブリックネットワークを介して発生します。

ただし、多くのアプリケーションでは、セキュリティまたは機能のために特定のネットワーク環境が必要です。 これらのシナリオでは、Dockerのネイティブネットワーキング機能が多少制限されています。 このため、Dockerネットワークエコシステムを拡張するための多くのプロジェクトが作成されています。

基盤となるトポロジを抽象化するためのオーバーレイネットワークの作成

いくつかのプロジェクトが焦点を当てた機能改善の1つは、オーバーレイネットワークの確立です。 オーバーレイネットワークは、既存のネットワーク接続の上に構築された仮想ネットワークです。

オーバーレイネットワークを確立すると、ホスト間でより予測可能で均一なネットワーク環境を作成できます。 これにより、コンテナの実行場所に関係なく、コンテナ間のネットワークを簡素化できます。 単一の仮想ネットワークは複数のホストにまたがることも、特定のサブネットを統合ネットワーク内の各ホストに指定することもできます。

オーバーレイネットワークのもう1つの用途は、ファブリックコンピューティングクラスターの構築です。 ファブリックコンピューティングでは、複数のホストが抽象化され、単一のより強力なエンティティとして管理されます。 ファブリックコンピューティングレイヤーの実装により、エンドユーザーは個々のホストではなくクラスター全体を管理できます。 ネットワークは、このクラスタリングの大部分を果たします。

高度なネットワーク構成

他のプロジェクトでは、柔軟性を高めることでDockerのネットワーク機能を拡張しています。

Dockerのデフォルトのネットワーク構成は機能しますが、かなり単純です。 これらの制限は、クロスホストネットワーキングを扱うときに最も完全に表れますが、単一ホスト内でよりカスタマイズされたネットワーキング要件を妨げることもあります。

追加の「配管」機能により、追加の機能が提供されます。 これらのプロジェクトは、すぐに使用可能な構成を提供しませんが、手動でピースをつなぎ、複雑なネットワークシナリオを作成できます。 特定のホスト間でプライベートネットワークを確立することから、ブリッジ、VLAN、カスタムサブネット、ゲートウェイを構成することまで、さまざまな機能を利用できます。

また、Dockerを念頭に置いて開発されたものではありませんが、多くのツールとプロジェクトがあり、Docker環境で必要な機能を提供するためによく使用されます。 特に、ホスト間およびコンテナ間の安全な通信を提供するために、成熟したプライベートネットワーキングおよびトンネリングテクノロジーがよく利用されます。

Dockerネットワークを改善するための一般的なプロジェクトは何ですか?

Dockerホストにオーバーレイネットワークを提供することに焦点を当てたいくつかの異なるプロジェクトがあります。 一般的なものは以下のとおりです。

  • * flannel *:CoreOSチームによって開発されたこのプロジェクトは、各ホストシステムに共有ネットワークの独自のサブネットを提供するために最初に開発されました。 これは、Googleのkubernetesオーケストレーションツールが機能するために必要な条件ですが、他の状況では役立ちます。

  • * weave *:Weaveは、各ホストマシンを接続する仮想ネットワークを作成します。 これにより、すべてのコンテナが単一のネットワークスイッチに接続されているように見えるため、アプリケーションのルーティングが簡素化されます。

高度なネットワーキングの観点から、次のプロジェクトは、追加の配管を提供することにより、空室を埋めることを目的としています。

  • * pipework *:Dockerネイティブネットワーキングがさらに高度になるまでのギャップ対策として構築されたこのプロジェクトでは、任意の高度なネットワーク構成を簡単に構成できます。

Dockerに機能を追加するように選択された既存のソフトウェアの関連する例の1つは次のとおりです。

  • * tinc *:Tincは、トンネルと暗号化を使用して実装される軽量のVPNソフトウェアです。 Tincは、プライベートネットワークをあらゆるアプリケーションに対して透過的にすることができる堅牢なソリューションです。

結論

コンテナ化されたコンポーネントを介して内部および外部サービスを提供することは非常に強力なモデルですが、ネットワークの考慮事項が優先事項になります。 Dockerは、仮想インターフェイス、サブネット化、 `+ iptables +`およびNATテーブル管理の構成を通じて、この機能の一部をネイティブで提供しますが、より高度な構成を提供するために他のプロジェクトが作成されました。

https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-scheduling-and-orchestration [次のガイド]では、クラスター化されたコンテナー管理を提供するためにスケジューラーとオーケストレーションツールがこの基盤上でどのように構築されるかについて説明します機能。