【问题标题】:Flask app runs on docker but not from the hostFlask 应用程序在 docker 上运行,但不在主机上运行
【发布时间】:2018-10-24 15:17:05
【问题描述】:

我有一个烧瓶应用程序,它根据用户调用运行一些事情。在这个应用程序中,我还有一个基本端点,它只返回一个字符串,可以帮助我查看应用程序是否正在运行。

@app.route("/hello")
def hello():
    return "Hello World!"

现在我尝试使用来自官方 docker 网站的 this 教程对这个应用程序进行 docker 化。烧瓶应用程序侦听端口 5000,因此我在 Dockerfile 中添加了一个条目以公开端口 5000。

EXPOSE 5000

我在 Dockerfile 中用来运行应用程序的命令是

CMD ["python","model.py"]

model.py 文件包含根据用户输入调用其他函数的烧瓶代码。

现在,当我在容器化后运行我的应用程序时,我会在终端上看到烧瓶应用程序确实正在运行的所需输出。这是我用来运行应用程序的命令。

docker run -p 5000:5000 firstContainer

当我尝试使用请求 http://localhost:5000/hello 调用上面的基本 helloWorld 方法时,我收到一条错误消息,指出该站点不可用。这里的端口映射有什么我做错了吗?我该如何解决这个问题?

编辑:添加更多细节

所以我尝试进入容器查看发生了什么,我能够查看容器上可用的文件,它们看起来不错。当我尝试使用基本命令在容器中再次启动应用程序时

python model.py

它返回一个错误,指出该端口已在使用中。所以这应该意味着应用程序确实在监听端口。我还在容器内安装了 curl 以浏览 URL,当我在容器内运行它时,它返回了预期的字符串。我只是不明白我怎么能把它暴露给外界

编辑 2:

容器日志

 * Serving Flask app "model" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
  Use a production WSGI server instead.
 * Debug mode: on

【问题讨论】:

  • 尝试更明确:docker run -p localhost:5000:5000 firstContainer。您还可以将特定的 IP 地址替换为 localhost
  • 您是否可以通过127.0.0.1:5000/hello 访问您的应用程序以及 docker 是如何安装/运行的? $DOCKER_HOST 的值是多少?
  • @BMitch 从 docker 运行时我无法到达 127.0.0.1:5000/hello 但是当我在主机上启动应用程序时,我能够到达那个端点。关于 $DOCKER_HOST 的值,我必须检查一下。
  • 如果您没有以编程方式将主机设置为0.0.0.0,CMD 可能需要flask run --host=0.0.0.0 才能公开服务器。开箱即用的ngnix后面还有一个运行flask的容器(google:“tiangolo flask docker”)
  • @ReutSharabani 我必须将主机设置为 0.0.0.0 才能使其正常工作。我不知何故错过了你之前的评论。请随意提及作为答案,以便我接受。

标签: python docker flask


【解决方案1】:

问题是服务器默认只回答内部请求。你有两个选择。

您可以通过编程方式将主机设置为:

0.0.0.0

使用 CMD:

flask run --host=0.0.0.0`

提示:开箱即用的ngnix 后面还有一个container running flask。

【讨论】:

    【解决方案2】:

    试试这个:

    docker run --rm -it --network=host -p 5000:5000 firstContainer
    

    问题可能与网络有关。所以 --network=host 将容器连接到底层主机。

    【讨论】:

    • 当我尝试使用此命令在 docker 上启动应用程序时,我看到该请求将继续等待来自服务器的响应,即之前我曾经收到一个即时错误,说它无法连接到网址。不,它一直在等待响应。关于幕后发生的事情的任何指示?此外,在 docker 上启动应用程序后,我在另一个终端窗口中执行了 docker ps。我能够看到此图像正在运行,但在端口列下,它显示为空。这是预期的吗?
    • 确保您没有在 app.run(....) 中设置端口和主机:如果 name == "main": app.run(host='0.0.0.0', port=80)
    • 我确实在 app.run() 命令中设置了端口号。我已将其设置为 5000。如果我要求我的应用程序侦听特定端口,为什么会有问题?
    • 如果您将其设置为 5000,这正是您公开的端口号,就可以了。我想你可能会在 app.run 和 docker expose 中设置不同的端口号。
    • 实际问题是网络。将 --network=host 更改为 --net=host 如果问题仍然存在,请检查您的 iptables(防火墙)并删除所有规则。如果问题仍然存在,请给我您的代码和 dockerfile,以便在我的笔记本电脑上检查。
    【解决方案3】:

    我在 docker 容器中的 Flask 应用程序上遇到了同样的问题。我已经使用 --network=host 并解决了这个问题。

    # docker run -it -p 8080:8080 --network=host mbilgen/metacriticv3:1.0
    WARNING: Published ports are discarded when using host network mode
     * Serving Flask app "main" (lazy loading)
     * Environment: production
       WARNING: Do not use the development server in a production environment.
       Use a production WSGI server instead.
     * Debug mode: on
     * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 258-420-336
    127.0.0.1 - - [12/May/2019 03:55:08] "GET / HTTP/1.1" 200 -
    127.0.0.1 - - [12/May/2019 03:55:13] "GET /games HTTP/1.1" 200 -
    INFO:werkzeug:127.0.0.1 - - [12/May/2019 03:55:13] "GET /games HTTP/1.1" 200 -
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2019-05-24
      • 2020-03-26
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多