了解 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链接到我的host
port 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:8000
和 curl 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编排服务运行测试mysql