Flask 应用容器化入门:用 Docker 部署你的第一个 Web 服务
把一个本机跑得好好的 Web 项目搬到服务器上,常常会遇到"在我电脑上是好的"的经典难题:Python 版本不一致、依赖装错、系统库缺失。容器化是解决这类问题的标准做法。本文用一个最小的 Flask 应用做例子,带你在十分钟内走完"写应用 → 写 Dockerfile → 构建镜像 → 运行容器 → 验证服务"的完整流程。
一、为什么用 Docker 部署 Web 应用
传统部署方式是把代码和依赖直接装进操作系统,时间一长,服务器上会积累各种版本冲突和来源不明的配置。Docker 把应用和它的全部依赖(Python 解释器、第三方库、系统工具)一起打包成一个镜像,带来的好处很直接:
- 环境一致:镜像在任何装了 Docker 的机器上运行结果都相同;
- 隔离干净:不同项目之间互不影响,删除容器即删除全部痕迹;
- 易于扩展:配合云上的容器服务,可以很方便地做弹性伸缩和滚动升级。
二、准备一个最小的 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 访问。
五、几个常见的坑
- 端口映射写反:
-p 宿主机端口:容器端口,冒号左边是宿主机端口,写反了会访问不到; - 镜像越攒越大:安装依赖时加
--no-cache-dir,并且用slim基础镜像,能显著减小体积; - 日志看不到:
app.run是前台进程,日志直接输出到容器 stdout,用docker logs -f flask-demo查看; - 配置硬编码:数据库地址、密钥这类配置建议用
-e环境变量传入,不要写死在代码里。
六、小结
容器化的价值不只是"能跑起来",而是把环境标准化成一份可版本管理的代码。这套流程走通之后,下一步可以尝试把镜像推送到镜像仓库(如华为云 SWR),再接入 CCE 等容器服务,实现多实例部署与自动伸缩。希望这篇入门文章能帮你迈出容器化的第一步。
- 点赞
- 收藏
- 关注作者
评论(0)