zoukankan      html  css  js  c++  java
  • 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 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命令可以查看到下面的环境变量当前容器的环境变量:

    可以看到环境变量军事以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。

  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/rio2607/p/4437923.html
Copyright © 2011-2022 走看看