数据科学家的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.pyrequirements.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、数据科学和自然语言处理。她喜欢阅读、写作、编程和喝咖啡!目前,她正通过撰写教程、指南、观点文章等,与开发者社区学习和分享知识。