将Python Flask服务打包成Docker镜像并运行的完整指南

南乔
南乔
发布时间:2026-10-10| 3人浏览过
原创

将 Python Flask Web 服务通过 Docker 容器化部署,可彻底消除环境差异并实现一键分发。本文基于阿里云镜像源加速配置多阶段构建流程,详细拆解从编写应用代码、定义依赖清单到编译镜像及端口映射的完整操作,帮助开发者快速掌握本地应用的标准化交付方法。

构建目标与前置条件

本方案旨在通过标准化容器环境运行 Python Flask 服务,确保开发、测试与生产环境的高度一致性。开始前需确认宿主机已安装 Docker 客户端,并熟悉基本的命令行操作。可选安装 Python 3.x 用于本地代码调试。

第1步:编写Flask应用入口

目的:提供具备路由解析与页面渲染能力的 Web 服务。创建 wisdom_app.py,内置随机名言库与示例图片接口,并通过环境变量动态绑定端口以适应容器网络:

import random
import os
from flask import Flask, render_template_string

app = Flask(__name__)

# 有趣的名言列表
quotes = [
    {"text": "Debugging is like being a detective in a crime movie where you are also the murderer.", "author": "Filipe Fortes"},
    {"text": "If you want your code to be fast, it should be easy to understand.", "author": "Brian Kernighan"},
    {"text": "The best thing about a boolean is even if you are wrong, you are only off by a bit.", "author": "Anonymous"},
    {"text": "There are two ways to write error-free programs; only the third one works.", "author": "Alan J. Perlis"},
    {"text": "Programming is like sex: One mistake and you have to support it for the rest of your life.", "author": "Michael Sinz"}
]

# 有趣的动物图片URL列表
animal_images = [
    "https://picsum.photos/seed/funnycat/400/300",
    "https://picsum.photos/seed/lazydog/400/300",
    "https://picsum.photos/seed/sillyrabbit/400/300",
    "https://picsum.photos/seed/curiousgoat/400/300",
    "https://picsum.photos/seed/playfulpanda/400/300"
]

@app.route('/')
def get_random_wisdom():
    quote = random.choice(quotes)
    image_url = random.choice(animal_images)
    
    # 简单的HTML模板,用于展示名言和图片
    html_template = """
    <!DOCTYPE html>
    <html>
    <head>
        <title>智慧之言</title>
        <style>
            body {
                font-family: Arial, sans-serif;
                max-width: 800px;
                margin: 0 auto;
                padding: 20px;
                text-align: center;
            }
            .quote-box {
                background-color: #f9f9f9;
                border-left: 10px solid #ccc;
                margin: 1.5em 10px;
                padding: 1em 20px;
                font-size: 1.2em;
                border-radius: 5px;
            }
            .author {
                color: #666;
                font-style: italic;
                margin-top: 10px;
            }
            .image-container {
                margin-top: 30px;
                border-radius: 8px;
                overflow: hidden;
                box-shadow: 0 4px 8px rgba(0,0,0,0.1);
            }
            img {
                max-width: 100%;
                height: auto;
            }
            button {
                background-color: #4CAF50;
                border: none;
                color: white;
                padding: 10px 20px;
                text-align: center;
                text-decoration: none;
                display: inline-block;
                font-size: 16px;
                margin: 20px 2px;
                cursor: pointer;
                border-radius: 5px;
                transition: background-color 0.3s;
            }
            button:hover {
                background-color: #45a049;
            }
        </style>
    </head>
    <body>
        <h1>今日智慧</h1>
        <div class="quote-box">
            "{{ quote_text }}"
            <div class="author">- {{ quote_author }}</div>
        </div>
        <div class="image-container">
            <img src="{{ image_url }}" alt="有趣的动物">
        </div>
        <button onclick="window.location.reload()">换一条</button>
    </body>
    </html>
    """
    
    return render_template_string(
        html_template, 
        quote_text=quote["text"], 
        quote_author=quote["author"],
        image_url=image_url
    )

if __name__ == '__main__':
    # 获取端口号,默认为5000
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

第2步:声明依赖与清理冗余

目的:锁定运行环境所需组件,并排除本地缓存文件以防增大镜像体积。新建 requirements.txt 指定版本:

flask==2.3.2
importlib-metadata>=3.6.0
Werkzeug==2.3.7

同步创建 .dockerignore 忽略编译产物与虚拟环境:

__pycache__
*.pyc
*.pyo
*.pyd
.venv
env

第3步:配置多阶段Dockerfile

目的:利用多阶段构建隔离编译环境与最终运行环境,显著削减镜像体积。创建同名 Dockerfile(无后缀),底层采用阿里云源加速构建过程:

# 使用完整的 Python 3.9 镜像(基于 Debian Bullseye)
FROM python:3.9 AS builder

# 确保 sources.list 文件存在并覆盖为阿里云镜像源(Bullseye 版本)
RUN test -f /etc/apt/sources.list || touch /etc/apt/sources.list && \
    sed -i 's|deb.debian.org|mirrors.aliyun.com/debian|g' /etc/apt/sources.list && \
    sed -i 's|security.debian.org|mirrors.aliyun.com/debian-security|g' /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list

# 安装系统依赖(先清理缓存再更新)
RUN apt-get clean && \
    apt-get update && \
    apt-get install -y --no-install-recommends build-essential && \
    rm -rf /var/lib/apt/lists/*

# 升级 pip 并安装依赖
RUN pip install --upgrade pip setuptools wheel && \
    pip install importlib-metadata>=3.6.0

# 复制并安装 Python 依赖(使用阿里云 PyPI 源加速)
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt

# 最终运行镜像
FROM python:3.9-slim

# 同样切换为阿里云镜像源(Bullseye 版本)
RUN test -f /etc/apt/sources.list || touch /etc/apt/sources.list && \
    sed -i 's|deb.debian.org|mirrors.aliyun.com/debian|g' /etc/apt/sources.list && \
    sed -i 's|security.debian.org|mirrors.aliyun.com/debian-security|g' /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ bullseye main contrib non-free" > /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib non-free" >> /etc/apt/sources.list && \
    echo "deb http://mirrors.aliyun.com/debian-security bullseye-security main contrib non-free" >> /etc/apt/sources.list

# 安装运行时依赖
RUN apt-get clean && \
    apt-get update && \
    apt-get install -y --no-install-recommends libgomp1 && \
    rm -rf /var/lib/apt/lists/*

# 复制构建产物和应用代码
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages/ /usr/local/lib/python3.9/site-packages/
COPY wisdom_app.py .

# 暴露端口并启动应用
EXPOSE 5000
ENV FLASK_APP=wisdom_app.py
CMD ["flask", "run", "--host=0.0.0.0"]

第4步:执行构建与启动容器

进入包含上述文件的目录,打开终端执行镜像编译。参数 -t 指定仓库名与版本号,. 指向当前上下文路径:

docker build -t wisdom-app:latest .

编译成功后,使用以下命令拉起容器。该方式严格遵循 Dockerfile 中定义的 CMD 指令,无需手动传入启动命令:

docker run -it -p 5000:5000 wisdom-app:latest

若需临时覆盖默认启动逻辑(例如切换调试模式),可直接追加命令:docker run -it -p 5000:5000 wisdom-app:latest python -m flask run --host=0.0.0.0 --debug。其中 -p 5000:5000 完成宿主端口至容器端口的双向转发。

状态验证与常见问题排查

终端提示 Running on all addresses 即表示服务已就绪。在浏览器地址栏输入 http://localhost:5000,正常加载随机名言卡片与图片即判定构建成功。

浏览器访问本地5000端口展示的随机名言与图片界面
容器启动后,在宿主机浏览器输入 http://localhost:5000 即可验证服务是否正常运行。

高频异常处理对照表

  • 端口冲突:若提示 Address already in use,修改映射参数如 -p 5001:5000 后重新运行。
  • 构建耗时过长:确认 Dockerfile 中已配置 mirrors.aliyun.com 替代默认海外节点,或使用本地代理。
  • 容器启动后立即退出:通过 docker logs <容器ID> 抓取标准输出日志,排查代码导入错误或依赖缺失。
  • 外部无法访问:检查宿主机防火墙规则,放行对应 TCP 端口,并确保 Flask 监听地址为 0.0.0.0 而非 127.0.0.1。

日常运维可配合 docker ps 监控实例状态,使用 docker stop <容器ID> 安全关停。若需清理残留空间,依次执行 docker rm <容器ID> 与 docker rmi wisdom-app:latest 移除废弃数据。涉及覆盖或删除操作前,建议提前导出镜像备份至本地 tar 包以防误操作丢失。

核心要点回顾

本文完整演示了 Python Flask 服务向 Docker 容器的标准化迁移路径。通过锁定依赖版本、配置国内加速源以及实施多阶段镜像构建,有效解决了环境不一致与交付臃肿的痛点。掌握了端口映射机制与基础排错手段后,即可将该模式直接复用于其他 Python Web 框架的生产部署中。

以上就是将Python Flask服务打包成Docker镜像并运行的完整指南的详细内容,更多关于Python Flask打包成Docker镜像的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。