Dockerチュートリアル:Dockerネットワーキングを始めましょう

Dockerの一般的な使用例はネットワークサービスであり、Dockerには、コンテナーが相互に通信したり、外部と通信したりできるようにする独自のネットワークモデルがあります。

元々、Dockerコンテナーは手動でネットワーク化するか、手動で外部に公開する必要がありました。現在のネットワークモデルでは、コンテナは同じホスト上(または異なるホスト間)でお互いを自動的に検出し、より制御された方法で世界全体に公開できます。

Dockerが開発者にコンテナーのネットワークを提供する基本的な方法は4つあります。最初の2つ、ブリッジネットワークとオーバーレイネットワークは、本番環境で最も一般的なユースケースをカバーしています。他の2つ、ホストネットワークとMacvlanネットワークは、あまり一般的ではないケースをカバーするために存在します。

Dockerネットワーキング:ブリッジネットワーク

ブリッジネットワークを使用すると、同じDockerホストで実行されているコンテナが相互に通信できます。Dockerの新しいインスタンスには、という名前のデフォルトのブリッジネットワークが付属してbridgeおり、デフォルトでは、新しく開始されたすべてのコンテナがそれに接続します。

bridgeネットワークは、多くの便利なアウトオブボックスのデフォルト値が付属していますが、彼らは生産に微調整が必要になる場合があります。たとえば、上のコンテナでbridgeは、すべてのポートが相互に公開されていますが、外部には公開されていません。これは、コンテナー間の通信をテストする必要があるが、ライブサービスをデプロイする必要がない場合に役立ちます。

最良の結果を得るには、独自のブリッジネットワークを作成してください。ユーザー定義のブリッジには、bridgeブリッジにはない多くの機能があります。

  • DNS解決は、カスタムブリッジ上のコンテナ間で自動的に機能します。このように、bridgeブリッジで行うように、生のIPアドレスを使用してそれらの間で通信する必要はありません。コンテナは、コンテナ名を使用してDNS経由で他のコンテナを見つけることができます。
  • コンテナは、実行中にカスタムブリッジに追加したり、カスタムブリッジから削除したりできます。
  • 環境変数は、カスタムブリッジ上のコンテナ間で共有できます。

つまり、デフォルトのブリッジを使用してコンテナをいじり始めることができますが、本格的な本番作業では、カスタムブリッジを作成する必要があります。

Dockerネットワーキング:オーバーレイネットワーク

ブリッジネットワークは、同じホスト上のコンテナ用です。オーバーレイネットワークは、Dockerスウォーム内のコンテナーなど、さまざまなホストで実行されているコンテナー用です。これにより、ホスト間のコンテナがお互いを見つけて通信できるようになり、参加している個々のコンテナごとにコンテナを設定する方法を心配する必要がなくなります。

Dockerのスウォームモードオーケストレーターは、オーバーレイネットワークを自動的に作成しますingress。デフォルトでは、群れのサービスはすべてに接続しingressます。ただし、デフォルトbridgeと同様に、デフォルトが適切でない可能性があるため、これは本番システムに最適な選択ではありません。最善の策は、群れの有無にかかわらず、カスタムオーバーレイネットワークを作成し、必要に応じてノードを接続することです。

群れで実行されていないコンテナでオーバーレイネットワークを使用する場合、それはカスタムオーバーレイネットワークを作成するための別のユースケースです。オーバーレイネットワーク上の各Dockerホストは、表示されるようにピアに対して適切なポートを開いている必要があり、スウォームモードがない場合、各ノードは何らかのキー値ストアにアクセスする必要があることに注意してください。

また、オーバーレイネットワークでは、デフォルトで256個の異なるIPアドレスしか許可されていないことに注意してください。この制限を上げることはできますが、Dockerでは代わりに複数のオーバーレイを使用することをお勧めします。

Dockerネットワーキング:ホストネットワーキング

hostネットワークドライバは、コンテナが彼らのネットワークスタックは、ホスト上のスタックと並んで実行しています。hostネットワークコンテナのポート80にあるWebサーバーは、ホスト自体のポート80から利用できます。

ホストネットワーキングの最大の恩恵はスピードです。コンテナポートへのアクセスを許可する必要があり、基盤となるOSにできるだけ近づけたい場合は、これが最適な方法です。ただし、柔軟性が犠牲になります。ポート80をコンテナーにマップすると、他のコンテナーはそのホストでそれを使用できなくなります。

Dockerネットワーキング:Macvlanネットワーキング

Macvlanネットワークは、ネットワークトラフィック監視アプリケーションなど、基盤となる物理ネットワークと直接連携するアプリケーション用です。macvlanドライバは、単にコンテナにIPアドレスを割り当てますが、だけでなく、物理MACアドレスはありません。

このタイプのDockerネットワークには、たとえばVMを使用して仮想MACアドレスを作成する場合と同じ警告が多数含まれていることに注意してください。つまり、Macvlanは、物理ネットワークアドレスに依存しない限り機能しないアプリケーション専用に予約する必要があります。

Dockerネットワーキング:ネットワークの作成と管理

Dockerでのすべてのネットワーク管理は、docker networkコマンドを使用して実行されます。そのサブコマンドの多くは、他のDockerコマンドと似ています。たとえば、docker network ls現在のDockerインスタンスに構成されているすべてのネットワークを表示します。

$ docker networklsネットワークID名ドライバースコープ2e0adaa0ce4aブリッジブリッジローカル0de3da43b973ホストホストローカル724a28c6d86dなしnullローカル

ネットワークを作成するcreateには、--driverフラグとともにサブコマンドを使用して、使用するドライバーを示します(bridge, overlay, macvlan):

$ docker network create --driver bridge my-bridge 

ホストネットワークコンテナでは、コンテナ用にネットワークを作成する必要はありません。代わりに、--network hostフラグを付けてコンテナを起動します。コンテナー上のすべてのプロセスは、事前構成されたポートでリッスンするため、それらが最初に設定されていることを確認してください。

ネットワークを作成するためのオプションには、他の手段を使用してネットワークを作成する場合と同様に、サブネット、IPアドレス範囲、およびネットワークゲートウェイを指定することも含まれます。

コンテナはデフォルトでbridgeネットワーク上で実行されます。特定のネットワークを使用するに--networkは、コンテナを起動するときにフラグを使用して、ネットワーク名を指定するだけです。

実行中のコンテナをネットワークとペアリングすることもできます。

$ docker network connect bridge my_container

これmy_containerbridgeネットワークに接続 しますが、既存のネットワーク接続は保持します。

コンテナがスピンダウンされると、それに関連付けられているネットワークはそのまま残ります。ネットワークを手動で削除する場合は、docket network rm コマンドを使用docker network pruneして削除するか、を使用して、ホストで使用されなくなったすべてのネットワークを削除できます。

DockerネットワーキングとKubernetesネットワーキング

オーケストレーションソリューションとしてKubernetesを検討しているが、Dockerネットワーク設定にすでにかなりの量の作業が費やされている場合、DockerとKubernetesがネットワークを処理する方法の間に1対1の対応がないことを聞いてもわくわくすることはありません。

詳細はKubernetesのドキュメントに記載されていますが、短いバージョンでは、ネットワークリソースの割り当て方法と管理方法について根本的に異なるモデルがあります。そのため、アプリケーション用にKubernetes固有のネットワーク設定を考案する必要があります。

考えられる中途半端なアプローチの1つは、Docker独自のネットワークコントロールと連携するKubernetes Container Network Interface(CNI)プラグインを使用することです。しかし、これはせいぜい暫定的な解決策です。ある時点で、独自のネットワークメタファーを使用してKubernetesプロジェクトを徹底的に構築する必要があります。