動手實(shí)踐:使用Docker設(shè)置數(shù)據(jù)科學(xué)環(huán)境
每當(dāng)您開始一個(gè)新的數(shù)據(jù)項(xiàng)目或有一個(gè)很好的數(shù)據(jù)處理想法時(shí),可能都需要初步的概念證明來啟動。 您當(dāng)然不想要,并且可能甚至沒有時(shí)間花時(shí)間來建立全新的數(shù)據(jù)環(huán)境,而無需了解數(shù)據(jù)本身。 在下一篇文章中,您將學(xué)習(xí)Docker如何在不浪費(fèi)時(shí)間一遍又一遍的情況下幫助您設(shè)置可復(fù)制的數(shù)據(jù)環(huán)境。

什么是Docker?為什么要嘗試一下?
Docker是在指定環(huán)境(稱為容器)中創(chuàng)建,部署和運(yùn)行所需應(yīng)用程序的最簡單,最靈活的方法之一。 當(dāng)然,你問自己什么是容器?
非技術(shù)性的解釋:就像上圖所示,在我們的情況下,您的本地機(jī)器是一個(gè)已經(jīng)在生產(chǎn)東西的島。 為了改善這一點(diǎn),您需要其他工具,這些工具(就像Docker徽標(biāo)一樣)裝在小容器中。 一旦設(shè)置好并運(yùn)行它們,它們就可以使用了。
技術(shù)說明:容器是打包代碼及其所有依賴項(xiàng)的軟件的標(biāo)準(zhǔn)單元,因此應(yīng)用程序可以從一個(gè)計(jì)算環(huán)境快速運(yùn)行到另一個(gè)計(jì)算環(huán)境。 Docker容器映像是一個(gè)輕量級的,獨(dú)立的,可執(zhí)行的軟件軟件包,其中包含運(yùn)行應(yīng)用程序所需的一切:代碼,運(yùn)行時(shí),系統(tǒng)工具,系統(tǒng)庫和設(shè)置。 其他重要術(shù)語:
- 圖片:只是容器的快照。
- Dockerfile:這是一個(gè)Yaml文件,用于構(gòu)建您的映像。 在本課程的最后,您將擁有一個(gè)yaml文件模板,并將其用于您自己的容器規(guī)范。
- DockerHub:在這里您可以推拉Docker映像并將其用于您自己的需求。 基本上,GitHub僅用于Docker。
為什么要使用Docker?

讓我向您概述我喜歡使用Docker的主要原因:
- 對于您作為數(shù)據(jù)科學(xué)家或數(shù)據(jù)分析師而言,泊塢窗意味著您可以專注于探索,轉(zhuǎn)換和建模數(shù)據(jù),而無需首先考慮您的數(shù)據(jù)環(huán)境所運(yùn)行的系統(tǒng)。 通過使用準(zhǔn)備在Docker容器中運(yùn)行的數(shù)千種應(yīng)用程序之一,您不必?fù)?dān)心分別安裝和連接它們。 Docker允許您在需要時(shí)在幾秒鐘內(nèi)部署所選的工作環(huán)境。
- 假設(shè)您不是項(xiàng)目中唯一的工作人員,但是您的團(tuán)隊(duì)成員也需要掌握代碼。 現(xiàn)在,一個(gè)選擇是,每個(gè)隊(duì)友都可以在具有不同體系結(jié)構(gòu),不同庫和不同版本應(yīng)用程序的環(huán)境中運(yùn)行代碼。 docker選項(xiàng)是每個(gè)成員都可以訪問相同的容器映像,并使用docker啟動該映像并準(zhǔn)備就緒。 Docker為團(tuán)隊(duì)中的每個(gè)人提供了可重復(fù)的數(shù)據(jù)環(huán)境,因此您可以立即開始進(jìn)行協(xié)作。
Docker當(dāng)然還有其他幾個(gè)好處,特別是如果您使用的是Enterprise版本。 絕對值得探索,不僅會使您作為數(shù)據(jù)科學(xué)家受益。
安裝和運(yùn)行Docker
您可以立即安裝Docker桌面,這是您入門所需的內(nèi)容:在此處訪問Docker Hub,為Mac或Windows選擇Docker版本并進(jìn)行安裝。 在您的本地機(jī)器上啟動Docker之后,您就可以在頂部導(dǎo)航欄上看到這只可愛的小鯨魚-做得很好。

通過單擊Docker徽標(biāo),您可以查看Docker是否正在運(yùn)行。 另一種選擇是打開命令行并輸入" docker info",以便您看到正在運(yùn)行的內(nèi)容。 以下是一些基本的Docker命令:
- docker login#登錄Docker注冊表
- docker run#創(chuàng)建一個(gè)新容器并啟動
- docker start #啟動一個(gè)現(xiàn)有的容器
- docker stop
#停止一個(gè)正在運(yùn)行的容器 - docker ps [-a] #顯示所有容器
- docker rm
#按名稱或ID刪除容器 - docker rmi $(docker images -q)#刪除所有鏡像
您可以從一個(gè)簡單的示例開始,嘗試使用Jupyter筆記本。 您要做的就是在Docker Hub中查找映像,打開終端并運(yùn)行docker。 在下面的示例中,您可以找到在localhost:8888上運(yùn)行的Jupyter —簡單!
docker run -p 8888:8888 jupyter/scipy-notebook:2c80cf3537ca

雖然我們現(xiàn)在可以在容器中試用我們的應(yīng)用程序,但它并不是高級數(shù)據(jù)科學(xué)家正在尋找的完整數(shù)據(jù)環(huán)境。 您可能想要使用更高級的工具,例如Nifi進(jìn)行數(shù)據(jù)攝取和處理,Kafka進(jìn)行數(shù)據(jù)流傳輸,以及使用SQL或NonSQL數(shù)據(jù)庫在兩者之間存儲一些表。 我們還能使用Docker嗎? 答案:是的,當(dāng)然可以-Docker在這里為您管理所有工作。
Docker Compose:將它們組合在一起

要設(shè)置所需的數(shù)據(jù)環(huán)境,您可能希望在我們的本地計(jì)算機(jī)上運(yùn)行多個(gè)容器。 這就是為什么我們使用Docker Compose。 Compose是用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具。 雖然單獨(dú)連接每個(gè)容器可能很耗時(shí),但docker compose允許多個(gè)容器的集合以非常直接的方式通過其自己的網(wǎng)絡(luò)進(jìn)行交互。 使用compose時(shí),您首先使用yaml文件配置應(yīng)用程序的服務(wù),然后使用單個(gè)命令(docker compose up)來創(chuàng)建并啟動先前定義的所有服務(wù)。*
在下面的內(nèi)容中,您可以找到入門的主要步驟:
- 使用Dockerfile定義您的應(yīng)用環(huán)境,以便輕松復(fù)制
- 在docker-compose.yml中指定構(gòu)成數(shù)據(jù)環(huán)境的所有服務(wù)
- 在保存yaml文件的文件夾中打開終端,然后運(yùn)行docker-compose up
docker-compose.yml可能類似于以下內(nèi)容。 并且盡管您可以肯定使用以下內(nèi)容作為模板,但絕對應(yīng)該為自己配置一次:
- version: '3'
- services:
- zookeeper:
- hostname: zookeeper
- container_name: zookeeper_dataenv
- image: 'bitnami/zookeeper:latest'
- environment:
- - ALLOW_ANONYMOUS_LOGIN=yes
- nifi:
- image: mkobit/nifi
- container_name: nifi_dataenv
- ports:
- - 8080:8080
- - 8081:8081
- environment:
- - NIFI_WEB_HTTP_PORT=8080
- - NIFI_ZK_CONNECT_STRING=zookeeper:2181
- minimal-jupyter-notebook:
- image: jupyter/minimal-notebook:latest
- ports:
- - 8888:8888
- mongodb:
- image: mongo:latest
- container_name: mongodb_dataenv
- environment:
- - MONGO_DATA_DIR=/data/db
- - MONGO_LOG_DIR=/dev/null
- ports:
- - 27017:27017
- grafana:
- image: bitnami/grafana:latest
- container_name: grafana_dataenv
- ports:
- - 3000:3000
- db:
- image: 'postgres:9.6.3-alpine'
- container_name: psql_dataenv
- ports:
- - 5432:5432
- environment:
- POSTGRES_DB: psql_data_environment
- POSTGRES_USER: psql_user
- POSTGRES_PASSWORD: psql
- PGDATA: /opt/psql_data
- restart: "no"
而已! 您剛剛了解了如何在幾秒鐘內(nèi)隨時(shí)隨地部署自己的數(shù)據(jù)環(huán)境的基礎(chǔ)知識,這意味著浪費(fèi)更少的時(shí)間進(jìn)行設(shè)置,而將更多的時(shí)間用于生產(chǎn)。
請注意,還有許多其他容器軟件選項(xiàng)。 我只是喜歡與Docker合作,并想與您分享我的經(jīng)驗(yàn)