Docker篇6-项目app.py和flask_app.service配置和映射到docker中
假设你已经有一个简单的 app.py(Flask 后端)和 flask_app.service(系统服务配置,用于在 Ubuntu 上直接启动服务),现在需要将其迁移到 Docker 中运行。下面是完整的步骤和配置示例:
前提条件
已有文件:
app.py(Flask 应用)python
运行
from flask import Flask app = Flask(__name__)@app.route('/') def hello():return "Hello from Docker!"if __name__ == '__main__':# 注意:Docker 中需要监听 0.0.0.0(允许外部访问),端口用 5000app.run(host='0.0.0.0', port=5000)flask_app.service(原系统服务配置,用于对比,迁移后可弃用)ini
[Unit] Description=Flask App Service After=network.target[Service] User=ubuntu WorkingDirectory=/home/ubuntu/myapp ExecStart=/home/ubuntu/myapp/venv/bin/python app.py Restart=always[Install] WantedBy=multi-user.target
步骤 1:创建 Docker 相关配置文件
需要新增 2 个文件,让 Docker 能打包和运行应用:
1. requirements.txt(列出依赖,必选)
Flask 应用需要的依赖,避免手动安装:
txt
flask==2.0.1 # 你的 Flask 版本
2. Dockerfile(构建镜像的脚本,核心)
定义如何打包应用到 Docker 镜像:
dockerfile
# 基础镜像:用 Python 官方镜像(Linux 环境,和 Ubuntu 兼容)
FROM python:3.9-slim# 设置工作目录(容器内的目录,类似 Ubuntu 中的 /home/ubuntu/myapp)
WORKDIR /app# 复制依赖文件到容器,先复制 requirements.txt 可利用缓存优化
COPY requirements.txt .# 安装依赖(类似本地 pip install)
RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码到容器(当前目录的所有文件,包括 app.py)
COPY . .# 容器启动时执行的命令(替代 flask_app.service 中的 ExecStart)
CMD ["python", "app.py"]
步骤 2:构建 Docker 镜像
在 Ubuntu 服务器上,进入项目目录(包含 app.py、Dockerfile、requirements.txt),执行以下命令构建镜像:
bash
# 构建镜像,命名为 flask-app,版本为 v1
docker build -t flask-app:v1 .
- 执行成功后,用
docker images可看到构建好的镜像。
步骤 3:运行 Docker 容器(替代系统服务)
用以下命令启动容器,替代原来的 systemctl start flask_app:
bash
# 启动容器,映射主机端口 80 到容器端口 5000(容器内 app.py 监听 5000)
docker run -d \--name my-flask-container \ # 容器名,类似服务名-p 80:5000 \ # 端口映射(主机端口:容器端口)--restart always \ # 类似服务的 Restart=always,容器崩溃自动重启flask-app:v1 # 基于哪个镜像启动
- 此时访问服务器的
http://服务器IP即可看到 "Hello from Docker!"。
关键对比:Docker 方式 vs 系统服务方式
| 功能 | 原系统服务(flask_app.service) | Docker 方式 |
|---|---|---|
| 启动命令 | systemctl start flask_app | docker start my-flask-container |
| 停止命令 | systemctl stop flask_app | docker stop my-flask-container |
| 开机自启 | systemctl enable flask_app | 启动时加 --restart always |
| 日志查看 | journalctl -u flask_app | docker logs my-flask-container |
| 环境隔离 | 依赖系统全局环境,可能冲突 | 完全隔离,依赖打包在镜像中 |
| 端口配置 | 在 app.py 中硬编码,需手动管理冲突 | 通过 -p 参数映射,灵活避免冲突 |
后续操作
如果修改了
app.py,需要重新构建镜像并重启容器:bash
docker build -t flask-app:v2 . # 构建新版本 docker stop my-flask-container # 停止旧容器 docker rm my-flask-container # 删除旧容器 docker run -d --name my-flask-container -p 80:5000 --restart always flask-app:v2 # 启动新容器如需删除镜像(清理空间):
bash
docker rmi flask-app:v1 # 删除指定版本镜像(需先删除依赖该镜像的容器)
通过以上步骤,你就将原来的系统服务方式运行的 Flask 应用,迁移到了 Docker 中,实现了环境隔离和更灵活的部署。
