Flask应用程序可在docker上运行,但不能在主机上运行

时间:2018-10-24 15:17:05

标签: python docker flask

我有一个flask应用程序,可以根据用户调用运行一些操作。在此应用程序中,我还有一个基本端点,该端点仅返回一个字符串,可以帮助我查看该应用程序是否正在运行。

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

现在,我尝试使用来自官方docker站点的this教程对这个应用程序进行docker化。 flask应用程序监听端口5000,因此我在Dockerfile中添加了一个条目以暴露端口5000。

EXPOSE 5000

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

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

model.py文件包含根据用户输入调用其他功能的flask代码。

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

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

3 个答案:

答案 0 :(得分:0)

尝试:

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

该问题可能与联网有关。因此--network = host将容器连接到基础主机。

答案 1 :(得分:0)

问题是服务器默认仅回答内部请求。您有两种选择。

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

0.0.0.0

使用CMD:

flask run --host=0.0.0.0`

提示:现成的ngnix后还有一个container运行中的烧瓶。

答案 2 :(得分:0)

我在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 -