複数の物理サーバで稼働するDockerコンテナ同士を通信させるには「Swarmクラスタ」を使います。実はSwarmクラスタを構成することなく、できる場合があります。今回からその方法を紹介していきましょう。
前回は、複数の物理サーバで稼働するDockerコンテナ同士を通信させる「Swarmクラスタ」を紹介しました。Dockerでは、Swarmを使ったクラスタ以外にもさまざまなネットワーク構成を実現できます。Swarmは複数のコンテナで通信を行う場合に必要な仕組みですが、Swarmクラスタを構成せずに、複数の物理サーバで稼働するコンテナ同士で通信させたい場合もあります。今回と次回は、Swarmを使わずにマルチホストでDockerコンテナ同士を通信させる方法を紹介します。
復習:1台の物理マシンで稼働するDockerの標準的なネットワーク
連載第29回では、デフォルトのブリッジインタフェース「docker0」を経由して外部に接続する一般的な方法を取り上げました。Dockerのデフォルト構成ではブリッジdocker0が割り当てられ、docker0には、172.17.0.0/16のネットワークセグメント(本連載では、「独自のプライベートIPのLANセグメント」と呼ぶことにします)に所属するIPアドレスが自動的に割り当てられます。
1台のホストOS上で稼働する複数のコンテナ同士は、この「独自のプライベートIPのLANセグメント」で通信が可能ですが、ホストOSのブリッジインタフェース「docker0」の外部にある別のホストと、「独自のプライベートIPのLANセグメント」に所属するコンテナは別々のセグメントに所属するため、NAT(Network Address Translation)を使ったIPアドレス変換の仕組みやポート変換の仕組みが必要であることも連載第29回で紹介しました。
Docker環境に限らず、NATを使ったIPアドレスの変換は多くの企業や組織体で採用されており、一般的なネットワーク技術です。またNAT以外に、ポート番号の変換も広く利用されています。欧米の企業で使われているDocker環境では、膨大なマイクロサービスがコンテナとして起動されることが多く、IPアドレスやポート番号の枯渇問題に対処するため、多くの企業でNAT(またはポート番号の変換を含めたNAPT)が採用されています。
NAT(またはNAPT)は、IPアドレスの枯渇問題に対応でき、ネットワーク資源の有効利用に大きく貢献できます。しかし規模の大小を問わず、「NATを使わない」ネットワーク構成も非常に多く存在します。NATを使わない背景には、全てのホストOS、コンテナ、仮想マシン、クライアントなどを1つのネットワークセグメントに所属させることで、ネットワーク構成を単純化し、ネットワーク管理を省力化したいというニーズなどがあります。
ハイパーバイザー型の仮想化環境に限らず、Docker環境においてもNATとポート変換を使わずに、ホストOSとコンテナを同一セグメントに所属させたいというニーズは少なくありません。Swarmによるマルチホストでのコンテナ間通信を連載第30回と第31回で紹介しましたが、Swarmの機能を使わずに、ホストOSとコンテナを同一LANセグメントに所属させ、マルチホストによるコンテナ同士の通信を行う構成も可能です。
Swarmを構成せず、マルチホストでのコンテナ間通信を行う代表的な手段には、ホストOS側で独自のブリッジネットワークを作成する方法があります。この方法は、Dockerエンジンが稼働するホストOS側で独自のブリッジネットワークを作成します。ホストOSが所属するLANセグメントにブリッジネットワークを所属させることで、コンテナとホストOSが同一LANに所属することができ、結果的にマルチホストによるコンテナ間の通信が可能になります。
例えば下図のように、ホストOSのブリッジインタフェース「docker1」に対して、172.16.X.X/16のIPアドレス(ホストAは、172.16.44.254/16、ホストBは、172.16.44.253/16)を割り当てます。このブリッジは、ホストOSが稼働する物理マシンのNICのeth0に対応しており、ホストOSは、外部のマシンと172.16.0.0/16のネットワークセグメントで通信します。また、ホストOSに作成した独自のブリッジ「docker1」と同一セグメントのdockerコンテナ用ネットワーク(下図の例では、mynet1)を作成することができます。このdocker用のネットワーク「mynet1」に所属するコンテナは、ホストOSと同一セグメントの固定IPアドレスを付与することができます。
Copyright © ITmedia, Inc. All Rights Reserved.