中国领先的IT技术网站
|
|

【Docker】利用ambassador实现container跨主机连接

针对于不同主机上的两个container,docker目前并没有提供直接有效的方法来实现它们之间的连接,必须借助其它工具来实现。docker主页的文章Link via an Ambassador Container介绍了一种方法,通过ambassador pattern来实现container跨主机连接,这里对这种方法做一下解释。

作者:低调de走过来源:sunset108的专栏|2014-11-11 15:25


针对于同一个主机上的两个container,我们可以使用docker的link机制来它们之间的连接。

然而,针对于不同主机上的两个container,docker目前并没有提供直接有效的方法来实现它们之间的连接,必须借助其它工具来实现。docker主页的文章Link via an Ambassador Container介绍了一种方法,通过ambassador pattern来实现container跨主机连接,这里对这种方法做一下解释。

主机VM1上有装有Redis Server的container,主机VM2上有装有Redis Client的container,为了实现Redis Client和Redis Server之间跨主机的连接,需要借助Ambassador容器,这里VM1上有一个Ambassador容器Ambassador1,VM2上有一个Ambassador容器Ambassador2。

这个方法是如何工作的呢?我们看一下下面的流程:

Ambassador1容器通过link方式确定Redis Server容器的ip地址和开放的6379端口,然后利用socat将容器内部的6379端口收到的信息重定向到RedisServer容器的6379端口;
VM1将自己的6379端口绑定到Ambassador1容器的6379端口;
Ambassador2通过传入环境变量的方式确定VM1的ip地址和6379端口,然后利用socat将容器内部的6379端口收到的信息重定向到VM1的6379端口;
Redis Client容器通过link方式确定Ambassador2容器的ip地址和开放的6379端口,然后用redis-cli直接连接,连接请求将经过Ambassador2、Ambassador1,最后发送到Redis Server的6379端口。

启动这4个container的命令如下:

启动Redis Server:

  1. sudo docker run -d --name redis redis 

启动Ambassador1:

  1. sudo docker run -d --link redis:redis --name ambassador1 -p 6379:6379 ambassador 

启动Ambassador2:(其中x.x.x.x表示VM1的ip地址)

  1. sudo docker run -d --name ambassador2 --expose 6379 -e REDIS_PORT_6379_TCP=tcp://x.x.x.x:6379 ambassador 

启动Redis Client:

  1. sudo docker run -i -t --rm --link ambassador2:redis redis-cli 

而Ambassador容器是如何利用linux端口映射socat来实现跨主机的通讯呢?

在svendowideit/Ambassador的Dockerfile里面,有一行关键的代码:

  1. CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/'  | sh && top 

这行代码的用法是在环境变量中找到包含"_TCP"的行,然后将从满足正则表达式".*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)"的环境变量中提取ip和端口号,并执行"socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&",其中/1表示环境变量名中指示端口号,/2表示ip地址,/3表示端口号。这个环境变量之所以这么命名,是由于docker link的机制是将被link的container的ip、端口、协议等信息以环境变量的形式放到link中去。

以Ambassador1为例,我们在启动Ambassador1以后,可以查看里面的环境变量:

这里REDIS_PORT_6379_TCP=tcp://172.17.0.2:6379就是用于提取信息的环境变量,其中REDIS为Redis Server的在Ambassador1中的别名,是我们在link的时候制定的;6379为Redis Server开放的6379端口,用于提供Redis服务;172.17.0.2为Redis Server的ip地址。如此,Ambassador1就能知道Redis Server服务的ip和端口,就能通过socat将redis访问请求转发给Redis Server。同理,我们就可以建立Redis Client——Ambassador2——Ambassador1——Redis Server的连接。

这种方式有一个缺点,就是在Ambassador2和Ambassador1建立连接的时候,Ambassador2必须要知道Ambassador1所在主机VM1的ip地址,从而硬编码设置环境变量REDIS_PORT_6379_TCP,这样灵活性就比较差,并且当我们不知道VM1的ip地址时,这种方法是无法使用的。

原文出自:http://blog.csdn.net/sunset108/article/details/40856957

【编辑推荐】

  1. 文思海辉:2015云计算成主角 云生态进一步完善和深化
  2. 云计算改变的不只是科技企业的运行方式
  3. 预计2018年云计算将占数据中心四分之三
  4. Joyent 开源其中心云计算和容器管理工具
  5. 云计算如何改变数据保护
【责任编辑:Ophira TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

视频课程+更多

【跟赵班长学云计算】OpenStack企业私有云实践V1.0【请购买V2.0版本】

【跟赵班长学云计算】OpenStack企业私有云实

讲师:赵班长23841人学习过

2014 WOT软件技术峰会

2014 WOT软件技术峰会

讲师:WOT峰会1958人学习过

高级篇

高级篇

讲师:老段2人学习过

读 书 +更多

网管员必读——网络组建(第2版)

《网管员必读——网络组建(第2版)》仍是以一个中等规模的模拟局域网组建为思路,较全面地介绍了与局域网组建相关的各方面知识和组建、配...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊