Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
56
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@reoring(Craftsman Software)
Organization

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

概要

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
56
Help us understand the problem. What are the problem?