序章

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

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

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

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

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

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

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

同じホスト上の他のコンテナーは、追加の構成なしで、隣接するコンテナーによって提供されるサービスにアクセスできます。 ホストシステムは、 docker0 適切な場所へのインターフェース。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

高度なネットワーキング構成

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

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

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

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

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

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

  • francel :CoreOSチームによって開発されたこのプロジェクトは、当初、各ホストシステムに共有ネットワークの独自のサブネットを提供するために開発されました。 これは、Googleのkubernetesオーケストレーションツールが機能するために必要な条件ですが、他の状況でも役立ちます。
  • weave :Weaveは、各ホストマシンを相互に接続する仮想ネットワークを作成します。 これにより、すべてのコンテナが単一のネットワークスイッチに接続されているように見えるため、アプリケーションのルーティングが簡素化されます。

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

  • pipework :Dockerネイティブネットワーキングがより高度になるまでの一時的な手段として構築されたこのプロジェクトでは、任意の高度なネットワーキング構成を簡単に構成できます。

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

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

結論

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

次のガイドでは、スケジューラーとオーケストレーションツールがこの基盤の上に構築され、クラスター化されたコンテナー管理機能を提供する方法について説明します。