概要
Dockerコンテナが複数のサーバにデプロイされているときに、コンテナ同士が通信する必要がある。通信させるためには、いくつかの方法がある。
- PipeworkでIPを割り当て、ホスト間でブリッジをGRE接続する。
- 各ホスト間でVPN接続する。
- Ambassadorパターンで通信する。
Pipeworkや、VPNを使った通信ではDockerの外部で設定を行う必要があるため、手順が多くなるという欠点がある。
今回は、Ambassadorパターンで通信してみる。
Ambassadorパターンは、各DockerホストにプロキシとなるAmbassadorコンテナ配置する。このパターンを使うと、クライアントやサーバコンテナは具体的なIPを隠蔽することが可能になる。
簡単な概要図を示す。
Ambassadorコンテナも通常のコンテナと同様にOSも含まれているが、docker-ut(docker unittest)イメージを基礎として構築されており、フットプリントは非常に軽く、7MB程度である。
環境
クライアント側DockerホストIP: 172.12.8.151
サーバ側DockerホストIP: 172.12.8.152
サーバ側の起動
今回は、前回の記事で構築したElasticsearchのコンテナを使う。
Elasticsearchコンテナの起動
docker run -d -name elasticsearch reoring/docker-elasticsearch
サーバ側Ambassadorコンテナの起動
docker run -d -link elasticsearch:elasticsearch -name elasticsearch_ambassador -p 9200:9200 svendowideit/ambassador
接続確認
サーバ側Dockerホストから
% nc -vn 127.0.0.1 9200
Connection to 127.0.0.1 9200 port [tcp/*] succeeded!
クライアント側Dockerホストから
% nc -vn 172.12.8.152 9200
Connection to 172.12.8.152 9200 port [tcp/*] succeeded!
クライアント側の起動
docker run -d -name elasticsearch_ambassador -expose 9200 -e ELASTICSEARCH_PORT_9200_TCP=tcp://172.12.8.152:9200 svendowideit/ambassador
docker run -i -t -rm -link elasticsearch_ambassador:elasticsearch ubuntu /bin/bash
接続確認
直前に起動したクライアント側から、サーバ側にクエリを行なう。
curl -X GET http://$ELASTICSEARCH_PORT_9200_TCP_ADDR:9200/
結果
{
"ok" : true,
"status" : 200,
"name" : "Bill Foster",
"version" : {
"number" : "0.90.10",
"build_hash" : "0a5781f44876e8d1c30b6360628d59cb2a7a2bbb",
"build_timestamp" : "2014-01-10T10:18:37Z",
"build_snapshot" : false,
"lucene_version" : "4.6"
},
"tagline" : "You Know, for Search"
}
おわりに
今回は、Ambassadorと、Docker Linkの組み合せで通信を行なったが、環境変数に依存しており現実のアプリケーションでどのように通信するかまでは言及していない。次回ではどのようにしてアプリケーションから通信するかまでを踏まえて書いていく。