将Python Flask服务打包成Docker镜像并运行的完整指南
将 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,正常加载随机名言卡片与图片即判定构建成功。

高频异常处理对照表
- 端口冲突:若提示 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镜像的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









