Dockerエコシステム:ネットワーキングとコミュニケーション

前書き

分散システムを構築して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ホストにオーバーレイネットワークを提供することに焦点を当てたいくつかの異なるプロジェクトがあります。 一般的なものは以下のとおりです。

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

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

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

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

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

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

結論

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

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