趋近智
这个实践操作使用容器化概念和 Docker 基本知识,将第 3 章中构建的 Flask 预测服务打包成一个可移植的 Docker 容器。这个过程将确保我们的应用在不同环境中稳定运行。
确保您已将第 3 章中的以下文件准备好并放在一个项目目录中:
app.py:您的 Flask 应用代码,用于加载模型并定义预测端点。model.joblib(或 .pkl):已保存的机器学习 (machine learning)模型文件。requirements.txt:一个列出您的应用所需 Python 库的文件(如 flask、scikit-learn、numpy、joblib)。如果您没有,请现在创建它。它应至少包含:
flask
joblib
scikit-learn
numpy
# 添加您的特定模型或应用所需的任何其他库
app.py 所需的,它们也应放在此目录中。我们的目标是创建一个 Docker 镜像,其中包含 Python 运行时、我们的应用代码、模型文件以及 requirements.txt 中定义的所有必需库。然后,我们将把这个镜像作为一个容器运行起来。
在您的项目目录中,创建一个名为 Dockerfile(无文件扩展名)的新文件。用文本编辑器打开此文件并添加以下指令:
# 使用官方 Python 运行时作为父镜像
FROM python:3.9-slim
# 设置容器中的工作目录
WORKDIR /app
# 将 requirements 文件复制到容器的 /app 目录
COPY requirements.txt .
# 安装 requirements.txt 中指定的任何必需包
RUN pip install --no-cache-dir -r requirements.txt
# 将其余应用代码和模型复制到容器的 /app 目录
COPY . .
# 使端口 5000 在此容器外部可用
EXPOSE 5000
# 为 Flask 定义环境变量
ENV FLASK_APP=app.py
# 在容器启动时,使用 Flask 的内置服务器运行 app.py
CMD ["flask", "run", "--host=0.0.0.0"]
让我们逐一分析每条指令的作用:
FROM python:3.9-slim:这指定了我们容器的基础镜像。我们从一个最小化的官方 Python 3.9 镜像(slim 版本)开始。如果本地没有,Docker 将下载它。WORKDIR /app:这会将容器内部的工作目录设置为 /app。后续的命令,如 COPY 和 RUN,将相对于此目录执行。COPY requirements.txt .:这会将您宿主机项目目录中的 requirements.txt 文件复制到容器的工作目录(/app)。。表示容器内的当前工作目录。RUN pip install --no-cache-dir -r requirements.txt:此命令在容器内部运行 pip install,以安装 requirements.txt 中列出的所有库。--no-cache-dir 标志常用于 Docker 构建中,通过不存储下载缓存来减小镜像大小。COPY . .:这会将您项目目录中的所有其他内容(您的 app.py、model.joblib 等)复制到容器的工作目录(/app)。我们先复制 requirements.txt 并安装依赖项,然后再复制其余代码;这优化了 Docker 的层缓存。如果您的代码不变但依赖项改变,Docker 只需重新运行 pip install 步骤。EXPOSE 5000:这告知 Docker 容器在运行时将监听端口 5000。这并不会实际发布端口;它更像是镜像内部的说明。Flask 开发服务器默认使用端口 5000。ENV FLASK_APP=app.py:在容器内部设置一个环境变量,告诉 Flask 要运行哪个文件。CMD ["flask", "run", "--host=0.0.0.0"]:这指定了从该镜像启动容器时要运行的命令。我们使用 flask run 来启动开发服务器。--host=0.0.0.0 部分很重要;它使服务器监听容器内所有可用的网络接口,从而允许我们从外部连接到它。现在我们有了 Dockerfile,就可以构建镜像了。打开您的终端或命令提示符,导航到您的项目目录(包含 Dockerfile、app.py 等的目录),然后运行以下命令:
docker build -t ml-prediction-service .
让我们理解这个命令:
docker build:从 Dockerfile 构建镜像的命令。-t ml-prediction-service:-t 标志允许您为镜像“打标签”并命名(以及可选的标签,如 :latest 或 :v1)。我们将镜像命名为 ml-prediction-service。这使得以后引用它更容易。.:这告诉 Docker 在当前目录中查找 Dockerfile。Docker 现在将逐步执行您的 Dockerfile 中的指令。您将看到它下载基础镜像(如果需要)、安装包和复制文件的输出。第一次执行时可能需要一两分钟,尤其是在 pip install 步骤。随后的构建可能会因为 Docker 的缓存机制而更快。
如果构建成功完成,您就创建了 Docker 镜像!您可以通过列出本地 Docker 镜像来验证这一点:
docker images
您应该会看到 ml-prediction-service 列在其中。
镜像构建完成后,我们现在可以将其作为一个容器运行。在您的终端中执行此命令:
docker run -p 5000:5000 ml-prediction-service
让我们检查 docker run 命令:
docker run:从镜像启动新容器的命令。-p 5000:5000:这是端口映射标志。它将您宿主机上的端口 5000(第一个 5000)映射到容器内部的端口 5000(第二个 5000)。请记住,Dockerfile 中的 EXPOSE 5000 只是说明了端口;-p 实际上建立了连接。这使得您可以通过 localhost:5000 在您的机器上访问容器内运行的 Flask 应用。ml-prediction-service:我们要运行的镜像的名称。您应该会看到 Flask 的输出,表明服务器正在运行,这与您在第 3 章中直接运行它时类似,但现在它是在隔离的容器环境中运行。
* 正在提供 Flask 应用 'app.py'
* 环境:生产
警告:这是一个开发服务器。请勿在生产部署中使用它。
请改用生产 WSGI 服务器。
* 调试模式:关闭
* 正在所有地址 (0.0.0.0) 上运行
警告:这是一个开发服务器。请勿在生产部署中使用它。
* 正在 http://127.0.0.1:5000 上运行
* 正在 http://[::]:5000 上运行 (按 CTRL+C 退出)
您的终端将连接到正在运行的容器,并显示其日志。
就像在第 3 章中一样,您可以测试您的 API。打开一个新的终端窗口(让容器在第一个窗口中保持运行),然后使用 curl 或带有 requests 库的 Python 脚本向 http://localhost:5000/predict(或您定义的任何端点)发送 POST 请求。
使用 curl(将示例数据替换为您的模型的有效输入):
curl -X POST -H "Content-Type: application/json" \
-d '{"features": [5.1, 3.5, 1.4, 0.2]}' \
http://localhost:5000/predict
您应该会像以前一样从服务接收到 JSON 预测结果。不同之处在于,该服务现在是在一个标准化、隔离的 Docker 容器中运行。
要停止在前台运行的容器,请回到运行容器的终端并按 CTRL+C。
如果您想在后台运行容器(分离模式),可以添加 -d 标志:
docker run -d -p 5000:5000 ml-prediction-service
此命令将启动容器并打印其唯一 ID。它将继续在后台运行。要查看正在运行的容器,请使用:
docker ps
要停止一个分离的容器,请使用 docker stop <container_id_or_name>:
docker stop <output_container_id_from_docker_ps>
恭喜!您已成功使用 Docker 容器化了您的 Flask 预测服务。您现在拥有了一个定义环境的 Dockerfile,以及一个打包了您的应用和依赖项的 Docker 镜像。这个镜像可以在任何安装了 Docker 的机器上共享并稳定运行,极大地简化了部署过程。这是使您的机器学习 (machine learning)模型在不同环境中可靠可用的重要一步。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造