Help us understand the problem. What is going on with this article?

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

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

reoring
株式会社クラフトマンソフトウェア代表 | Schoo講師 | 分報発祥の会社 | YYPHP主催 | マンガでわかるDocker監修 | 実践ドメイン駆動設計レビュア | 自動受け入れテスト ShouldBee http://shouldbee.at/
http://c16e.com/
shouldbee
開発者向けテスト支援サービスShouldBeeを開発・運営するスタートアップ(onlab第8期)
http://shouldbee.at
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした