Flask 应用容器化入门:用 Docker 部署你的第一个 Web 服务

举报
yd_243549746 发表于 2026/10/24 18:48:42 2026/10/24
【摘要】 本文以一个最小的 Flask 应用为例,完整演示 Docker 容器化的基本流程:编写应用与依赖清单、编写 Dockerfile、构建镜像、运行容器并验证服务,同时整理了端口映射、镜像体积、日志查看等常见问题的处理方法,适合刚接触容器化的开发者入门实践。

把一个本机跑得好好的 Web 项目搬到服务器上,常常会遇到"在我电脑上是好的"的经典难题:Python 版本不一致、依赖装错、系统库缺失。容器化是解决这类问题的标准做法。本文用一个最小的 Flask 应用做例子,带你在十分钟内走完"写应用 → 写 Dockerfile → 构建镜像 → 运行容器 → 验证服务"的完整流程。

一、为什么用 Docker 部署 Web 应用

传统部署方式是把代码和依赖直接装进操作系统,时间一长,服务器上会积累各种版本冲突和来源不明的配置。Docker 把应用和它的全部依赖(Python 解释器、第三方库、系统工具)一起打包成一个镜像,带来的好处很直接:

  1. 环境一致:镜像在任何装了 Docker 的机器上运行结果都相同;
  2. 隔离干净:不同项目之间互不影响,删除容器即删除全部痕迹;
  3. 易于扩展:配合云上的容器服务,可以很方便地做弹性伸缩和滚动升级。

二、准备一个最小的 Flask 应用

新建一个目录作为项目根目录,先创建 requirements.txt:

flask==3.0.3

再创建应用文件 app.py:

from flask import Flask, jsonify
import socket

app = Flask(__name__)

@app.route("/")
def index():
    return jsonify(
        message="Hello, Docker!",
        hostname=socket.gethostname()
    )

@app.route("/health")
def health():
    return jsonify(status="ok")

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

这里有两个细节值得注意:

  • host="0.0.0.0" 必须写,默认的 127.0.0.1 只监听本机回环地址,容器外的请求进不来;
  • 加一个 /health 健康检查接口,后续接入负载均衡或容器编排时会用到。

三、编写 Dockerfile

在项目根目录创建 Dockerfile(无扩展名):

FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.huaweicloud.com/repository/pypi/simple

COPY app.py .

EXPOSE 5000

CMD ["python", "app.py"]

逐行说明:

  • FROM python:3.12-slim:基于官方 Python 3.12 的精简镜像,体积小、拉取快;
  • WORKDIR /app:设定容器内的工作目录;
  • 先 COPY requirements.txt 再安装依赖,是为了利用 Docker 的分层缓存——代码没变时重新构建不会重复下载依赖;
  • EXPOSE 5000:声明容器监听的端口,起文档作用;
  • CMD:容器启动时执行的命令。

四、构建镜像并运行容器

在项目根目录执行构建(最后的点表示构建上下文为当前目录):

docker build -t flask-demo:1.0 .

构建完成后运行容器,把宿主机的 8000 端口映射到容器的 5000 端口:

docker run -d --name flask-demo -p 8000:5000 flask-demo:1.0

用 docker ps 确认容器状态为 Up,然后验证服务:

curl http://127.0.0.1:8000/
# {"hostname":"容器ID","message":"Hello, Docker!"}

curl http://127.0.0.1:8000/health
# {"status":"ok"}

能看到返回的 JSON,说明容器内的服务已经正常对外提供访问。如果是在云服务器上操作,记得在安全组里放行 8000 端口,再用公网 IP 访问。

五、几个常见的坑

  1. 端口映射写反:-p 宿主机端口:容器端口,冒号左边是宿主机端口,写反了会访问不到;
  2. 镜像越攒越大:安装依赖时加 --no-cache-dir,并且用 slim 基础镜像,能显著减小体积;
  3. 日志看不到:app.run 是前台进程,日志直接输出到容器 stdout,用 docker logs -f flask-demo 查看;
  4. 配置硬编码:数据库地址、密钥这类配置建议用 -e 环境变量传入,不要写死在代码里。

六、小结

容器化的价值不只是"能跑起来",而是把环境标准化成一份可版本管理的代码。这套流程走通之后,下一步可以尝试把镜像推送到镜像仓库(如华为云 SWR),再接入 CCE 等容器服务,实现多实例部署与自动伸缩。希望这篇入门文章能帮你迈出容器化的第一步。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。