使用Docker部署Python Flask项目的详细指南

文章目录

  • 一、构建运行 Docker 容器
  • 1. 查找合适镜像
  • 2.本地docker 拉取镜像
  • 3.项目配置
  • 1. python项目下生成 requirements.txt 依赖文件
  • 2. 生成Dockerfile文件
  • 3.忽略不必要文件
  • 4. 构建镜像
  • 4. 运行容器
  • 5.测试
  • 二、常见问题与解决方案
  • 一、构建运行 Docker 容器

    1. 查找合适镜像

    打开 https://hub.docker.com/_/python/tags 找到合适自己的镜像,我找到的是 python:3.13.3-alpine3.22

    根据环境选择镜像:

  • 开发环境:使用 python:3.12-buster 或完整镜像,便于调试和安装依赖。
  • 生产环境:使用 python:3.12-slim 或 python:3.12-alpine,减少攻击面和镜像体积。
  • 2.本地docker 拉取镜像

    docker pull python:3.13.3-alpine3.22
    

     docker images
    

    3.项目配置

    1. python项目下生成 requirements.txt 依赖文件

    pip freeze > requirements.txt
    


    文件内容:

    2. 生成Dockerfile文件

    FROM python:3.12.10-alpine3.22
    
    # 设置工作目录
    WORKDIR /app
    
    COPY . .
    
    RUN adduser -D appuser
    
    # 使用国内镜像源并增加超时时间
    RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
    
    # 复制依赖文件并安装(添加超时和重试)
    COPY requirements.txt .
    RUN pip install --no-cache-dir \
        --timeout 100 \
        gunicorn>=21.2.0 \
        -r requirements.txt
    
    
    # 验证安装(关键!)
    RUN which gunicorn && gunicorn --version
    
    USER appuser
    
    
    # 启动命令
    CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app", "--workers", "4", "--threads", "2"]
    

    代码解释:

    1. RUN pip config set global.index-url 设置国内镜像,更快下载依赖
    1. COPY . . 正式环境部署时,采用 代码打包进镜像,数据用数据卷 的方案
  • 避免因宿主机文件变动导致服务异常
  • 容器与宿主机文件系统隔离,减少攻击面。
  • 日志、配置等数据需持久化存储。
    1. gunicorn>=21.2.0 强制安装 Gunicorn(不依赖 requirements.txt)
  • 强制安装 Gunicorn(不依赖 requirements.txt),开发环境不用安装 Gunicorn
    1. CMD [“gunicorn”, “-b”, “0.0.0.0:5000”, “app:app”, “–workers”, “4”, “–threads”, “2”]
  • Gunicorn 启动 Flask 应用
  • -b 0.0.0.0:5000 绑定(bind)地址和端口
  • 让 Gunicorn 服务器在容器内部的 5000 端口接收外部请求
  • app:app 模块名:应用实例名
  • 第一个 app:Python 文件或模块名(如 app.py)。
  • 第二个 app:Flask 应用实例名(通常在代码中定义为 app = Flask(name))。
  • –workers 4
  • 启动 4 个 worker 进程(即 4 个独立的 Python 进程)
  • –threads 2
  • 每个 worker 进程启动 2 个线程。
  • 适用场景

    这条命令适合 I/O 密集型的 Flask 应用,例如:

  • API 接口服务(大量 HTTP 请求)。
  • 数据库 CRUD 操作(等待数据库响应时线程可处理其他请求)。
  • 调用外部 API 的服务(如调用第三方支付、短信等)。
  • 3.忽略不必要文件

    创建 .dockerignore 文件排除不需要的文件:

    __pycache__
    *.pyc
    *.pyo
    *.pyd
    .venv
    Dockerfile
    .git
    

    4. 构建镜像

    在项目根目录执行:

     docker build -t flask-api:prod.v1.1 .
    
  • -t:指定镜像标签(格式:[仓库名]:[版本号])
  • .:指定构建上下文(当前目录)
  • 4. 运行容器

    docker rm -f flask-api && docker run -d -p 5000:5000  --name flask-api flask-api:prod
    
  • 启动前删除 flask-api 容器
  • -d:后台运行
  • -p 5000:5000 端口映射(主机:容器)
  • 5.测试

    curl http://localhost:5000
    

    二、常见问题与解决方案

    1. 问题:容器启动后立即退出。
      原因:主进程(如 app.py)未保持运行(如脚本执行完就退出)。
      解决:确保应用持续监听端口(如 Flask/Django 服务)。

    2. 问题:依赖安装失败(如 Alpine 镜像缺少编译工具)。
      解决:在 Dockerfile 中添加编译依赖:

      RUN apk add --no-cache gcc musl-dev
      
    3. 问题:修改代码后需重新构建整个镜像。
      解决:利用 Docker 缓存,先复制 requirements.txt 并安装依赖,再复制代码。

    作者:泥巴客

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用Docker部署Python Flask项目的详细指南

    发表回复