Elasticsearch
docker

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