【Docker】利用ambassador实现container跨主机连接
来源:互联网 发布:c 和c语言 编辑:程序博客网 时间:2024/05/16 11:36
针对于同一个主机上的两个container,我们可以使用docker的link机制来它们之间的连接,具体的连接方式可以参照docker主页的文章Linking Containers Together,这种连接方式不是本文的重点,所以不做详细解释。
然而,针对于不同主机上的两个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:
sudo docker run -d --name redis redis启动Ambassador1:
sudo docker run -d --link redis:redis --name ambassador1 -p 6379:6379 ambassador启动Ambassador2:(其中x.x.x.x表示VM1的ip地址)
sudo docker run -d --name ambassador2 --expose 6379 -e REDIS_PORT_6379_TCP=tcp://x.x.x.x:6379 ambassador
启动Redis Client:
sudo docker run -i -t --rm --link ambassador2:redis redis-cli
而Ambassador容器是如何利用linux端口映射socat来实现跨主机的通讯呢?
在svendowideit/Ambassador的Dockerfile里面,有一行关键的代码:
CMDenv | 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以后,可以查看里面的环境变量:
这种方式有一个缺点,就是在Ambassador2和Ambassador1建立连接的时候,Ambassador2必须要知道Ambassador1所在主机VM1的ip地址,从而硬编码设置环境变量REDIS_PORT_6379_TCP,这样灵活性就比较差,并且当我们不知道VM1的ip地址时,这种方法是无法使用的。
转载请注明出处:http://blog.csdn.net/sunset108/article/details/40856957
- 【Docker】利用ambassador实现container跨主机连接
- 利用ambassador实现container跨主机连接
- 使用ambassador实现container跨主机通信
- 【Docker容器的跨主机访问】-【使用网桥实现跨主机容器连接】
- 【Docker容器的跨主机访问】- 使用Open vSwitch实现跨主机容器连接
- 【Docker容器的跨主机访问】- 使用weave实现跨主机容器连接
- Docker实现跨主机容器实例网络通信(2)——利用OpenVSwitch构建多主机Docker网络
- Docker实现跨主机容器实例网络通信(1)——利用LinuxBridge构建多主机Docker网络
- Docker容器的跨主机连接
- Docker之跨主机容器连接-yellowcong
- 利用虚拟网桥实现Docker容器的跨主机访问
- (菜汪学docker)docker+macVlan实现容器跨主机
- ssh远程连接docker中的container
- ssh远程连接docker中的container
- 利用OpenVSwitch构建多主机Docker网络
- Docker 1.9 Overlay Network实现跨主机网络互通
- Docker实践 -- 使用Open vSwitch实现跨主机通信
- 基于OVS+VXLAN实现Docker容器跨主机通讯
- 配置(rsa验证方式的)ssh免密码连入
- Android之监听短信变化
- ceph存储 ceph的CRUSH算法的源码分析
- Struts2的工作原理
- jQuery中的on()和click()的区别
- 【Docker】利用ambassador实现container跨主机连接
- pdf转换器免费版下载使用
- 淘宝皇冠店转让 接手者小心有麻烦
- study list
- android 圆角背景
- QT5程序发布dll依赖
- C# Serializable(转)
- 音视频二次技术推荐
- 利用RCurl包完成自己感兴趣的团购信息【批量】抓取