以一个常规的 Flask 网站工程为例,从本地开发完成到在另一台机器上用 Docker 运行,整个流程大致分为 编写 Dockerfile → 构建镜像 → (可选)本地测试 → 搬运镜像 → 目标机器运行 这五步。下面展开说明。


1. 编写 Dockerfile(定义镜像)

在 Flask 项目根目录下创建一个名为 Dockerfile 的文件,告诉 Docker 如何打包你的应用。一个最简示例:

# 1. 基础镜像:使用官方 Python 3.11 轻量版
FROM python:3.11-slim

# 2. 设置工作目录(容器内的路径)
WORKDIR /app

# 3. 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 4. 复制项目代码到容器内
COPY . .

# 5. 声明容器运行时监听的端口(Flask 默认 5000)
EXPOSE 5000

# 6. 容器启动时执行的命令
CMD ["python", "app.py"]

要点
- 分层结构会被缓存,改动代码时只重建变化层,加快构建。
- 先复制 requirements.txt 再安装依赖,是为了利用缓存,避免每次改代码都重装所有包。
- 如果你的 Flask 通过 flask run 启动,需要确保 flask 命令可用,且 host 设为 0.0.0.0(否则容器外部无法访问)。


2. 构建镜像

在终端执行:

docker build -t flask-app:latest .
  • -t flask-app:latest:给镜像命名并打上标签(latest 表示最新版)。
  • . 指向 Dockerfile 所在目录。
  • 过程会下载基础镜像、安装依赖、复制代码,最终生成一个本地镜像。

3. 本地测试(可选但强烈建议)

构建好后,先在本机跑一下确认没问题:

docker run -d -p 5000:5000 --name myflask flask-app:latest
  • -d:后台运行。
  • -p 5000:5000:将宿主机的 5000 端口映射到容器的 5000 端口。
  • --name myflask:给容器起个名字。

然后浏览器访问 http://localhost:5000 检查是否正常。测试完可以停掉容器:docker stop myflask && docker rm myflask


4. 搬运镜像到另一台机器

你有两种常见方式,视网络环境而定。

方式 A:通过镜像仓库(推荐,适合有网络)

本地操作:

  1. Docker Hub 或私有仓库上创建仓库,例如 yourname/flask-app
  2. 给本地镜像打上远程仓库的标签:
    bash docker tag flask-app:latest yourname/flask-app:latest
  3. 推送到仓库:
    bash docker push yourname/flask-app:latest

目标机器操作:

docker pull yourname/flask-app:latest

方式 B:离线导出/导入(适合无网络或内网)

本地操作:

docker save -o flask-app.tar flask-app:latest

这会生成一个 flask-app.tar 文件,包含镜像所有层。

然后用 U 盘、scp 等把 flask-app.tar 复制到目标机器。

目标机器操作:

docker load -i flask-app.tar

加载后,目标机器上就有了完全相同的 flask-app:latest 镜像。


5. 在目标机器上运行

和本地测试一样,在目标机器上执行:

docker run -d -p 80:5000 --name myflask flask-app:latest

这里我把宿主机端口映射成了 80,这样访问该机器 IP 的 80 端口就会转发到容器的 5000 端口,用户不需要加端口号即可访问。

如果项目还依赖其他服务(数据库、缓存等),通常会配合 docker-compose.yml 定义一个多容器应用,将镜像搬运到目标机后,直接 docker-compose up -d 一键启动所有服务。


流程总结图

本地开发完成
   
   ├─ 编写 Dockerfile
   ├─ docker build -t flask-app .
   ├─ docker run 本地测试
   ├─ docker tag + docker push (或 docker save
   
目标机器
   ├─ docker pull (或 docker load -i flask-app.tar
   └─ docker run -d -p 端口映射 flask-app

这整个流程背后体现的就是 Docker 的核心价值:一次构建,随处运行。你交付的不再是“一堆代码 + 环境配置文档”,而是一个自包含的、可在任何支持 Docker 的机器上瞬间启动的标准化单元。