如何使用Docker快速配置數據科學開發環境?

jopen 9年前發布 | 24K 次閱讀 Docker

 

Docker今年應該算是很熱門的技術了,之前一直沒怎么真正地去了解、接觸。通過翻譯這篇簡單的教程,我同時也對Dcoker有了入門的了 解。Docker和我目前使用的Vagrant有些類似之處,都是通過類似鏡像的文件創建孤立的系統環境。只是Docker容器中已經安裝了所需的包,而 我目前所了解的Vagrant box還沒有這個功能。當然,應該是我使用程度不深的原因。不管怎么說,Docker確實是跨平臺開發的利器。譯文如果有什么不準確的地方,請大家指正。

  • 原文鏈接:https://www.dataquest.io/blog/data-science-quickstart-with-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環境所必須的全部文件。

如何使用Docker快速配置數據科學開發環境?

容器

盡管虛擬機有諸多好處,例如能夠使在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用戶提供了一個簡便安裝過程的圖形界面安裝器。下面是每個操作系統的安裝指南。

在安裝時,你需要使用shell命令提示符(shell prompt)。shell命令提示符(shell prompt)也被稱為終端或命令行,是在你的機器上通過文本界面而非圖形界面運行命令的一種方式。例如,你可以在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替換為你的容器編碼)。

如何使用Docker快速配置數據科學開發環境?

創建一個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命令提示符(shell prompt)。 -it 選項確保我們在容器中打開了一個輸入會話,并且可以輸入命令。

在運行 docker exec 命令之后,你就會看到容器中的shell命令提示符(shell prompt)出現。容器此時正通過一個名為 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包和工具的鏡像。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!