Docker 为 Flask 公开端口 API
Docker Exposing ports for Flask API
问题陈述
我运行在暴露在端口 5000 上的 Docker 容器中使用基于 Flask 的 API,但是甚至没有请求到达 API.
转载
- 获取jupyter/all-spark-notebookdocker图片
- 在 Docker 容器中,获取任何基于 Flask 的 API,出于可重复性的目的,请尝试 https://github.com/miguelgrinberg/oreilly-flask-apis-video(为了理解一个非常简单的基于 Python 的 API 在版本中切换到 v0.1)
- 运行 Docker 使用此处描述的标准命令 (https://github.com/jupyter/docker-stacks/tree/master/all-spark-notebook)。忘记笔记本部分,仅使用
-p 5000:5000
将 API 首选端口设置为 运行。不要使用 HTTPS,但要在容器上安装 ssh。 (所以除非你像我一样使用自定义 Docker 文件,否则你需要启用 SUDO)
- 尝试向 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)
)
- 查看日志,没有任何API请求的记录
备注
- 我 运行 在一台 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 notebooks。所以一些端口转发在这台机器上工作。
所有功劳都归功于 ipinak,他建议将应用程序绑定到 0.0.0.0
,这确实解决了问题。
有趣的是,该应用程序仍然在本地主机上响应。但我暂时接受它。
绑定到 0.0.0.0
将在任何可用界面中绑定您的应用程序,localhost 不会。有一个post描述了localhost
和0.0.0.0
的区别,如果我找到我会更新这个post。
这里似乎没有代码示例,所以我想我应该添加我所做的,以便 "bind" 到 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.
问题。
问题陈述
我运行在暴露在端口 5000 上的 Docker 容器中使用基于 Flask 的 API,但是甚至没有请求到达 API.
转载
- 获取jupyter/all-spark-notebookdocker图片
- 在 Docker 容器中,获取任何基于 Flask 的 API,出于可重复性的目的,请尝试 https://github.com/miguelgrinberg/oreilly-flask-apis-video(为了理解一个非常简单的基于 Python 的 API 在版本中切换到 v0.1)
- 运行 Docker 使用此处描述的标准命令 (https://github.com/jupyter/docker-stacks/tree/master/all-spark-notebook)。忘记笔记本部分,仅使用
-p 5000:5000
将 API 首选端口设置为 运行。不要使用 HTTPS,但要在容器上安装 ssh。 (所以除非你像我一样使用自定义 Docker 文件,否则你需要启用 SUDO) - 尝试向 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)
)
- 是否
- 查看日志,没有任何API请求的记录
备注
- 我 运行 在一台 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 notebooks。所以一些端口转发在这台机器上工作。
所有功劳都归功于 ipinak,他建议将应用程序绑定到 0.0.0.0
,这确实解决了问题。
有趣的是,该应用程序仍然在本地主机上响应。但我暂时接受它。
绑定到 0.0.0.0
将在任何可用界面中绑定您的应用程序,localhost 不会。有一个post描述了localhost
和0.0.0.0
的区别,如果我找到我会更新这个post。
这里似乎没有代码示例,所以我想我应该添加我所做的,以便 "bind" 到 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.
问题。