Flask轻量级部署:Docker容器化快速上线

在开发Web应用时,我们常常会遇到一个问题:“为什么我的代码在本地运行好好的,到了服务器就不行了?” 这通常是因为开发环境和生产环境的差异,比如Python版本、依赖库版本、系统配置不同等。Docker容器化技术能完美解决这个问题,让你的Flask应用在任何支持Docker的环境中“开箱即用”。

为什么选择Docker容器化部署?

传统部署方式需要手动在服务器上配置Python环境、安装依赖、启动服务,容易出错且难以复现。而Docker容器化就像给应用打包了一个“完整的操作系统快照”,无论在开发机、服务器还是云平台,只要Docker环境一致,应用就能以相同的方式运行。

核心优势
- 环境一致:开发、测试、生产环境完全相同,避免“在我电脑上能跑”的玄学问题
- 隔离性:容器之间相互隔离,互不影响
- 轻量化:相比虚拟机,容器资源占用更少
- 快速部署:一行命令即可启动整个应用栈

快速上手:Docker容器化你的第一个Flask应用

步骤1:准备Flask应用

首先,创建一个最简单的Flask应用。新建文件app.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Dockerized Flask App!"

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

再创建requirements.txt(列出依赖):

Flask==2.3.3

步骤2:编写Dockerfile

在项目根目录创建Dockerfile(无后缀名),内容如下:

# 基础镜像:使用官方Python 3.9版本,slim版本体积更小
FROM python:3.9-slim

# 设置工作目录,相当于进入容器后的默认路径
WORKDIR /app

# 复制依赖文件到容器
COPY requirements.txt .

# 安装依赖(--no-cache-dir 避免缓存占用空间)
RUN pip install --no-cache-dir -r requirements.txt

# 复制当前目录文件到容器工作目录
COPY . .

# 设置环境变量:指定Flask入口文件和运行环境
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# 暴露容器内的5000端口(仅声明,实际映射需在运行时指定)
EXPOSE 5000

# 启动命令:运行Flask应用
CMD ["flask", "run", "--host=0.0.0.0"]

步骤3:构建Docker镜像

在项目目录执行以下命令构建镜像(.表示当前目录,注意末尾有个点):

docker build -t myflaskapp .
  • -t myflaskapp:给镜像打标签(myflaskapp是镜像名,可自定义)
  • docker build:告诉Docker根据Dockerfile构建镜像

构建成功后,可通过docker images查看镜像列表,找到名为myflaskapp的镜像。

步骤4:运行Docker容器

使用构建好的镜像启动容器:

docker run -p 5000:5000 myflaskapp
  • -p 5000:5000:将容器内的5000端口映射到本地5000端口
  • 此时访问http://localhost:5000,就能看到Flask应用返回的“Hello, Dockerized Flask App!”

步骤5:停止容器

Ctrl+C停止容器,如需后台运行(守护模式),可加-d参数:

docker run -d -p 5000:5000 --name myflaskcontainer myflaskapp

如需停止运行中的容器:

docker stop myflaskcontainer  # 停止容器
docker rm myflaskcontainer   # 删除已停止容器(可选)

进阶技巧:让部署更专业

1. 优化镜像体积(多阶段构建)

上面的Dockerfile直接使用基础镜像,可能体积较大。可通过多阶段构建减小镜像:

# 阶段1:构建阶段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt

# 阶段2:运行阶段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /app/wheels /wheels
RUN pip install --no-cache /wheels/*
COPY . .
ENV FLASK_APP=app.py
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]

2. 数据持久化(避免文件丢失)

如果应用需要保存用户上传文件或数据库数据,可通过Docker卷挂载:

# 创建数据卷
docker volume create flask_data

# 运行容器时挂载卷(将容器内/app/data目录映射到数据卷)
docker run -d -p 5000:5000 -v flask_data:/app/data myflaskapp

3. 环境变量管理(敏感信息不硬编码)

创建.env文件(不要提交到代码库):

FLASK_SECRET_KEY=your_secret_key_here
DATABASE_URI=sqlite:////app/data/db.sqlite

在Dockerfile中引用环境变量:

# 在Dockerfile中设置默认环境变量(开发用)
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# 运行时通过-e参数覆盖
docker run -e FLASK_SECRET_KEY=prod_key -p 5000:5000 myflaskapp

总结

Docker容器化部署Flask应用,让你彻底摆脱“环境依赖”的困扰。核心流程是:编写Dockerfile → 构建镜像 → 运行容器。通过多阶段构建、数据卷、环境变量等技巧,能让部署更稳定、更安全。

初学者必做:尝试将自己的Flask应用用Docker打包,体验“一次构建,到处运行”的快乐!

常见问题Q&A

  • Q:如何查看容器日志?
    A:docker logs 容器ID或名称

  • Q:修改代码后如何重新部署?
    A:重新构建镜像:docker build -t myflaskapp .,然后重启容器

  • Q:没有Docker Desktop怎么办?
    A:Windows/Mac需安装Docker Desktop,Linux可参考官方文档安装Docker引擎

通过Docker容器化,你的Flask应用将拥有“一次打包,到处运行”的能力,部署效率和稳定性将大幅提升!

小夜