Edited at

Ambassadorパターンを使った複数のDockerホストにおけるコンテナ間通信

More than 3 years have passed since last update.


概要

Dockerコンテナが複数のサーバにデプロイされているときに、コンテナ同士が通信する必要がある。通信させるためには、いくつかの方法がある。



  • PipeworkでIPを割り当て、ホスト間でブリッジをGRE接続する。

  • 各ホスト間でVPN接続する。

  • Ambassadorパターンで通信する。

Pipeworkや、VPNを使った通信ではDockerの外部で設定を行う必要があるため、手順が多くなるという欠点がある。

今回は、Ambassadorパターンで通信してみる。

Ambassadorパターンは、各DockerホストにプロキシとなるAmbassadorコンテナ配置する。このパターンを使うと、クライアントやサーバコンテナは具体的なIPを隠蔽することが可能になる。

簡単な概要図を示す。

Docker_Ambassadorパターン.png

Ambassadorコンテナも通常のコンテナと同様にOSも含まれているが、docker-ut(docker unittest)イメージを基礎として構築されており、フットプリントは非常に軽く、7MB程度である。


環境

クライアント側DockerホストIP: 172.12.8.151

サーバ側DockerホストIP: 172.12.8.152


サーバ側の起動

今回は、前回の記事で構築したElasticsearchのコンテナを使う。


Elasticsearchコンテナの起動


run_elasticsearch_container

docker run -d -name elasticsearch reoring/docker-elasticsearch



サーバ側Ambassadorコンテナの起動


run_elasticsearch_ambassador_container

docker run -d -link elasticsearch:elasticsearch -name elasticsearch_ambassador -p 9200:9200 svendowideit/ambassador



接続確認


サーバ側Dockerホストから


netcat_on_server

% nc -vn 127.0.0.1 9200

Connection to 127.0.0.1 9200 port [tcp/*] succeeded!


クライアント側Dockerホストから


netcat_on_client

% nc -vn 172.12.8.152 9200

Connection to 172.12.8.152 9200 port [tcp/*] succeeded!


クライアント側の起動


run_ambassador

docker run -d -name elasticsearch_ambassador -expose 9200 -e ELASTICSEARCH_PORT_9200_TCP=tcp://172.12.8.152:9200 svendowideit/ambassador



test_shell

docker run -i -t -rm -link elasticsearch_ambassador:elasticsearch ubuntu /bin/bash



接続確認

直前に起動したクライアント側から、サーバ側にクエリを行なう。

curl -X GET http://$ELASTICSEARCH_PORT_9200_TCP_ADDR:9200/


結果


result

{

"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の組み合せで通信を行なったが、環境変数に依存しており現実のアプリケーションでどのように通信するかまでは言及していない。次回ではどのようにしてアプリケーションから通信するかまでを踏まえて書いていく。