Docker:使用Ambassador进行跨主机间容器通信
转载请注明出处:点我
由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情。可以利用Ambassador容器来实现这一功能。
基本原理:
利用Ambassador来实现主机间容器进行通信时,需要在两台需要通信的容器的主机上都启动Ambassador容器。由Ambassador容器提供数据转发服务。
当客户端主机上的容器client_container想要同服务器端主机上的容器server_container通信时,client_container容器直接访问同一台主机上运行的client_ambassador容器,请求会被client_ambassador容器转发出去,达到服务端主机。服务端Ambassador容器server_ambassador监听在对应的端口,收到请求后再转发给服务器容器server_container。
下面是一个示例:
主机A为服务器端,上面运行了一个运行Flask程序的容器server_container,主机B为客户端,上面运行一个容器client_container来访问主机A上面的Flask程序。先来看看主机A上面的启动server_container的image的Dockerfile文件:
FROM ubuntu
MAINTAINER rio_2607 j_huang@126.com RUN apt-get update
RUN apt-get install -y python-pip
RUN pip install flask ADD app.py /app
WORKDIR /app
EXPOSE 5002
CMD ["python'","app.py"]
从上面的代码可以看到,我们把app.py文件复制到了/app目录下,在把工作目录切换到了/app目录下面,之后开放了5002端口,这一点很重要,开放的端口会影响后面的命令,然后在容器启动的时候会执行app.py文件。现在来看下app.py文件中的代码:
from flask import Flask app = Flask(__name__) @app.route('/')
def hello():
return "Hello World" if "__main__" == __name__:
app.run(host="0.0.0.0",port=5002,debug=True)
代码很简单,不用解释。启动容器server_container:
sudo docker run -d --name flask rio_2607/flask
现在在主机A上面启动ambassador容器,并把flask容器link到这个ambassador容器上面去:
sudo docker run -d --name server_ambassador --link flask:flask_f -p 5002:5002 svendowideit/ambassador
上面命令中可以看到flask link后的别名是flask_f,这一点很重要,因为这会影响到server_ambassador的环境变量名字,也就会影响之后的命令。现在进入这个server_ambassador里面看下环境变量:
sudo docker exec -it server_ambassador /bin/sh
进入之后使用env命令可以查看到下面的环境变量当前容器的环境变量:
可以看到环境变量军事以FLASK_F开头的,我们接下来会使用FLASK_F_PORT_5002_TCP这个环境变量。
接下来我们在主机B上面启动ambassador容器,命令如下:
sudo docker run -d --name client_ambassador --expose 5002 -e FLASK_F_PORT_5002_TCP=tcp://10.31.181.84:5002 svendowideit/ambassador
在上面这条命令中,我们传入了FLASK_F_PORT_TCP这个环境变量,这个变量就是之前使用env命令看到的,这里要把IP地址替换成运行改容器的主机,也就是主机A的IP地址。
接下来我们要启动一个容器client_container来访问主机A上面的Flask程序。这里我们仅仅是启动一个ubuntu容器,安装curl程序,启动容器时,要把之前启动的client_ambassador容器挂接过来。命令如下:
sudo docker run -it --rm --link client_ambassador:am ubuntu /bin/bash
上面的命令中,我们把ambassador挂接到client_container容器中,别名为am。现在,我们已经进入到了这个client_container中,安装curl
apt-get update
apt-get install -y curl
安装完curl之后,使用curl来访问主机A上面的Flask程序,这是通过使用别名am来实现的
curl am:5002
命令执行完成之后,可以看到结果如下:
可以看到curl命令返回了Hello World,表明主机B上面的client_container容器成功的访问到了主机A上面的flask容器。
注意:在使用Ambassador容器实现容器跨主机通信的时候,Ambassador暴露出的端口最好要跟服务器端容器(本文中是flask容器,暴露出5002端口)暴露一致。我在实验的过程中把--expose 5002端口改成了其他的端口,curl命令连接失败,跨主机通信失败,原因暂时还没有查明。
使用Ambassador只能实现一对多的容器跨主机通信,也就是说一台机器A充当服务器,其他的机器统一访问机器A,无法实现多对多的通信。
集群的话可以使用Docker公司的swarm来进行管理,接下来准备研究下swarm。
Docker:使用Ambassador进行跨主机间容器通信的更多相关文章
- centos7下安装docker(15.1跨主机网络)
之前学习了单个host上的网络,我们知道单个host上的网络有:none,host,bridge和joined,他们解决了单个host上面的容器通信的问题:接下来我们讨论跨主机间容器通信的方案 跨主机 ...
- [docker]使用quaaga实现(rip ospf)实现主机间容器互通
使用quaaga实现(rip ospf)实现主机间容器互通 - n1设置 brctl addbr br0 ip a a 10.1.1.1/24 br0 ip a a 10.1.1.1/24 dev b ...
- 测试docker不同主机间容器互相访问
测试服务器(centos6.5):192.168.16.70 网卡:eth0192.168.16.74 网卡:eth0第一步,分别在2台机器执行: yum install docker service ...
- centos7下安装docker(15.6docker跨主机网络---Weave)
Weave是weaveworks开发的容器网络解决方案.weave创建的虚拟网络可以将部署在多个主机上的容器连接起来.对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端 ...
- centos7下安装docker(15.4跨主机网络-flannel)
flannel是CoreOS开发的容器网络解决方案,flannel为每一个host分配一个subnet,容器从这些subnet中分配IP,这些IP可以在host之间路由,容器无需NAT和port ma ...
- centos7下安装docker(15.3跨主机网络-macvlan)
除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个int ...
- centos7下安装docker(15.2跨主机网络-overlay)
为支持容器跨主机通信,Docker提供了overlay driver,使用户可以创建基于VxLAN的overlay网络.VxLAN可将二层数据封装到UDP进行传输,VxLAN提供与VLAN相同的以太网 ...
- docker swarm 搭建及跨主机网络互连案例分析
准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...
- Docker使用rexray做跨主机存储
Rex-Ray 是一个优秀的 Docker volume driver,不过只有最新版docker才支持. Rex-Ray 以 standalone 进程的方式运行在 Docker 主机上,安装方法很 ...
随机推荐
- 链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 返回了消息 "未指定的错误"。[手稿]
消息 7302,级别 16,状态 1,第 1 行 无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.JET.OLEDB.4.0&qu ...
- 动软Model 模板 生成可空类型字段
动软代码 生成可空类型 <#@ template language="c#" HostSpecific="True" #> <#@ outpu ...
- 单源最短路径的Bellman-Ford 算法
1.算法标签 BFS 2.算法概念 Bellman-Ford算法有这么一个先验知识在里面,那就是最短路径至多在N步之内,其中N为节点数,否则说明图中有负权值的回路,这样的图是找不到最短路径的.因此Be ...
- 设计模式知识搜集(c++)
理解设计模式有两种途径,一种是看UML类图,一种是看代码理解实例,UML(一个简单的介绍)看懂了对理解设计模式大有裨益,代码容易陷进去,因此最好能找到适当且易于理解的应用场景,这下面实际上每个都是我收 ...
- Python实现模拟登陆
大家经常会用Python进行数据挖掘的说,但是有些网站是需要登陆才能看到内容的,那怎么用Python实现模拟登陆呢?其实网路上关于这方面的描述很多,不过前些日子遇到了一个需要cookie才能登陆的网站 ...
- 关于面试mysql优化的几点纪要
1.减少查询次数 ,如何减少 ? 2. 表结构优化,如何优化 ? 3. 列选取原则 ? 4.建索引原则 ? 5.mysql语句优化 ? 6.增加mysql处理性能 ? 通过这几点, 再来说 ...
- c# webbrowser获取滚动条最大值
int HeightMax = 0; int WidthMax =0; HeightMax = webBrowser1.Document.Body.ScrollRectangle.Height-web ...
- VS2012打包部署Winform程序
打包前的准备工作: 新建一个打包部署项目,点OK,如果是第一次使用的话,会打开一个网页,按照提示的步骤来做, 点击上面的step2的网址,进入到另一个网页: 填写完右边的信息,点击“download ...
- Spark1.0.x入门指南
1 节点说明 IP Role 192.168.1.111 ActiveNameNode 192.168.1.112 StandbyNameNode,Master,Worker 192.168.1. ...
- Hadoop开发环境简介(转)
1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...