Docker为Flask API公开端口

时间:2016-01-21 11:33:30

标签: linux api flask docker ports

问题陈述

我在Docker容器中运行基于Flask的API,该容器在端口5000上公开,但是没有请求甚至到达API。

重现

  1. 获取jupyter / all-spark-notebook docker image
  2. 在Docker容器中,获取任何基于Flask的API,为了重现性目的,请尝试https://github.com/miguelgrinberg/oreilly-flask-apis-video(了解在发行版中基于Python的非常简单的API切换到v0.1)
  3. 使用此处所述的标准命令运行Docker(https://github.com/jupyter/docker-stacks/tree/master/all-spark-notebook)。忘记笔记本部分,只使用-p 5000:5000来运行API首选端口。不要使用HTTPS,而是在容器上安装ssh。 (因此,除非您使用像我这样的自定义Dockerfile,否则您需要启用SUDO)
  4. 尝试向API发出任何请求(例如http GET http://localhost:5000/customers/1) - > 此失败并获取不同的错误消息
    • 是否为Python based urlib request (IOError: ('http protocol error', 0, 'got a bad status line', None))
    • 或基于HTTPie(http: error: ConnectionError: HTTPConnectionPool(host='localhost', port=5000): Max retries exceeded with url: /filterReplies/aaaaa/aaaa (Caused by <class 'http.client.RemoteDisconnected'>: Remote end closed connection without response)
  5. 检查日志,其中没有任何API请求的记录
  6. 注释

    • 我在linux机器上运行,因此不需要VM。
    • 制作wget http://localhost:5000(获取Connecting to localhost (localhost)|127.0.0.1|:5000... connected. HTTP request sent, awaiting response... No data received. Retrying.)和wget http://localhost:1234(获取Resolving localhost (localhost)... 127.0.0.1 Connecting to localhost (localhost)|127.0.0.1|:8888... failed: Connection refused.)之间存在差异,因此端口在某个级别上是开放的,但只有似乎没有什么在另一边等待?
    • 图像的最初目的仍然有效 - 即如果我指定要转发的两个端口,我仍然可以在docker容器中对Jupyter笔记本进行基于浏览器的访问。所以在这台机器上的某些端口转发工作正常。

3 个答案:

答案 0 :(得分:2)

绑定到0.0.0.0将在任何可用的界面中绑定您的应用程序,localhost不会。有一篇帖子描述了localhost0.0.0.0之间的区别,如果我发现我会更新此帖子。

答案 1 :(得分:1)

所有功劳都归ipinak用户建议将应用绑定到0.0.0.0,这确实解决了问题。

有趣的是,该应用程序仍然响应localhost。但我现在要接受它。

答案 2 :(得分:1)

这里似乎没有代码示例,因此我认为我应该添加一些内容以“绑定”到0.0.0.0来解决HTTP request sent, awaiting response... No data received.问题。

app = flask.Flask(__name__)
app.config['DEBUG'] = True
app.run(host='0.0.0.0')

app.run(host='0.0.0.0')是重要的一环。

这应该可以解决HTTP request sent, awaiting response... No data received.问题。