uwsgi-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)所有配置文件和脚本在容器启动时动态生成,确保环境变量生效。
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429