Dockerfile
链接🚨 以下标签不再受支持或维护,它们已从GitHub仓库中移除,但如果有人一直在拉取,最后推送的版本可能仍然在Docker Hub上可用:
python3.9-alpine3.13
python3.8-alpine3.11
python3.7-alpine3.8
python3.6
python3.6-alpine3.8
python2.7
这些版本的最后日期标签是:
python3.9-alpine3.13-2024-03-11
python3.8-alpine3.11-2024-03-11
python3.7-alpine3.8-2024-03-11
python3.6-2022-11-25
python3.6-alpine3.8-2022-11-25
python2.7-2022-11-25
注意:每个构建日期都有对应的标签。如果你需要"固定"所使用的Docker镜像版本,可以选择其中一个标签。例如:tiangolo/meinheld-gunicorn-flask:python3.7-2019-10-15
。
这是一个Docker镜像,使用Meinheld由Gunicorn管理,用于在Flask中使用**Python**构建高性能Web应用,并具有自动性能调优功能。
GitHub仓库:https://github.com/tiangolo/meinheld-gunicorn-flask-docker
Docker Hub镜像:https://hub.docker.com/r/tiangolo/meinheld-gunicorn-flask/
使用Meinheld运行并由Gunicorn控制的Python Flask Web应用拥有Flask可实现的最佳性能之一(*)。
如果你已经有一个现成的Flask应用或正在构建一个新的应用,这个镜像将为你提供最佳(或接近最佳)的性能。
这个镜像包含一个"自动调优"机制,因此你只需添加你的代码就能自动获得良好的性能。而且无需做出牺牲(如日志记录)。
Meinheld当前发布的最新版本是1.0.2,发布于2020年5月17日。这个版本的Meinheld需要一个旧版本的Greenlet(>=0.4.5,<0.5
),这与Python 3.10和3.11不兼容。这就是为什么这个镜像支持的最新Python版本是Python 3.9。
如果你正在开始一个新项目, 你可能会从更新更快的框架中受益,比如FastAPI(基于ASGI而不是像Flask和Django那样基于WSGI),以及像tiangolo/uvicorn-gunicorn-fastapi这样的Docker镜像。
它能给你带来约200%的Flask可达到的性能,即使使用这个镜像。
此外,如果你想使用WebSockets等新技术,使用基于ASGI的新框架(如FastAPI)会更容易。因为ASGI标准被设计为能够处理异步代码,如WebSockets所需的代码。
Meinheld是一个高性能的WSGI兼容Web服务器。
你可以使用Gunicorn来管理Meinheld并运行多个进程。
Flask是一个基于Werkzeug、Jinja 2和良好意图的Python微框架。
这个镜像是作为tiangolo/uwsgi-nginx-flask的替代方案创建的,提供了约400%的性能提升。
它基于更通用的镜像tiangolo/meinheld-gunicorn。那是你用于其他WSGI框架(如Django)的镜像。
你可能正在使用Kubernetes或类似工具。在这种情况下,你可能不需要这个镜像(或任何其他类似的基础镜像)。你可能最好从头开始构建Docker镜像。
如果你有一个使用Kubernetes、Docker Swarm模式、Nomad或其他类似复杂系统来管理多台机器上分布式容器的机器集群,那么你可能想要在集群级别处理复制,而不是使用在每个容器中启动多个工作进程的进程管理器,这就是这个Docker镜像所做的。
在这些情况下(例如使用Kubernetes),你可能想要从头开始构建一个Docker镜像,安装你的依赖项,并运行单个进程,而不是使用这个镜像。
例如,使用Gunicorn,你可以有一个app/gunicorn_conf.py
文件,内容如下:
# Gunicorn配置变量 loglevel = "info" errorlog = "-" # stderr accesslog = "-" # stdout worker_tmp_dir = "/dev/shm" graceful_timeout = 120 timeout = 120 keepalive = 5 threads = 3
然后你可以有一个Dockerfile
,内容如下:
FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY ./app /code/app CMD ["gunicorn", "--conf", "app/gunicorn_conf.py", "--bind", "0.0.0.0:80", "app.main:app"]
你可以在FastAPI文档中关于:FastAPI in Containers - Docker的部分阅读更多关于这些想法的内容,因为相同的想法也适用于容器中的其他Web应用。
如果你的应用足够简单,不需要(至少暂时不需要)过多地微调进程数量,可以直接使用自动化的默认设置,并且你在单个服务器上运行它而不是集群,那么你可能希望在容器中运行一个进程管理器来管理多个工作进程。
你可能正在使用Docker Compose部署到单个服务器(而不是集群),所以你没有简单的方法来管理容器的复制(使用Docker Compose)同时保持共享网络和负载均衡。
在这种情况下,你可能希望有一个单独的容器,其中有一个进程管理器在内部启动多个工作进程,就像这个Docker镜像所做的那样。
你可能还有其他原因,使得拥有一个容器和多个进程比拥有多个容器,每个容器一个进程更容易。
例如(取决于你的设置),你可能在同一个容器中有一些工具,比如Prometheus导出器,它应该能够访问每个进入的请求。
在这种情况下,如果你有多个容器,默认情况下,当Prometheus来读取指标时,它每次都会获得单个容器的指标(处理该特定请求的容器),而不是获得所有复制容器的累积指标。
那么,在这种情况下,拥有一个容器和多个进程,以及同一容器上的本地工具(例如Prometheus导出器)收集所有内部进程的Prometheus指标并在该单个容器上公开这些指标可能会更简单。
在FastAPI文档中关于:FastAPI in Containers - Docker的部分阅读更多相关内容,因为相同的概念也适用于容器中的其他Web应用。
你不需要克隆这个仓库。
你可以将这个镜像作为其他镜像的基础镜像。
假设你有一个requirements.txt
文件,你可以有一个这样的Dockerfile
:
FROM tiangolo/meinheld-gunicorn-flask:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app
它会期望在/app/app/main.py
找到一个文件。
或者在/app/main.py
找到一个文件。
并期望它包含一个名为app
的变量,其中包含你的"WSGI"应用。
然后你可以从包含Dockerfile
的目录构建你的镜像,例如:
docker build -t myimage ./
这些是你可以在容器中设置的环境变量及其默认值:
MODULE_NAME
Gunicorn要导入的Python "模块"(文件),该模块中包含实际的Flask应用程序变量。
默认情况下:
/app/app/main.py
文件,则为 app.main
/app/main.py
文件,则为 main
例如,如果您的主文件位于 /app/custom_app/custom_main.py
,您可以这样设置:
docker run -d -p 80:80 -e MODULE_NAME="custom_app.custom_main" myimage
VARIABLE_NAME
Python模块中包含Flask应用程序的变量。
默认情况下:
app
例如,如果您的主Python文件包含以下内容:
from flask import Flask api = Flask(__name__) @api.route("/") def hello(): return "Hello World from Flask"
在这种情况下,api
是包含"Flask应用程序"的变量。您可以这样设置:
docker run -d -p 80:80 -e VARIABLE_NAME="api" myimage
APP_MODULE
传递给Gunicorn的Python模块和变量名字符串。
默认情况下,根据 MODULE_NAME
和 VARIABLE_NAME
变量设置:
app.main:app
或main:app
您可以这样设置:
docker run -d -p 80:80 -e APP_MODULE="custom_app.custom_main:api" myimage
GUNICORN_CONF
Gunicorn Python配置文件的路径。
默认情况下:
/app/gunicorn_conf.py
/app/app/gunicorn_conf.py
/gunicorn_conf.py
(包含的默认值)您可以这样设置:
docker run -d -p 80:80 -e GUNICORN_CONF="/app/custom_gunicorn_conf.py" myimage
WORKERS_PER_CORE
此镜像将检查运行容器的当前服务器上可用的CPU核心数。
它会将工作进程数设置为CPU核心数乘以此值。
默认情况下:
2
您可以这样设置:
docker run -d -p 80:80 -e WORKERS_PER_CORE="3" myimage
如果您在一个有2个CPU核心的服务器上使用值 3
,它将运行6个工作进程。
您也可以使用浮点值。
例如,如果您有一个大型服务器(比如8个CPU核心)运行多个应用程序,而您有一个您知道不需要高性能的ASGI应用程序。并且您不想浪费服务器资源。您可以让它每个CPU核心使用 0.5
个工作进程。例如:
docker run -d -p 80:80 -e WORKERS_PER_CORE="0.5" myimage
在一个有8个CPU核心的服务器上,这将使它只启动4个工作进程。
WEB_CONCURRENCY