第32回 Dockerコンテナ同士の通信方法、フラットなネットワークを作る(前編)古賀政純の「攻めのITのためのDocker塾」(1/3 ページ)

複数の物理サーバで稼働するDockerコンテナ同士を通信させるには「Swarmクラスタ」を使います。実はSwarmクラスタを構成することなく、できる場合があります。今回からその方法を紹介していきましょう。

» 2016年12月14日 08時00分 公開

 前回は、複数の物理サーバで稼働する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)が採用されています。

docker 図.デフォルトのdocker0によるネットワーク構成

 NAT(またはNAPT)は、IPアドレスの枯渇問題に対応でき、ネットワーク資源の有効利用に大きく貢献できます。しかし規模の大小を問わず、「NATを使わない」ネットワーク構成も非常に多く存在します。NATを使わない背景には、全てのホストOS、コンテナ、仮想マシン、クライアントなどを1つのネットワークセグメントに所属させることで、ネットワーク構成を単純化し、ネットワーク管理を省力化したいというニーズなどがあります。

docker 図.NATの採用、不採用

 ハイパーバイザー型の仮想化環境に限らず、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アドレスを付与することができます。

docker 図.ブリッジdocker1にコンテナ用ネットワークを割り当てる
       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ