针对于同一个主机上的两个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。

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

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

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

启动Redis Server:

[plain] view plaincopy
  1. sudo docker run -d --name redis redis

启动Ambassador1:

[plain] view plaincopy
  1. sudo docker run -d --link redis:redis --name ambassador1 -p 6379:6379 ambassador

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

[plain] view plaincopy
  1. sudo docker run -d --name ambassador2 --expose 6379 -e REDIS_PORT_6379_TCP=tcp://x.x.x.x:6379 ambassador

启动Redis Client:

[plain] view plaincopy
  1. sudo docker run -i -t --rm --link ambassador2:redis redis-cli

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

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

[plain] view plaincopy
  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地址时,这种方法是无法使用的。

利用ambassador实现container跨主机连接相关推荐

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

    针对于同一个主机上的两个container,我们可以使用docker的link机制来它们之间的连接,具体的连接方式可以参照docker主页的文章Linking Containers Together, ...

  2. 如何使用Calico实现跨主机Docker网络通信

    写在前面 学习K8s,学到这里,整理记忆, 本文用于理解K8s网络中Calico网路方案的原理优缺点 内容包括: 常见的容器跨主机通信方案简介 Caliao实现Container跨主机通信简述 Cal ...

  3. 8天入门docker系列 —— 第七天 让你的container实现跨主机访问

    当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你 借助docker自带的overlay ...

  4. Docker 网络模型/overlay 跨主机网络

    之前说了overylay fs,但是运行一个容器进程还需要最后一步,就是它的网络配置. docker本身在创建之初就有自己的网络驱动器,叫container network manager,CNM,本 ...

  5. Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问

    前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址.Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Over ...

  6. Docker的网络模式和跨主机通信

    文章转载自:http://www.a-site.cn/article/169899.html Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0 ...

  7. 【linux系统编程】远程登录工具ssh | 跨主机远程拷贝scp

    远程登录工具ssh && 跨主机远程拷贝scp 正文开始@Assassin 目录: 远程登录工具ssh && 跨主机远程拷贝scp 1. ssh简介: 2. ssh基本 ...

  8. Paper Note - 基于高效数据流标记和跟踪的可精炼跨主机攻击调查

    原文标题:Enabling Refinable Cross-Host Attack Investigation with Efficient Data Flow Tagging and Trackin ...

  9. K8S探索之Service+Flannel本机及跨主机网络访问原理详解

    简介 在上篇中,我们部署了我们的应用,但我们访问是直接在应用所在的容器,使用IP+Port的方式直接访问的,style不够k8s,本篇文章我们将使用service和跨主机访问 内容概览 目前我们的应用 ...

最新文章

  1. ssh 连接_怎样解决Linux环境下远程连接ssh速度慢的问题
  2. Deverpress 中国代理商使用 官方地址
  3. 七大排序的个人总结(二) 归并排序(Merge
  4. nginx指定路径运行
  5. 如何用ZBrush快速绘制身体
  6. java泛型方法实现数值类型加法
  7. android timepicker 设置颜色,android – 更改TimePicker文本颜色
  8. AlertManager警报通知 E-mail 微信 模板
  9. python输出去空格_python不空格
  10. wifi 计算机配置正确但,您的计算机配置似乎是正确的,但该设备或资源(DNS服务器)没有响应...
  11. 全国计算机等级三级网络技术试卷详解(二)
  12. S9赛季:盗贼竞技场\插旗中技巧攻…
  13. BP算法双向传,链式求导最缠绵(深度学习入门系列之八)
  14. C++ STL?看这篇就够啦。草履虫都能学会的STL教程!
  15. linux如何查看当前目录的完整路径
  16. js ↵ 换行 转换 br /n
  17. mt5_MetaTrader5_模块下载备忘。
  18. 10个免费素材网站盘点,有大量优质贴图和纹理素材
  19. 小白学习怎么安装黑苹果
  20. 小学计算机兴趣班培训总结,关于兴趣班的活动总结

热门文章

  1. string字符串的高级用法
  2. cocos2d JS 源生js实现each方法
  3. 数据结构之各排序算法
  4. 6.1-6.4 压缩打包介绍,压缩工具gzip,bzip2, xz
  5. Python学习之路-基础知识1
  6. Js toString()方法笔记
  7. leetcode - Search in Rotated Sorted Array II
  8. 在Ubuntu下如何切换到超级用户
  9. FileSystemObject ADO WScript.Shell
  10. Google Update Service 被曝提权 0day,谷歌拒绝修复