数据科学家的Docker教程
Docker Tutorial for Data Scientists
Python和Python数据分析和机器学习库(如pandas和scikit-learn)可以帮助您轻松开发数据科学应用。然而,Python中的依赖管理是一个挑战。在开发数据科学项目时,您将不得不花费大量时间安装各种库并跟踪您使用的库的版本等。
如果其他开发人员想要运行您的代码并为项目做出贡献怎么办?嗯,其他开发人员想要复制您的数据科学应用程序,首先应在他们的机器上设置项目环境,然后才能继续运行代码。即使小小的差异,如不同的库版本,也可能对代码造成破坏性变化。 Docker 来拯救。Docker简化了开发过程,并促进了无缝协作。
本指南将介绍Docker的基础知识,并教您如何使用Docker对数据科学应用进行容器化。
什么是Docker?
Docker是一个容器化工具,它允许您将应用程序构建和共享为可移植的称为镜像的工件。
除了源代码,您的应用程序还将具有一组依赖项、所需配置、系统工具等。例如,在数据科学项目中,您将在开发环境中安装所有所需的库(最好在虚拟环境内)。您还将确保您正在使用库支持的更新版本的Python。
然而,当您尝试在另一台机器上运行应用程序时,您可能会遇到问题。这些问题通常源于开发环境中的配置和库版本之间的不匹配。
使用Docker,您可以将应用程序与依赖项和配置打包在一起。因此,您可以为应用程序在各种主机机器上定义一个隔离的、可重现的和一致的环境。
Docker基础知识:镜像、容器和注册表
让我们简要介绍一些概念/术语:
Docker镜像
Docker镜像是您的应用程序的可移植工件。
Docker容器
当您运行一个镜像时,实际上是在容器环境中运行应用程序。因此,镜像的运行实例是一个容器。
Docker注册表
Docker注册表是用于存储和分发Docker镜像的系统。将应用程序容器化为Docker镜像后,您可以通过将其推送到镜像注册表使其对开发者社区可用。DockerHub是最大的公共注册表,默认情况下所有镜像都从DockerHub获取。
Docker如何简化开发?
因为容器为您的应用程序提供了一个隔离的环境,其他开发人员现在只需要在他们的机器上安装好Docker。他们可以通过一个命令拉取Docker镜像并启动容器,而无需担心复杂的安装过程。
在开发应用程序时,通常会构建和测试多个版本的同一应用程序。如果使用Docker,您可以在同一环境中的不同容器中运行同一应用程序的多个版本,而不会发生任何冲突。
除了简化开发,Docker还简化了部署,并帮助开发和运维团队有效协作。在服务器端,运维团队无需花费时间解决复杂的版本和依赖冲突。他们只需要设置好Docker运行时即可。
重要的Docker命令
让我们快速浏览一些基本的Docker命令,其中大部分我们将在本教程中使用。有关更详细的概述,请阅读:12个数据科学家应该知道的Docker命令。
命令 | 功能 |
docker ps |
列出所有正在运行的容器 |
docker pull image-name |
从DockerHub默认拉取image-name |
docker images |
列出所有可用的镜像 |
docker run image-name |
从镜像启动容器 |
docker start container-id |
重新启动已停止的容器 |
docker stop container-id |
停止正在运行的容器 |
docker build path |
使用Dockerfile中的指令在路径上构建镜像 |
注意:如果您尚未使用用户创建docker组,请在所有命令前加上sudo
前缀。
如何使用Docker将数据科学应用程序容器化
我们已经学习了Docker的基础知识,现在是时候应用我们所学到的知识了。在本节中,我们将使用Docker将一个简单的数据科学应用程序容器化。
房价预测模型
让我们来看一个基于输入特征预测目标值(即房屋价格中位数)的线性回归模型。该模型使用加利福尼亚房屋数据集构建:
# house_price_prediction.py
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 加载加利福尼亚房屋数据集
data = fetch_california_housing(as_frame=True)
X = data.data
y = data.target
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 对测试集进行预测
y_pred = model.predict(X_test)
# 评估模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"均方误差:{mse:.2f}")
print(f"R平方得分:{r2:.2f}")
我们知道scikit-learn是必需的依赖项。如果您查看代码,我们在加载数据集时将as_frame
设置为True。因此我们还需要pandas。而requirements.txt
文件如下所示:
pandas==2.0
scikit-learn==1.2.2
创建Dockerfile
到目前为止,我们有源代码文件house_price_prediction.py
和requirements.txt
文件。现在我们应该定义如何从我们的应用程序构建镜像。Dockerfile用于创建从应用程序源代码文件构建映像的定义。
那么什么是Dockerfile?它是一个文本文档,包含逐步构建Docker映像的指令。
这是我们示例的Dockerfile:
# 使用官方Python映像作为基础映像
FROM python:3.9-slim
# 在容器中设置工作目录
WORKDIR /app
# 将requirements.txt文件复制到容器中
COPY requirements.txt .
# 安装依赖项
RUN pip install --no-cache-dir -r requirements.txt
# 将脚本文件复制到容器中
COPY house_price_prediction.py .
# 设置要运行的Python脚本命令
CMD ["python", "house_price_prediction.py"]
让我们来解释一下Dockerfile的内容:
- 所有Dockerfile都以
FROM
指令开始,指定基础映像。基础映像是您的映像所基于的映像。这里我们使用了一个可用的Python 3.9映像。FROM
指令告诉Docker从指定的基础映像构建当前映像。 SET
命令用于设置所有后续命令的工作目录(本例中为app)。- 然后,我们将
requirements.txt
文件复制到容器的文件系统中。 RUN
指令在容器内部的shell中执行指定的命令。这里我们使用pip
安装所有所需的依赖项。- 然后,我们将源代码文件(Python脚本
house_price_prediction.py
)复制到容器的文件系统中。 - 最后,
CMD
指的是在容器启动时要执行的指令。这里我们需要运行house_price_prediction.py
脚本。Dockerfile应该只包含一个CMD
指令。
构建镜像
现在我们已经定义了Dockerfile,我们可以通过运行docker build
来构建docker镜像:
docker build -t ml-app .
选项-t允许我们以名称:标签的格式指定镜像的名称和标签。默认标签是latest。
构建过程需要几分钟:
Sending build context to Docker daemon 4.608kB
Step 1/6 : FROM python:3.9-slim
3.9-slim: Pulling from library/python
5b5fe70539cd: Pull complete
f4b0e4004dc0: Pull complete
ec1650096fae: Pull complete
2ee3c5a347ae: Pull complete
d854e82593a7: Pull complete
Digest: sha256:0074c6241f2ff175532c72fb0fb37264e8a1ac68f9790f9ee6da7e9fdfb67a0e
Status: Downloaded newer image for python:3.9-slim
---> 326a3a036ed2
Step 2/6 : WORKDIR /app
...
...
...
Step 6/6 : CMD ["python", "house_price_prediction.py"]
---> Running in 7fcef6a2ab2c
Removing intermediate container 7fcef6a2ab2c
---> 2607aa43c61a
Successfully built 2607aa43c61a
Successfully tagged ml-app:latest
Docker镜像构建完成后,运行docker images
命令。你应该也能看到ml-app
镜像的列表。
docker images
你可以使用docker run
命令运行Docker镜像ml-app
:
docker run ml-app
恭喜!你刚刚将第一个数据科学应用程序进行了Docker化。通过创建DockerHub账户,你可以将镜像推送到其中(或者推送到组织内的私有仓库)。
结论
希望你觉得这个入门级Docker教程有帮助。你可以在这个GitHub仓库中找到本教程中使用的代码。作为下一步,设置你的机器上的Docker并尝试这个示例。或者将你选择的应用程序进行Docker化。
在你的机器上安装Docker最简单的方法是使用Docker Desktop:你可以同时获得Docker CLI客户端和一个GUI来轻松管理你的容器。所以立即设置Docker并开始编码吧! Bala Priya C是来自印度的开发者和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉领域工作。她感兴趣并擅长DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编程和喝咖啡!目前,她正通过撰写教程、指南、观点文章等,与开发者社区学习和分享知识。