以一个常规的 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:通过镜像仓库(推荐,适合有网络)
本地操作:
- 在 Docker Hub 或私有仓库上创建仓库,例如
yourname/flask-app。 - 给本地镜像打上远程仓库的标签:
bash docker tag flask-app:latest yourname/flask-app:latest - 推送到仓库:
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 的机器上瞬间启动的标准化单元。
评论
请登录后发表评论
暂无评论,快来发表第一条评论吧!