
tiangolo/uwsgi-nginx-flaskuwsgi-nginx-flask是一个集成uWSGI和Nginx的Docker镜像,专为在单个容器中运行Python Flask Web应用设计。该镜像预配置了生产环境常用的部署组件,将Flask应用服务器(uWSGI)与反向代理服务器(Nginx)结合,简化了Flask应用的部署流程,适用于需要快速搭建稳定Web服务的场景。
| 标签 | Dockerfile链接 |
|---|---|
python3.12, latest | Dockerfile |
python3.11 | Dockerfile |
python3.10 | Dockerfile |
python3.9 | Dockerfile |
⚠️ 以下标签不再维护,已从GitHub仓库移除,但Docker Hub可能仍保留最后推送版本:
python3.8python3.8-alpinepython3.7python3.6python2.7这些版本的最后日期标签:
python3.8-2024-10-28python3.8-alpine-2024-03-11python3.7-2024-10-28python3.6-2022-11-25python2.7-2022-11-25注意:镜像提供每日构建标签,如需固定版本可选择日期标签(如
tiangolo/uwsgi-nginx-flask:python3.7-2019-10-14)。
简单Flask应用部署
无需复杂集群管理,单容器即可满足中小流量应用需求,适合个人项目或内部工具。
Docker Compose单服务器部署
在单台服务器上使用Docker Compose管理服务时,可利用容器内进程管理实现负载均衡,避免集群级工具(如Kubernetes)的复杂性。
单容器多进程指标收集
需在容器内汇总多工作进程指标(如Prometheus监控)时,单容器部署可简化指标采集逻辑。
⚠️ Kubernetes或集群环境:在集群环境中,建议通过集群工具(如Kubernetes)管理容器复制和负载均衡,而非依赖容器内进程管理。此时应构建仅包含单个应用进程的镜像(如使用Gunicorn),通过集群调度实现水平扩展。
项目结构
. ├── app │ └── main.py └── Dockerfile
编写Flask应用(app/main.py)
pythonfrom flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World from Flask" if __name__ == "__main__": app.run(host='0.0.0.0', debug=True, port=80) # 仅用于开发调试
编写Dockerfile
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 复制应用代码 COPY ./app /app
构建并运行镜像
bash# 构建镜像 docker build -t my-flask-app . # 运行容器 docker run -d --name my-flask-container -p 80:80 my-flask-app
访问应用
打开浏览器访问 [***] 或服务器IP,应显示"Hello World from Flask"。
对于结构化Python包项目,需调整目录结构并配置uWSGI:
项目结构
. ├── app │ ├── app │ │ ├── __init__.py │ │ ├── main.py │ │ └── static # 静态文件目录 │ └── uwsgi.ini # uWSGI配置文件 └── Dockerfile
配置uWSGI(app/uwsgi.ini)
ini[uwsgi] module = app.main # 模块路径:app/main.py callable = app # Flask应用实例名称
Dockerfile配置
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 配置静态文件路径(如需要) ENV STATIC_PATH /app/app/static # 复制应用代码 COPY ./app /app
不建议将前端代码与Flask后端打包在同一容器中。推荐采用多阶段构建分离前后端:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
UWSGI_CHEAPER | 2 | 初始工作进程数 |
UWSGI_PROCESSES | 16 | 最大工作进程数(需大于UWSGI_CHEAPER) |
UWSGI_INI | /app/uwsgi.ini | uWSGI配置文件路径 |
UWSGI_THREADS | 1 | 每个工作进程的线程数 |
| 环境变量 | 默认值 | 说明 |
|---|---|---|
LISTEN_PORT | 80 | 容器监听端口 |
NGINX_MAX_UPLOAD | 0 | 最大上传文件大小(0表示无限制,单位:m=兆字节,g=千兆字节) |
NGINX_WORKER_PROCESSES | 1 | Nginx工作进程数(设为auto可自动检测CPU核心数) |
NGINX_WORKER_CONNECTIONS | 1024 | 每个工作进程的最大连接数 |
NGINX_WORKER_OPEN_FILES | 1024 | 每个工作进程的最大打开文件数(需大于NGINX_WORKER_CONNECTIONS) |
| 环境变量 | 默认值 | 说明 |
|---|---|---|
STATIC_PATH | /app/static | Nginx静态文件目录路径 |
STATIC_URL | /static | 静态文件访问URL前缀 |
STATIC_INDEX | 0 | 是否将/static/index.html作为根路径响应(1=启用,0=禁用,不推荐SPA使用) |
通过替换uwsgi.ini文件自定义uWSGI行为:
创建自定义uwsgi.ini(如启用线程支持)
ini[uwsgi] module = main callable = app enable-threads = true # 启用线程 thread-stacksize = 128k # 线程栈大小
Dockerfile中复制配置文件
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 复制自定义uwsgi.ini COPY ./uwsgi.ini /app/uwsgi.ini # 复制应用代码 COPY ./app /app
添加*.conf文件到/etc/nginx/conf.d/目录扩展配置(不覆盖默认配置):
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 添加自定义Nginx配置 COPY ./custom-nginx.conf /etc/nginx/conf.d/custom.conf COPY ./app /app
通过/app/nginx.conf完全替换Nginx配置:
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 复制自定义Nginx配置(完全覆盖默认配置) COPY ./nginx.conf /app/nginx.conf COPY ./app /app
创建/app/prestart.sh可在应用启动前执行命令(如数据库迁移):
创建脚本(app/prestart.sh)
bash#! /usr/bin/env bash # 示例:等待数据库启动 sleep 10 # 示例:执行数据库迁移 flask db upgrade
添加执行权限并复制
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 复制前置脚本并添加权限 COPY ./app/prestart.sh /app/prestart.sh RUN chmod +x /app/prestart.sh COPY ./app /app
yamlversion: '3' services: flask-app: build: . ports: - "80:80" environment: - UWSGI_CHEAPER=4 # 初始工作进程数4 - UWSGI_PROCESSES=16 # 最大工作进程数16 - NGINX_MAX_UPLOAD=10m # 最大上传10MB - STATIC_PATH=/app/app/static # 静态文件路径 volumes: - ./app:/app # 开发环境热更新(生产环境移除) restart: always
修改容器监听端口:
dockerfileFROM tiangolo/uwsgi-nginx-flask:python3.12 # 配置监听端口 ENV LISTEN_PORT 8080 EXPOSE 8080 # 声明暴露端口 COPY ./app /app
运行命令:
bashdocker run -d --name my-flask-container -p 8080:8080 my-flask-app
该镜像基于tiangolo/uwsgi-nginx构建,默认配置:
/app/uwsgi.ini加载应用,默认模块为main,可调用对象为app127.0.0.1:3031)所有配置文件和脚本在容器启动时动态生成,确保环境变量生效。






manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务