这个实践操作使用容器化概念和 Docker 基本知识,将第 3 章中构建的 Flask 预测服务打包成一个可移植的 Docker 容器。这个过程将确保我们的应用在不同环境中稳定运行。确保您已将第 3 章中的以下文件准备好并放在一个项目目录中:app.py:您的 Flask 应用代码,用于加载模型并定义预测端点。model.joblib(或 .pkl):已保存的机器学习模型文件。requirements.txt:一个列出您的应用所需 Python 库的文件(如 flask、scikit-learn、numpy、joblib)。如果您没有,请现在创建它。它应至少包含:flask joblib scikit-learn numpy # 添加您的特定模型或应用所需的任何其他库此外,如果您在第 2 章中保存的任何预处理工件(如缩放器或编码器)是 app.py 所需的,它们也应放在此目录中。我们的目标是创建一个 Docker 镜像,其中包含 Python 运行时、我们的应用代码、模型文件以及 requirements.txt 中定义的所有必需库。然后,我们将把这个镜像作为一个容器运行起来。第 1 步:创建 Dockerfile在您的项目目录中,创建一个名为 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 部分很重要;它使服务器监听容器内所有可用的网络接口,从而允许我们从外部连接到它。第 2 步:构建 Docker 镜像现在我们有了 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 列在其中。第 3 步:运行 Docker 容器镜像构建完成后,我们现在可以将其作为一个容器运行。在您的终端中执行此命令: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 退出)您的终端将连接到正在运行的容器,并显示其日志。第 4 步:测试容器化服务就像在第 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 容器中运行。第 5 步:停止容器要停止在前台运行的容器,请回到运行容器的终端并按 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 的机器上共享并稳定运行,极大地简化了部署过程。这是使您的机器学习模型在不同环境中可靠可用的重要一步。