Python/ target=_blank class=infotextkey>Python以及pandas和scikit-learn等Python數(shù)據(jù)分析和機(jī)器學(xué)習(xí)庫套件可以幫助你輕松開發(fā)數(shù)據(jù)科學(xué)應(yīng)用程序。然而,Python中的依賴性管理是一項(xiàng)挑戰(zhàn)。在進(jìn)行數(shù)據(jù)科學(xué)項(xiàng)目時(shí),需要花費(fèi)大量時(shí)間安裝各種庫,并跟蹤正在使用的庫的版本。

如果其他開發(fā)人員想要運(yùn)行您的代碼并為項(xiàng)目做出貢獻(xiàn),他們首先需要在他們的機(jī)器上設(shè)置項(xiàng)目環(huán)境,然后才能繼續(xù)運(yùn)行代碼。即使是如不同的庫版本之間的微小差異也可能對(duì)代碼產(chǎn)生破壞性的影響。這時(shí)就可以使用Docker。Docker簡化了開發(fā)過程,并促進(jìn)了無縫的協(xié)作。
本指南將介紹Docker的基礎(chǔ)知識(shí),并教你如何使用Docker對(duì)數(shù)據(jù)科學(xué)應(yīng)用程序進(jìn)行容器化。
什么是Docker?

【Docker】:https://www.docker.com/
Docker是一個(gè)容器化工具,可讓你構(gòu)建和共享稱為鏡像的可移植應(yīng)用程序。
除了源代碼,你的應(yīng)用程序還將包含一系列依賴項(xiàng)、所需配置、系統(tǒng)工具等。例如,在數(shù)據(jù)科學(xué)項(xiàng)目中,你需要在開發(fā)環(huán)境(最好是虛擬環(huán)境)中安裝所有必需的庫。還需要確保使用的Python是庫支持的最新版本。
然而,當(dāng)嘗試在另一臺(tái)機(jī)器上運(yùn)行應(yīng)用程序時(shí),可能仍會(huì)遇到問題。這些問題通常源于兩臺(tái)機(jī)器之間開發(fā)環(huán)境中配置和庫版本不匹配。
使用Docker,可以打包應(yīng)用程序及其依賴項(xiàng)和配置。因此,可以為應(yīng)用程序在各種主機(jī)機(jī)器上定義一個(gè)隔離的、可復(fù)現(xiàn)的和一致的環(huán)境。
Docker基礎(chǔ)知識(shí):鏡像、容器和注冊(cè)表
首先簡要介紹一些概念和術(shù)語:
Docker鏡像
Docker鏡像是應(yīng)用程序的可移植構(gòu)件。
Docker容器
當(dāng)運(yùn)行一個(gè)鏡像時(shí),實(shí)際上是在容器環(huán)境中運(yùn)行該應(yīng)用程序。因此,一個(gè)正在運(yùn)行鏡像的實(shí)例就是一個(gè)容器。
Docker注冊(cè)表
Docker注冊(cè)表是用于存儲(chǔ)和分發(fā)Docker鏡像的系統(tǒng)。將應(yīng)用程序容器化為Docker鏡像后,可以通過將其推送到鏡像注冊(cè)表來向開發(fā)者社區(qū)提供它們。DockerHub是最大的公共注冊(cè)表,默認(rèn)情況下,所有鏡像都從DockerHub拉取。
Docker如何簡化開發(fā)?
由于容器為應(yīng)用程序提供了一個(gè)隔離的環(huán)境,其他開發(fā)人員現(xiàn)在只需要在自己的機(jī)器上安裝Docker。他們可以通過一個(gè)命令在遠(yuǎn)程機(jī)器上拉取Docker鏡像并啟動(dòng)容器,而無需擔(dān)心復(fù)雜的安裝過程。
在開發(fā)應(yīng)用程序時(shí),通常會(huì)構(gòu)建和測試同一應(yīng)用程序的多個(gè)版本。如果使用Docker,就可以在同一環(huán)境中的不同容器中運(yùn)行多個(gè)版本的同一應(yīng)用程序,而不會(huì)出現(xiàn)任何沖突。
除了簡化開發(fā),Docker還簡化了部署,并有助于開發(fā)和運(yùn)維團(tuán)隊(duì)有效地進(jìn)行協(xié)作。在服務(wù)器端,運(yùn)維團(tuán)隊(duì)不需要花時(shí)間解決復(fù)雜的版本和依賴沖突。他們只需使用Docker鏡像來部署應(yīng)用程序,確保在生產(chǎn)環(huán)境中使用與開發(fā)環(huán)境相同的容器。
基本的Docker命令
接下來快速瀏覽一些基本的Docker命令,其中大部分將在本教程中使用。
| 命令 | 功能 |
|---|---|
docker ps |
列出所有正在運(yùn)行的容器 |
docker pull |
image-name從DockerHub默認(rèn)拉取image-name |
docker images |
列出所有可用的鏡像 |
docker run image-name |
從鏡像啟動(dòng)容器 |
docker start contAIner-id |
重新啟動(dòng)已停止的容器 |
docker stop container-id |
停止正在運(yùn)行的容器 |
docker build path |
使用Dockerfile中的指令在指定路徑上構(gòu)建一個(gè)鏡像 |
注意:如果尚未為用戶創(chuàng)建docker組,請(qǐng)?jiān)谶\(yùn)行所有命令時(shí)都要加上sudo前綴。
如何使用Docker將數(shù)據(jù)科學(xué)應(yīng)用程序容器化?
現(xiàn)在已經(jīng)學(xué)習(xí)了Docker的基礎(chǔ)知識(shí),那么是應(yīng)用所學(xué)知識(shí)的時(shí)候了。在本節(jié)中,我們將使用Docker將一個(gè)簡單的數(shù)據(jù)科學(xué)應(yīng)用程序進(jìn)行容器化。
房價(jià)預(yù)測模型
下面是一個(gè)線性回歸模型,它可以根據(jù)輸入特征預(yù)測目標(biāo)值:房價(jià)中位數(shù)。該模型使用加利福尼亞州(California)住房數(shù)據(jù)集建立:
【加利福尼亞州住房數(shù)據(jù)集】:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html
# 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
# 加載加利福尼亞州住房數(shù)據(jù)集
data = fetch_california_housing(as_frame=True)
X = data.data
y = data.target
# 將數(shù)據(jù)集拆分為訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 標(biāo)準(zhǔn)化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 訓(xùn)練模型
model = LinearRegression()
model.fit(X_train, y_train)
# 對(duì)測試集進(jìn)行預(yù)測
y_pred = model.predict(X_test)
# 評(píng)估模型
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是必需的依賴項(xiàng)。如果仔細(xì)查看代碼,在加載數(shù)據(jù)集時(shí),我們將as_frame設(shè)置為True。因此還需要pandas。requirements.txt文件如下所示:
pandas==2.0
scikit-learn==1.2.2

創(chuàng)建Dockerfile
到目前為止,已經(jīng)有了源代碼文件house_price_prediction.py和requirements.txt文件。現(xiàn)在應(yīng)該定義如何從應(yīng)用程序中構(gòu)建鏡像。Dockerfile用于創(chuàng)建從應(yīng)用程序源代碼文件構(gòu)建鏡像的定義。
那么什么是Dockerfile呢?它是一份文本文件,其中包含構(gòu)建Docker鏡像的逐步說明。

如下是示例的Dockerfile:
# 使用Python官方鏡像作為基礎(chǔ)鏡像
FROM python:3.9-slim
# 設(shè)置容器中的工作目錄
WORKDIR /App
# 將`requirements.txt`文件復(fù)制到容器中
COPY requirements.txt .
# 安裝依賴項(xiàng)
RUN pip install --no-cache-dir -r requirements.txt
# 將腳本文件復(fù)制到容器中
COPY house_price_prediction.py .
# 設(shè)置運(yùn)行Python腳本的命令
CMD ["python", "house_price_prediction.py"]
接下來分析一下Dockerfile的內(nèi)容:
-
所有Dockerfile都以指定基礎(chǔ)鏡像的
FROM指令開始。基礎(chǔ)鏡像就是你的鏡像所基于的鏡像。這里示例使用的是Python 3.9的可用鏡像。FROM指令告訴Docker從指定的基礎(chǔ)鏡像構(gòu)建當(dāng)前鏡像。 -
WORKDIR命令用于設(shè)置所有后續(xù)命令(本例中為app)的工作目錄。 -
然后將
requirements.txt文件復(fù)制到容器的文件系統(tǒng)中。 -
RUN指令將在容器內(nèi)的shell中執(zhí)行指定的命令。示例在這里使用
pip安裝所有需要的依賴項(xiàng)。 -
然后將源代碼文件(Python腳本
house_price_prediction.py)復(fù)制到容器的文件系統(tǒng)中。 -
最后,
CMD指的是容器啟動(dòng)時(shí)要執(zhí)行的指令。在這里示例需要運(yùn)行house_price_prediction.py腳本。Dockerfile應(yīng)該只包含一條CMD指令。
構(gòu)建鏡像
既然已經(jīng)定義了Dockerfile,就可以通過運(yùn)行docker build來構(gòu)建Docker鏡像了:
docker build -t ml-app .
選項(xiàng)-t允許用戶為鏡像指定名稱和標(biāo)簽,格式為name:tag。默認(rèn)標(biāo)簽為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鏡像后,運(yùn)行docker images命令。用戶應(yīng)該會(huì)看到ml-app鏡像也在其中。
docker images

可以使用docker run命令運(yùn)行Docker鏡像ml-app:
docker run ml-app

你現(xiàn)在實(shí)現(xiàn)了第一個(gè)數(shù)據(jù)科學(xué)應(yīng)用程序的docker化。通過創(chuàng)建一個(gè)DockerHub賬戶,可以將鏡像推送到該賬戶(或組織內(nèi)的私有存儲(chǔ)庫)。
結(jié)論
希望本Docker入門教程對(duì)你有所幫助。可以在Github代碼庫中找到本教程使用的代碼。下一步,請(qǐng)?jiān)谟?jì)算機(jī)上安裝Docker并嘗試這個(gè)示例。或者對(duì)你選擇的應(yīng)用程序進(jìn)行Docker化。
在計(jì)算機(jī)上安裝Docker的最簡單方法是使用Docker Desktop:可以同時(shí)獲得Docker CLI客戶端和GUI界面來輕松管理容器。因此,設(shè)置好Docker,就可以開始編碼了!
【GitHub代碼庫】:https://github.com/balapriyac/docker-data-science
【Docker Desktop】:https://www.docker.com/products/docker-desktop/






