大家好,Python以及pandas和scikit-learn等Python数据分析和机器学习库套件可以帮助你轻松开发数据科学应用程序。然而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命令,其中大部分将在本文中使用。
命令 | 功能 |
---|---|
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将一个简单的数据科学应用程序进行容器化。
1.房价预测模型
下面是一个线性回归模型,它可以根据输入特征预测目标值:房价中位数。该模型使用加利福尼亚州(California)住房数据集建立:
# 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"Mean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")
我们知道scikit-learn
是必需的依赖项,如果仔细查看代码,在加载数据集时,将as_frame
设置为True,
因此还需要pandas
。requirements.txt
文件如下所示:
pandas==2.0
scikit-learn==1.2.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从指定的基础镜像构建当前镜像。
WORKDIR
命令用于设置所有后续命令(本例中为app
)的工作目录。
然后将requirements.txt
文件复制到容器的文件系统中。
RUN指令将在容器内的shell中执行指定的命令。示例在这里使用pip
安装所有需要的依赖项。
然后将源代码文件(Python脚本house_price_prediction.py
)复制到容器的文件系统中。
最后,CMD
指的是容器启动时要执行的指令。在这里示例需要运行house_price_prediction.py
脚本。Dockerfile应该只包含一条CMD
指令。
3.构建镜像
既然已经定义了Dockerfile,就可以通过运行docker build
来构建Docker镜像了:
docker build -t ml-app .
选项-t
允许用户为镜像指定名称和标签,格式为name:tag
。默认标签为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界面来轻松管理容器。