序章

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

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

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

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

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

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

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

同じホスト上の他のコンテナーは、追加の構成なしで、隣接するコンテナーによって提供されるサービスにアクセスできます。 ホストシステムは、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テーブル管理を通じてこの機能の一部をネイティブに提供しますが、より高度な構成を提供するために他のプロジェクトが作成されています。

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