Jupyter Docker Stacks 提供預先建置的環境,簡化資料科學專案的啟動流程。Stacks 內建不同層級的映象,從基礎的 base-notebook 到包含科學計算套件的 scipy-notebook,滿足不同需求。透過 docker execjupyter notebook list 指令,可以取得伺服器的安全令牌,確保環境的安全性。理解 Stacks 的映象繼承關係,例如 base-notebook 作為基礎,scipy-notebook 等映象在其上擴充套件功能,有助於選擇合適的起始環境。base-notebook 使用 Miniconda 管理 Python 環境,並透過 jovyan 使用者提供非特權操作,提升安全性。

第7章 - 固執己見的Jupyter Stacks

取得Jupyter Notebook的安全令牌

在前面的章節中,我們已經學習瞭如何執行Docker容器並對映其埠。在本章中,我們將探討Jupyter Docker Stacks的細節。首先,讓我們看看如何取得正在執行的Jupyter Notebook伺服器的安全令牌。

程式碼 7-3. 取得Jupyter Notebook的安全令牌

$ docker exec 72da jupyter notebook list
Currently running servers:
http://localhost:8888/?token=61d6ead40b05daea402d9843ad7932bc937da41841575765 :: /home/jovyan

內容解密:

此命令使用docker exec來在指定的容器(在本例中為ID字首為72da的容器)中執行jupyter notebook list命令。這樣可以列出正在執行的Jupyter Notebook伺服器,並顯示其URL和安全令牌。安全令牌是隨機生成的,用於保護對Notebook伺服器的存取。

Jupyter Docker Stacks的高層概述

Jupyter Docker Stacks提供了一系列的Notebook映象,這些映象之間存在依賴關係。最基礎的映象是base-notebook,其他所有映象都根據它構建。

  1. base-notebook
  2. minimal-notebook
  3. scipy-notebook
  4. r-notebook
  5. tensorflow-notebook
  6. datascience-notebook
  7. pyspark-notebook
  8. all-spark-notebook

每個映象在GitHub的jupyter/docker-stacks專案中都有對應的資料夾,並且在Docker Hub上也有相應的倉函式庫。

Jupyter Docker Stack依賴關係圖

  graph TD;
    A[base-notebook] --> B[minimal-notebook];
    A --> C[scipy-notebook];
    A --> D[r-notebook];
    C --> E[tensorflow-notebook];
    C --> F[datascience-notebook];
    F --> G[pyspark-notebook];
    F --> H[all-spark-notebook];

圖表翻譯:

此圖表展示了Jupyter Docker Stacks中不同映象之間的依賴關係。base-notebook是基礎,所有其他映象都直接或間接地依賴於它。其他映象是為特定用途(如科學計算、資料科學等)增加了額外的包和工具。

jupyter/base-notebook映象

jupyter/base-notebook映象是定義了一個最小化的Jupyter Notebook伺服器。它僅包含Miniconda for Python 3,不包含Python 2或任何科學計算包。它定義了整個Stack中Jupyter映象的基本模式,包括使用tini作為初始化二進位制檔案,新增非特權使用者jovyan,以及包含各種啟動指令碼。

程式碼 7-7. base-notebook Dockerfile片段

ENV NB_USER jovyan
...
WORKDIR /home/$NB_USER/work

內容解密:

這段Dockerfile程式碼設定了環境變數NB_USERjovyan,並將工作目錄設定為/home/jovyan/work。這意味著當容器啟動時,預設的工作目錄是/home/jovyan/work

Notebook安全

由於Notebook伺服器可以執行任意程式碼,因此限制對它的存取是非常重要的。Jupyter Docker Stacks定義了一系列安全最佳實踐,主要在base-notebook映象的Dockerfile中定義。

預設情況下,執行在容器中的Notebook伺服器需要一個隨機生成的安全令牌作為查詢引數傳遞。這個令牌可以透過向執行中的容器傳送jupyter notebook list命令來獲得。

程式碼 7-8. 執行Notebook伺服器並授予jovyan使用者無密碼sudo許可權

$ docker run -d -e GRANT_SUDO=yes --user root jupyter/scipy-notebook
a811689f2e09737e2c9686849320a424889b2ac9eeb57e0f3df2940edc600628

內容解密:

此命令啟動了一個新的容器,並設定了環境變數GRANT_SUDO=yes,同時指定了容器以root使用者身份執行。這樣,容器內的jovyan使用者就被授予了無密碼的sudo許可權。這對於需要在容器中安裝額外軟體包或進行其他需要高階許可權的操作時非常有用。

預設環境

base-notebook Dockerfile安裝了Miniconda3和最新穩定的Python 3版本。它還定義了預設的conda環境,即root環境,用於管理Python 3的安裝。

程式碼 7-12. 識別Python 3 conda環境

$ docker run -it --rm jupyter/base-notebook bash
jovyan@c9fb2312c5b8:~$ conda info -a
Current conda install:
platform : linux-64
conda version : 4.2.12
conda is private : False
conda-env version : 4.2.12
conda-build version : not installed
python version : 3.5.2.final.0
...
# conda environments:
root * /opt/conda

內容解密:

這段程式碼展示瞭如何進入一個根據base-notebook映象的容器,並檢視conda的安裝資訊和當前環境。可以看到,預設的Python版本是3.5.2,並且只有一個名為root的環境,它位於/opt/conda目錄下。

綜上所述,本章詳細介紹了Jupyter Docker Stacks的基本組成和安全機制。透過使用這些預構建的映象,使用者可以快速佈署具有不同功能的Jupyter Notebook環境。同時,透過理解這些映象的內部工作原理和安全最佳實踐,使用者可以更好地定製和保護自己的Notebook環境。

使用Docker擴充套件Jupyter Stacks進行Python環境管理

概述

本章節將介紹如何使用Docker擴充套件Jupyter Stacks,以滿足特定的Python環境需求。我們將探討使用Dockerfile自定義Jupyter映像,並使用conda環境管理不同的Python版本。

管理Python版本

隨著IPython 6的發布和對Python 2的支援終止,顯式管理Docker映像中的環境已不再必要。Docker的優勢在於能夠隔離不同實作的依賴關係,使其成為管理多個Python版本的理想工具。

切換環境

在執行中的Notebook或建立新Notebook時,切換環境是一項簡單的任務。我們將探討如何使用conda環境來安裝新函式庫,並在不同的Python核心之間進行切換。

使用Dockerfile擴充套件Jupyter映像

大多數情況下,我們會從Jupyter Docker Stacks中取得一個映像,並根據需要新增特定的函式庫。以下是一個示例Dockerfile,用於擴充套件jupyter/scipy-notebook映像以進行語義分析:

FROM jupyter/scipy-notebook
RUN pip install pymongo

編譯與執行

# 編譯映像
$ docker build -t semantic_analysis .

# 執行容器
$ docker run -d -P semantic_analysis

# 檢視容器埠對映
$ docker port <container_id>

# 檢視Jupyter Notebook列表
$ docker exec <container_id> jupyter notebook list

使用conda環境擴充套件Jupyter映像

Jupyter Docker Stacks使用conda環境來管理不同的Python版本。以下是一個示例,展示如何為jupyter/scipy-notebook映像中的多個conda環境安裝pymongo函式庫:

FROM jupyter/scipy-notebook
USER root

# 為Python 3環境安裝pymongo
RUN conda install --name root --yes pymongo

# 為Python 2環境安裝pymongo
RUN conda install --name python2 --yes pymongo

USER jovyan

詳細說明:

  1. 切換至root使用者:為了安裝函式庫,需要切換至root使用者。
  2. 安裝pymongo:使用conda install命令為不同的conda環境安裝pymongo函式庫。
    • --name root 指定了Python 3環境。
    • --name python2 指定了Python 2環境。
    • --yes 自動確認安裝。
  3. 切換回jovyan使用者:安裝完成後,切換回jovyan使用者,以避免使用過高的系統許可權執行Notebook伺服器。

使用pip安裝函式庫

某些Python函式庫可能僅透過pip可用。以下是一個示例,展示如何為多個conda環境使用pip安裝twitter函式庫:

FROM jupyter/scipy-notebook
USER root

# 使用conda安裝pymongo
RUN conda install --yes --name root pymongo
RUN conda install --yes --name python2 pymongo

# 使用pip安裝twitter函式庫
RUN ["bash", "-c", "source activate root && pip install twitter"]
RUN ["bash", "-c", "source activate python2 && pip install twitter"]

USER jovyan

詳細說明:

  1. 啟用環境並安裝:使用source activate命令啟用不同的conda環境,並使用pip安裝所需的函式庫。
  2. bash指令:使用bash -c執行多條命令,以確保在正確的環境中安裝函式庫。

隨著Python生態系統的不斷發展,未來可能會出現更多針對特定任務的Jupyter映像和函式庫。同時,Docker和conda的結合使用將繼續為Python環境管理提供強大的支援。

參考資源

透過遵循本章節的,您可以根據自己的需求擴充套件Jupyter Stacks,並有效地管理不同的Python環境。

第7章:固執己見的Jupyter Stacks

使用Dockerfile安裝函式庫

在清單7-22中,您使用了Dockerfile RUN語法的變體。之前您使用RUN指令的語法為RUN <command>,這被稱為RUN指令的shell形式。使用這種形式的命令會將命令透過/bin/sh或預設shell傳送到映像檔。

使用exec形式安裝函式庫

透過pip安裝不會使用這種語法起作用,因為要安裝到正確的conda環境中,您需要使用source命令啟動適當的環境。source命令在預設shell(/bin/sh)中不可用,但在bash中可用。要使用bash,您必須使用RUN指令的另一種語法,即exec形式。exec形式使用語法RUN ["executable", "param1", "param2"]。您使用RUN ["bash", "-c", "source activate <environment> && pip install twitter "],這會在映像檔中開啟一個bash shell並:

  1. 啟動適當的環境
  2. 透過pip安裝twitter
# 使用exec形式安裝twitter函式庫
RUN ["bash", "-c", "source activate python2 && pip install twitter"]

內容解密:

此段Dockerfile指令使用exec形式執行多個命令。首先,它啟動指定的conda環境(在此例中為python2),然後在該環境中使用pip安裝twitter函式庫。這種方法確保了函式庫被安裝在正確的Python環境中。

對執行中的容器進行暫時性變更

在開發過程中,您可能會遇到需要臨時安裝函式庫的情況。雖然最佳實踐是透過Dockerfile進行變更,但有時您需要在執行中的容器中進行臨時安裝。

使用ipython魔術命令安裝函式庫

您可以使用ipython的魔術命令!(bang)從筆記本中執行shell命令,臨時安裝函式庫。以下是一些範例:

# 使用conda安裝pymongo
!conda install pymongo --yes

# 使用pip安裝twitter
!pip install twitter

# 使用apt安裝系統函式庫(需要無密碼sudo許可權)
!apt update && apt install -y libssl-dev

內容解密:

這些命令分別使用conda、pip和apt來安裝不同的函式庫。!符號是ipython魔術命令的簡寫,允許您直接在Jupyter筆記本中執行shell命令。這些變更只會在目前的容器執行期間有效,一旦容器被刪除,變更就會丟失。

驗證函式庫安裝

安裝函式庫後,您可以透過開啟容器的shell來驗證是否安裝成功:

$ docker exec -it kickass_engelbart bash
jovyan@67cf8215ed6a:~$ conda list --name root | grep pymongo
pymongo               3.2.2            py35_0    conda-forge
jovyan@67cf8215ed6a:~$ conda list --name python2 | grep twitter
twitter               1.17.1                   <pip>

內容解密:

這些命令展示瞭如何進入正在執行的容器並檢查特定環境中是否已安裝所需的函式庫。第一個命令檢查root環境中的pymongo,第二個命令檢查python2環境中的twitter

將變更儲存到映像檔

雖然不建議將執行中的容器變更作為永久解決方案,但您可以臨時將變更儲存到新的映像檔:

$ docker commit kickass_engelbart jupyter/scipy-notebook:twitter-mongo
$ docker images
REPOSITORY              TAG           IMAGE ID       CREATED         SIZE
jupyter/scipy-notebook  twitter-mongo dfbb7599770d 4 seconds ago  5.37GB
jupyter/scipy-notebook  latest        3dc12029099d 24 hours ago   5.35GB

$ docker run -d -v `pwd`:/home/jovyan -p 8888:8888 jupyter/scipy-notebook:twitter-mongo

內容解密:

這些命令展示瞭如何將對執行中的容器的變更提交到新的Docker映像檔,並使用該映像檔啟動新的容器。這樣,您可以在新的容器中保留之前安裝的函式庫。

本章重點:
  1. Dockerfile語法:瞭解如何使用Dockerfile安裝函式庫,包括shell形式和exec形式的RUN指令。
  2. 臨時安裝函式庫:學習如何在執行中的容器中使用ipython魔術命令臨時安裝函式庫。
  3. 驗證安裝:瞭解如何驗證函式庫是否已正確安裝在指定的環境中。
  4. 儲存變更:學習如何將對容器的變更儲存到新的Docker映像檔。

透過本章的學習,您應該能夠靈活地使用Jupyter Docker映像檔,並根據專案需求進行適當的擴充套件和組態。