了解 Docker/Docker-Compose 上的 Gunicorn 和 Flask

Posted

技术标签:

【中文标题】了解 Docker/Docker-Compose 上的 Gunicorn 和 Flask【英文标题】:Understanding Gunicorn and Flask on Docker/Docker-Compose 【发布时间】:2018-02-25 19:59:26 【问题描述】:

我无法使用 Docker-compose 让 Flask 和 Gunicorn 在 Docker 上正常工作

Docker 文件:

FROM ubuntu:latest
MAINTAINER Kyle Calica "Kyle Calica"
RUN apt-get update -y
RUN apt-get install -y python3-dev  build-essential python-pip gunicorn
RUN pip install --upgrade setuptools
RUN pip install ez_setup
COPY . /app
WORKDIR /app
RUN pip install -r ./app/requirements.txt
CMD [ "gunicorn", "-b", ":8000", "run" ]

Docker-Compose.yml:

version: '2'
services:
 web:
  build: .
  volumes:
  - ./:/var/www/crypto
  ports:
   - "5000:5000"

运行.py:

from app import app
app.run()

据我了解,Gunicorn master 将在 容器

的所有接口上的 8000 端口上运行

然后它会生成一个节点,在 127.0.0.1/localhost 的 容器 中的 5000 端口运行。

从那里我将container中的端口5000链接到我的hostport 8000

我希望在http://127.0.0.1:8000 的主机上看到我的应用程序 相反,什么也没发生,似乎没有任何联系。

我以前做过这个,但不记得我做了什么不同的事情。

(env) paper-street:CoinSlack kyle$ gunicorn -b :8000 run [2017-09-16 17:43:59 -0700] [15402] [INFO] Starting gunicorn 19.7.1 [2017-09-16 17:43:59 -0700] [15402] [INFO] Listening at: http://0.0.0.0:8000 (15402) [2017-09-16 17:43:59 -0700] [15402] [INFO] Using worker: sync [2017-09-16 17:43:59 -0700] [15405] [INFO] Booting worker with pid: 15405 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

^原因是因为它似乎产生了一个工人并在端口 5000 上运行它,我无法通过端口 8000 访问我的应用程序

【问题讨论】:

1.为什么它会在 5000 端口生成一个节点? 2. 将 5000 链接到 5000,而不是 8000。 3. 尝试在 yml 文件中将端口更改为 8000:8000,应该可以。 我会发布gunicorn -b :8000 run 的输出来说明为什么我相信它会在 500 处生成。我会尝试的。 还尝试执行到容器中并运行 curl localhost:8000curl localhost:5000 以查看其中发生了什么。 @AlexHall 发布了一些输出,表明它在端口 5000 上有一个带有我的应用程序实例的工作人员。不,如果我尝试从 gunicorn 端口而不是工作人员端口访问它,它只会挂起 我认为app.run() 不应该在那里。由 gunicorn 来运行应用程序,而不是 Flask。 【参考方案1】:

app.run()gunicorn 是运行网络服务器的两种方式。第一个是 Flask 开发服务器,它对开发很有用,但不应该部署在生产环境中。您不应该同时运行两者。

gunicorn 应该指向app 对象,以便它可以导入它并使用它来运行网络服务器本身。这就是它所需要的。

【讨论】:

如果烧瓶应用程序不应该部署在产品中,为什么烧瓶有一个“生产”与“开发”设置? prod 设置是否与gunicorn 一起使用? 亚当,flask 有一个内置服务器,仅用于测试目的。把它想象成一个开发目的的服务器。在此服务器中,有 2 种模式 - 这就是您所说的生产与开发。生产意味着在错误期间不显示stackttrace,对代码所做的任何更改都需要重新加载才能在浏览器中可见。开发模式意味着在错误期间显示 stackttrace 并且重新加载是自动的。将应用程序部署到生产环境时,不建议使用 Flask 服务器(prod/dev 模式),因为它无法扩展。所以使用类似 gunicorn 的东西。【参考方案2】:

而不是CMD [ "gunicorn", "-b", ":8000", "run" ]

CMD ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]

您可以看到,不是将 gunicorn 进程告诉run,而是告诉进程在哪里查看。您希望 gunicorn 服务的应用程序是 app。您还可以为 gunicorn 命令添加更多选项,例如reload、worker 数量、超时、日志级别等...

为了扩展 Alex Hall 的回答,您不想在生产环境中运行 Flask 服务器,因为扩展能力非常有限。根据 Flask 文档,提到:

Flask 的内置服务器不适合生产,因为它不适合 扩展性很好,默认情况下一次只处理一个请求

【讨论】:

'right' 命令中缺少逗号,*** 不允许我编辑少于 6 个字符。只是说

以上是关于了解 Docker/Docker-Compose 上的 Gunicorn 和 Flask的主要内容,如果未能解决你的问题,请参考以下文章

docker/docker-compose 复现CVE

Docker:docker-compose 应用

[Docker] docker-compose使用教程

docker docker-compose编排服务运行测试mysql

docker、docker-compose、docker swarm和k8s的区别

Docker--------docker-compose LNMP实战