1. 程式人生 > 其它 >【Python環境】如何使用 Docker 快速配置資料科學開發環境?

【Python環境】如何使用 Docker 快速配置資料科學開發環境?

資料科學開發環境配置起來讓人頭疼,會碰到包版本不一致、錯誤資訊不熟悉和編譯時間漫長等問題。這很容易讓人垂頭喪氣,也使得邁入資料科學的這第一步十分艱難。而且這也是一個完全不常見的准入門檻。

還好,過去幾年中出現了能夠通過搭建孤立的環境來解決這個問題的技術。本文中我們就要介紹的這種技術名叫Docker。Docker能讓開發者簡單、快速地搭建資料科學開發環境,並支援使用例如Jupyter notebooks等工具進行資料探索。

要使用Docker,我們要先下載含有相關包package和資料科學工具的映象檔案。之後,我們可以通過該映象,在數秒之內就啟動一個數據科學開發環境,免去了手動安裝包的麻煩。這個環境,也被成為Docker容器container

。容器解除了配置的問題——當你啟動一個Docker容器後,它就已經處於了良好的狀態,所有的包都是可以正常運轉的。

Docker的出現是為了幫助你

除了降低進入資料科學的門檻之外,Docker還可以讓我們快速搭建擁有不同Python版本和安裝了不同包的孤立環境,不像虛擬環境virtualenv那樣還要重新安裝包。

在本文中,我們將介紹Docker的基礎知識,如何安裝Docker以及如何利用Docker容器快速地在本地機器上搭建資料科學環境。

虛擬機器

能夠建立虛擬機器的軟體已經問世數十年,可以讓你在本地電腦上模擬其他的系統環境。舉個例子,即使你的電腦執行的是Windows作業系統,你仍可以通過虛擬機器執行Linux系統。這可以讓你在不重灌系統的前提下,使用Linux——也就是說,Linux系統是虛擬化執行的,所以你可以從Windows系統訪問虛擬機器。基本上,你可以在點選該軟體的程式圖示之後,看到彈出的視窗中乃是一個Linux系統桌面。而虛擬機器需要映象來啟動,也就是你必須先擁有一個目標系統的映象,才能啟動相應的虛擬機器。如果你想使用Linux,你使用的映象就得包含建立Linux環境所必須的全部檔案。

示例:在Mac上通過虛擬機器使用Windows

容器

儘管虛擬機器有諸多好處,例如能夠使在Windows平臺進行Linux開發成為現實,但是也有著自身的缺陷。首先,虛擬機器的啟動時間很長,要消耗大量的系統資源。另外,在利用映象建立完虛擬機器中,很難在安裝完所需要的包後,再將這個映象儲存,建立為新的映象。而Docker提供的Linux容器,則通過讓多個孤立環境在同一臺機器上執行,解決了這個問題。你可以把容器看作是一種更快、更簡單地使用虛擬機器的方法。

但是,容器的使用卻有一點麻煩,而且管理和釋出容器映象也不容易。作為開發人員,我們希望能夠快速下載並啟動一個擁有指定包和工具配置的資料科學環境。例如,你肯定會希望能快速啟動一個安裝了Jupyter notebook、spark和pandas的容器。

Docker

Docker容器的裡層包裹的是Linux容器(a layer over Linux containers),可以支援更簡單地對容器進行管理和釋出。使用Docker,可以很容易地下載具備相應包的映象,並且快速啟動。另外,Docker是跨平臺的,支援包括Mac、Windows和Linux等系統。

作為建立孤立Python環境的另一種方式,虛擬環境virtual environment也有這些優勢。但是Docker相較於虛擬環境的主要優勢有:

  • 能夠快速啟動。如果你想馬上就開始進行資料分析,使用Docker就免去了你等待各種包進行安裝的時間。
  • 配置測試無誤。很多時候,要正常安裝Python包會,需要以安裝某些系統包為前提,並只有在進行相應設定後才能正常使用。如果設定不當,會引起一些很奇怪的錯誤。但是使用Docker後,這些包就已經配置好了,可以立即使用。
  • 跨平臺一致性。Python中的包是可以跨平臺使用的,但是在Windows和Linux平臺下有些不同,而且還有部分依賴包無法在Windows中安裝。但是由於Docker容器執行的都是Linux環境,所以它們是高度一致的。
  • 能夠設定checkpoint並且進行恢復。你可以往Docker映象中安裝包,然後將那個checkpoint下的環境建立成一個新的映象。這讓你能夠快速撤銷或者回滾配置。

執行一個Docker映象,就相當於建立了一個Docker容器。在本文中,我們在容器中執行一個Jupyter notebook,然後通過瀏覽器介面來處理資料。

安裝Docker

第一步就是安裝Docker。Docker官方為Windows和Mac使用者提供了一個簡便安裝過程的圖形介面安裝器。下面是每個作業系統的安裝指南。

  • Mac OS
  • Linux
  • Windows

在安裝時,你需要使用shell命令提示符shell prompt。shell命令提示符也被稱為終端或命令列,是在你的機器上通過文字介面而非圖形介面執行命令的一種方式。例如,你可以在Windows系統中雙擊記事本就可以開啟一個文字編輯器,也可以在Linux終端中輸入nano達到這個目的。Docker提供了一個預先配置好的shell,可以用來執行Docker命令。請按照下面的方法操作:

  • Mac OS —— 從Launchpad中開啟Docker Quickstart Terminal程式。詳情見本篇文章。
  • Linux —— 開啟任意bash終端,就可以使用docker命令。
  • Windows —— 雙擊桌面上的Docker QuickstartTerminal程式的圖示。詳情見本篇文章。

下文在提到需要執行Docker命令或輸入某個命令時,你都需要使用這個shell命令提示符。

下載映象

下一步是下載你需要的映象。下面是我們網站(dataquestio)目前提供的資料科學開發專用映象:

  • dataquestio/python3-starter —— 這個映象已經安裝好了Python 3, Jupyter notebook和許多其他流行的資料科學庫,包括numpy,pandas,scipy,scikit-learn和nltk。
  • dataquestio/python2-starter —— 這個映象已經安裝好了Python 2, Jupyter notebook和許多其他流行的資料科學庫,包括numpy,pandas,scipy,scikit-learn和nltk。

你可以通過輸入docker pull IMAGE_NAME命令,下載相應的映象。如果你想下載dataquestio/python3-starter這個映象,那麼你需要在終端輸入docker pull dataquestio/python3-starter命令。輸入這段命令後,程式會自動從Docker Hub下載映象。Docker Hub與Github類似,不過卻是Docker映象的一箇中樞。它會將相應的映象檔案下載至你的本地機器,這樣你才能利用該映象建立容器。

新建一個資料夾

在本地建立一個資料夾,用於存放notebooks。這個資料夾中將儲存你所有的工作檔案,並會持續存在於你的機器中,即使是你銷燬了docker容器。在這裡,我們將建立下面這個資料夾,/home/vik/notebooks

執行映象

映象下載完成後,你可以通過docker run執行該映象。我們還需要傳入一些選項,確保映象配置正確。

  • -p 選項用於設定虛擬機器的埠,讓我們可以在本地訪問Jupyter notebook伺服器。
  • -d 選項用於以detached模式執行容器,也就是作為背景程序執行。
  • -v 選項讓我們指定在本地機器中使用哪個資料夾儲存notebook。

完整的執行命令是類似這樣的:

docker run -d -p 8888:8888 -v /home/vik/notebooks:/home/ds/notebooks dataquestio/python3-starter

你應該將/home/vik/notebooks更改為你用於儲存檔案的地址。另外,應該把dataquestio/python3-starter更改為自己喜歡的docker映象。

執行docker run命令將會建立一個Docker容器。這是與你的本地機器相隔絕的,也可以把它看作是一臺單獨的電腦。在容器內部,會執行一個Jupyter notebook伺服器,並可以讓我們使用許多資料科學工具包。

另外,docker run命令也會在終端打印出容器的編碼container id,在通過其他docker容器對該容器進行修改時,就必須要使用這個編碼。在下文中我們稱該編碼為容器編碼。

檢視notebook伺服器

如果你的系統是Linux,那麼下一步非常簡單——只需要在瀏覽器中開啟localhost:8888,之後應該就能看到執行中的notebook。如果你使用的是Windows或OSX,之前也按照Docker官方安裝指南進行了操作,並且安裝過程中使用了docker-machine,那麼本地機器的名稱是default,執行docker-machine ip default命令就可以得知docker容器的ip。如果使用了其他的名字,例如dev,那在命令中將default替換為dev即可。接下來,在瀏覽器中訪問CONTAINER_IP:8888就可以看到notebook(將CONTAINER_IP替換為你的容器編碼)。

下面就是你應該看到的樣子

建立一個notebook

到了這一步,你可以建立一個新的Jupyter notebook測試下這個孤立的開發環境。試試輸入下面這個scikit-learn的例子:

from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn import linear_model
import matplotlib.pyplot as plt
%matplotlib inline

lr = linear_model.LinearRegression()
boston = datasets.load_boston()
y = boston.target

predicted = cross_val_predict(lr, boston.data, y, cv=10)

fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show()

新增資料檔案

如果你想往開發環境中新增資料檔案,你有三個選擇。第一個選擇,就是將檔案放在你之前建立用來存放notebook的資料夾中。你放那裡的任何檔案將可以自動通過Jupyter notebook中訪問。

第二種選擇就是使用docker cp命令。docker cp可以從本地機器複製檔案至容器中,反之亦然。假設你想拷貝/hom/vik/data.csv檔案至一個id為4greg24134的容器中,你可以輸入下面的命令:

docker cp /home/vik/data.csv 4greg24134:/home/ds/notebooks

這會將data.csv檔案拷貝到容器中用於存放notebook的資料夾中。當然,你可以選擇將檔案放到容器中的任何地方,但是把它們放在存放notebook的資料夾忠厚,你就可以輕鬆地通過Jupyter notebook訪問這些檔案了。

第三個選擇就是使用Jupyter notebook首頁右上方的upload按鈕。這可以讓你選擇一個檔案,並上傳到容器中用於存放notebook的資料夾中。

不管你使用哪種方法,要想在Jupyter notebook中載入檔案,需要按照類似下面的方式進行:

import pandas
data = pandas.read_csv("data.csv")

複製容器中的資料檔案

你可能會需要從容器中拷貝檔案至本地機器。最容易的辦法就是把檔案放置在/home/ds/notebooks資料夾中,這樣的話這些檔案就會自動映像到本地機器。

另一種方法也就是利用docker cp命令。假設你想從id為4greg24314的容器中,把/home/ds/notebooks/data.csv檔案拷貝至本地機器的/home/vik/資料夾中,你可以輸入下面的命令:

cp 4greg24134:/home/ds/notebooks/data.csv /home/vik/data.csv

最後一種方法就是使用Jupyter介面中的download選項。在網頁模式下點選一個不是notebook的檔案,將會將其下載至本地。如果你已經打開了一個notebook,那麼可以先點選File,然後選中download as就可以下載至本地。

安裝更多的工具包

如果你想在容器中安裝更多的工具包,你可以通過正常的bash命令列命令就可以實現。要想在容器中執行這些命令,你需要執行docker exec命令。這個命令接受容器的id作為引數,以及一個期望執行的命令。例如輸入docker exec -it 4greg24134 /bin/bash將會在編碼為4greg24134的容器中開啟一個shell命令提示符。-it選項確保我們在容器中打開了一個輸入會話,並且可以輸入命令。

在執行docker exec命令之後,你就會看到容器中的shell命令提示符出現。容器此時正通過一個名為ds的虛擬環境執行Python程式,這個虛擬環境已經是處於啟用狀態的。

接下來,只需要輸入pip install PACKAGE_NAME就可以安裝其他的工具包。例如,你可以使用pip install requests來安裝requests。

當你希望退出容器的shell終端時,只需要輸入exit即可。

關閉docker容器

在完成資料處理工作之後,你就可以通過docker rm -f CONTAINER_ID來停止docker容器。你應該輸入之前獲得的容器編碼。如果你忘了,你可以執行docker ps檢視。容器停止執行之後,notebooks會繼續存放在你本地用於存放的資料夾中。

更進一步

Docker映象是通過Dockerfile建立的。Dockerfile指定了映象中應該安裝的包和工具。通過修改Dockerfile,你就可以改變映象預設按照的包和工具。

如果你想在本文中所使用的映象基礎上做一定修改,可以向我們的Github倉庫提交PR,這個倉庫中包含了映象的Dockerfile。我們歡迎大家參與改善當前的映象,或是新增其他安裝了非Python包和工具的映象。

來源:程式設計派原文:https://www.dataquest.io/blog/data-science-quickstart-with-docker/作者: Vik Paruchuri 譯文:http://www.codingpy.com/article/data-science-quickstart-with-docker/