Docker:使用Ambassador进行跨主机间容器通信

系统 1953 0
      转载请注明出处:
      
        点我
      
    

 

由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情。可以利用Ambassador容器来实现这一功能。

基本原理:

利用Ambassador来实现主机间容器进行通信时,需要在两台需要通信的容器的主机上都启动Ambassador容器。由Ambassador容器提供数据转发服务。

Docker:使用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 j_huang@126
      
        .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命令可以查看到下面的环境变量当前容器的环境变量:

Docker:使用Ambassador进行跨主机间容器通信

可以看到环境变量军事以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进行跨主机间容器通信


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论