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文件:

 1 FROM ubuntu
 2 MAINTAINER rio_2607 [email protected].com
 3
 4 RUN apt-get update
 5 RUN apt-get install -y python-pip
 6 RUN pip install flask
 7
 8 ADD app.py /app
 9 WORKDIR /app
10 EXPOSE 5002
11 CMD ["python‘","app.py"]

从上面的代码可以看到,我们把app.py文件复制到了/app目录下,在把工作目录切换到了/app目录下面,之后开放了5002端口,这一点很重要,开放的端口会影响后面的命令,然后在容器启动的时候会执行app.py文件。现在来看下app.py文件中的代码:

 1 from flask import Flask
 2
 3 app = Flask(__name__)
 4
 5 @app.route(‘/‘)
 6 def hello():
 7      return "Hello World"
 8
 9 if "__main__" == __name__:
10     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。

时间: 2024-10-12 16:12:24

Docker:使用Ambassador进行跨主机间容器通信的相关文章

如何实现docker跨主机之间容器通信问题(方法二)

主机名 宿主机IP 容器分配网段 启动容器的IP testa 192.168.1.105 172.172.0.0/24 172.172.0.10 testb 192.168.1.106 172.172.1.0/24 172.172.1.10 1.在testa主机上创建docker桥接网络 docker network create --subnet=172.172.0.0/24 docker-br0 2.在testb主机上创建docker桥接网络 docker network create --

Docker容器跨主机多网段通信解决方案

实现Docker的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署consul服务实现Docker容器跨主机通信 ,但是consul服务并不能实现多个网段跨主机进行通信,在这种情况之下,MacVlan的概念就应用而生了. Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从

10: docker 跨主机的容器间通信(macvlan / overlay )

docker 跨主机的容器间通信(macvlan) 作用: 虚拟多个mac地址,虚拟出多个网卡给容器用. #创建macvlan网络 docker network create --driver macvlan(要创建的网络类型) --subnet  子网IP段  --gateway 本机网关 -o parent=本机网卡  创建的macvlan网络名称 [[email protected] ~]# docker network create --driver macvlan --subnet 1

[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 br0 ip l s dev br0 up systemctl stop docker dockerd -b=br0 docker run -itd --name=router --privileged --net=host georce/router - n2设置 brctl addbr br0 i

Docker网络之部署跨主机网络overlay

dcoker网络: none网络:什么都没有的网络.它的是使用常见:封闭空间意味着隔离,安全,比如生成随机码.host网络:网络配置与dockerhost完全相同.应用场景:性能好,但是没有灵活性,容易出现端口冲突问题.brigde网络: 默认的网络驱动默认,用以实现主机网络接口与虚拟网络接口间的通信. 部署网络的基本操作命令: //查看docker服务器中的网络:[[email protected] ~]# docker network ls//查看桥接网络:[[email protected

docker部署Macvlan实现跨主机网络通信

基本概念: Macvlan工作原理: Macvlan是Linux内核支持的网络接口.要求的Linux内部版本是v3.9–3.19和4.0+: 通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址.虚拟出来的子接口将直接暴露在相邻物理网络中.从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样: 物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡. 当容器需要直连入物理网络时,可以使用Macvlan.Macvlan本身不创建网

Docker学习总结之跨主机进行link

Docker学习总结之跨主机进行link Docker的功能非常强大,但要想驾驭好Docker却不是一件很容易的事情.下面就介绍一种日常工作中会遇到的一个user case.比如现在有两台host,分别标记为hostA和hostB.hostA用来运行oracle服务,hostB用来运行app服务. hostB中app产生的数据需要实时写入hostA中的oracle数据库.也就是hostB中的docker container需要link hostA中的docker container. 为了解决这

docker1.9网络新特性,overlay网络实现主机间容器互联

Docker1.9引入了新的网络机制,包括一整套的网络操作命令和跨主机的网络支持. 该网络特性主要是为了实现容器的网络互联(单主机/跨主机),取代了之前的--link网络模式. docker网络命令: 查看当前的docker网络: # docker network ls NETWORK ID         NAME               DRIVER            a77b0f433ea0        none                null              

centos7下安装docker(15.3跨主机网络-macvlan)

除了ovrlay,docker还开发了另一个支持跨主机容器的driver:macvlan macvlan本身是linu kernel模块,其功能是允许在同一物理网卡上配置多了MAC地址,即:多个interface,每个interface可以配置自己的ip.macvlan本身是一种网卡虚拟化技术,Docker用macvlan实现容器网络就不奇怪了 macvlan最大的优点是性能极好,相比其他方案,macvlan不需要创建Linux bridge,而是直接通过以太interface连接到物理网络.