使用ambassador实现container跨主机通信

转载 2015年07月08日 12:26:20

实验容器:
主机A:Redis Server和Ambassador1
主机B:Redis Client和Ambassador2

通信流程:
1.Ambassador1容器通过link方式确定Redis Server容器的ip地址和开放的6379端口,然后利用socat将容器内部的6379端口收到的信息重定向到RedisServer容器的6379端口;

2.主机A将自己的6379端口绑定到Ambassador1容器的6379端口;

3.Ambassador2通过传入环境变量的方式确定主机A的ip地址和6379端口,然后利用socat将容器内部的6379端口收到的信息重定向到主机A的6379端口;

4.Redis Client容器通过link方式确定Ambassador2容器的ip地址和开放的6379端口,然后用redis-cli直接连接,连接请求将经过Ambassador2、Ambassador1,最后发送到Redis Server的6379端口

操作流程:
1.启动redis server容器
主机A:docker run -d –name redis learn01/redis

2.启动Ambassador1容器,将redis server容器的6379端口及Ambassador1容器的6379端口绑定,并将Ambassador1容器的6379端口和主机A的6379端口绑定
主机A:docker run -d –link redis:redis –name ambassador1 -p 6379:6379 svendowideit/ambassador

3.启动Ambassador2容器,将Ambassador2容器的6379端口和主机A的6379端口绑定
主机B:docker run -d –name ambassador2 –expose 6379 -e REDIS_PORT_6379_TCP=tcp://192.168.2.43:6379 svendowideit/ambassador

4.启动redis-cli容器绑定Ambassador2的6379端口
主机B:docker run -i -t –rm –link ambassador2:redis relateiq/redis-cli

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

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://192.168.2.43:6379就是用于提取信息的环境变量,其中REDIS为Redis Server的在Ambassador1中的别名,是我们在link的时候制定的;6379为Redis Server开放的6379端口,用于提供Redis服务;192.168.2.43为Redis Server的ip地址。如此,Ambassador1就能知道Redis Server服务的ip和端口,就能通过socat将redis访问请求转发给Redis Server。同理,我们就可以建立Redis Client——Ambassador2——Ambassador1——Redis Server的连接。
这种方式有一个缺点,就是在Ambassador2和Ambassador1建立连接的时候,Ambassador2必须要知道Ambassador1所在主机A的ip地址,从而硬编码设置环境变量REDIS_PORT_6379_TCP,这样灵活性就比较差,并且当我们不知道主机A的ip地址时,这种方法是无法使用的。

相关文章推荐

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

针对于不同主机上的两个container,docker目前并没有提供直接有效的方法来实现它们之间的连接,必须借助其它工具来实现。docker主页的文章Link via an Ambassador Co...

overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理。

实现两台MPTCP主机之间的通信——VSFTPD的配置与使用

VSFTPD是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。VSFTPD是一个UNIX类操作系统上运行的服务器的名字,它可以运行在诸如Linux、BSD、Sola...

容器跨主机通信之NAT

NAT分为DNAT和SNAT,更多看:http://blog.daocloud.io/docker-bridge/ 默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。...

容器跨主机通信之docker default overlay

default docker overlay基于libnetwork和libkv,这里使用etcd作为key value store VM1: 129.107.126.123 VM2: 129...

Docker网络基础---Docker跨主机容器访问通信

在同一宿主机下的Docker的容器之间是默认互相联通的。通过docker inspect id或name可以查看到ip地址。在不通的容器中来执行ping是可以ping通的。但我们通过观察发现,每一个...
  • canot
  • canot
  • 2016-10-22 23:36
  • 6400

容器跨主机通信之weave

Weave github: https://github.com/weaveworks/weave 关于weave原理的描述: Weave creates a network bridge...

Docker网络管理及容器跨主机通信

1、网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)