【问题标题】:Communication between two flask services in DockerDocker 中两个烧瓶服务之间的通信
【发布时间】:2017-02-18 14:36:12
【问题描述】:

我有两个 Flask 应用程序,每个应用程序都在单独的容器中。我想从应用 B 调用应用 A。目前我只能通过像这样对应用 A 的 IP 进行硬编码来做到这一点:

@app.route('/')
def hello_world():
    r = requests.get('http://172.18.0.1:5000')
    return r.text

有没有使用容器别名进行调用的简单方法?这种问题的推荐解决方案是什么,即两个相互通信的服务?

我是 docker 新手,我不确定我应该寻找什么,所以任何资源/链接都将不胜感激。

【问题讨论】:

  • 将请求的 URL 更改为变量,最好是从配置文件加载的变量。将其配置为主机名。使用docker run --name hostname 运行容器

标签: python networking docker flask request


【解决方案1】:

首先非常推荐使用hostname而不是IP。 但为什么? IP 每次都可能更改,并且一遍又一遍地检查应用程序的 IP 非常烦人,但 hostname 只有在您愿意时才会更改。

然后:

cd path/to/dockerfile
docker build -t your_repo/image_name .    
docker run -d  -p 6000:5000 image_name --name hostname

而你的 app.py(只是一个名字)应该是这样的:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    r = requests.get('http://hostname:5000')
    return r.text

if __name__ == '__main__':
    app.run(host='0.0.0.0')

请注意,我正在使用主机 '0.0.0.0',因为您在尝试连接两个容器时可能会遇到一些问题。

希望这足以让您解决问题。

祝你有美好的一天!

【讨论】:

  • 您好,感谢您的回答。它并没有完全解决我的问题。对“主机名”进行请求会导致requests.exceptions.MissingSchema: Invalid URL 'host': No schema supplied. Perhaps you meant http://host? 如果我会这样做http://host:6000,我会得到最大重试次数异常。显然我做错了什么。有任何想法吗?我发现网络非常混乱,因为 docker 发展如此之快 - 很难掌握当前的工作流程。
  • 嗨!是的,我错了,已经解决了,谢谢!关于你的问题,你应该使用 5000,而不是 6000,否则它会失败。基本上,如果您看到 docker run 命令,则将主机中的 6000 端口映射到 5000 到您的 docker 容器。试试http://host:5000
  • 嗨,我已经很困惑了。如果我这样做:docker run -d -p 5002:5000 externall3 和 externall3 图像是 `@app.route('/') def hello_world(): return 'b'` 我可以在端口 5002 访问它。我认为 -p 执行外部端口是否正确: 容器内的端口?无论哪种方式 (http://host:5000) 都不起作用。
  • 我对使用链接感到困惑?它仍然是连接容器的有效方式吗?不必做任何事情链接--链接主机名:主机名?
  • 在这里您可以看到有关链接容器的完整描述:docs.docker.com/engine/userguide/networking/default_network/… BTW,如果您有一些要点或 GitHub 存储库来查看您的代码或至少是命令,我会很棒。 :)
猜你喜欢
  • 2021-01-24
  • 2020-09-04
  • 2019-07-24
  • 2017-08-10
  • 2017-06-06
  • 2016-08-10
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
相关资源
最近更新 更多