使用大使模式在多个Docker主机上的容器间通信

摘要

当Docker容器部署在多台服务器上时,容器之间需要进行通信。为了实现通信,有几种方法可供选择。

PipeworkでIPを割り当て、ホスト間でブリッジをGRE接続する。
各ホスト間でVPN接続する。
Ambassadorパターンで通信する。

使用Pipework或VPN进行通信时,由于需要在Docker之外进行配置,因此步骤变得繁多是一个缺点。

这次尝试使用Ambassador模式进行通信。
Ambassador模式是在每个Docker主机上配置一个充当代理的Ambassador容器。使用该模式,客户端和服务器容器可以隐藏具体的IP地址。

展示简单的概述图。

Docker_Ambassadorパターン.png

大使容器与常规容器一样包含操作系统,但是它是以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的组合进行通信,但是这种通信方式仍然依赖于环境变量,并没有涉及到在实际应用中如何进行通信。下次我们会考虑到如何从应用程序中进行通信并进行描述。

广告
将在 10 秒后关闭
bannerAds