Docker - 设置 Jupyter
Jupyter Notebook 是一个开源的 Web 应用程序,它可以创建包含实时代码、方程、可视化内容和叙述性文本的文档,所有这些都集中在一个地方。
由于其简单且交互式的编码方式,Jupyter Notebook 在数据科学、机器学习和科学计算方面也非常有用。然而,管理 Jupyter 环境及其依赖关系是一个挑战;这通常在协作或部署项目时成为问题。
Docker 通过容器化 Jupyter Notebook 来提供帮助;这样,环境就可以重复使用,依赖管理变得更容易,notebook 也变得可移植。在 Docker 中运行 Jupyter 意味着您可以将环境完全打包,以便更容易分发、复制和扩展您的 Jupyter 设置。
Dockerize Jupyter Notebook 的先决条件
在开始 Jupyter 的 Dockerization 过程之前,请确保您具备以下先决条件 −
- 已安装 Docker − 您的机器上需要安装 Docker。如果尚未安装 Docker,您可以从 Docker 官方网站下载。
- 基本的 Docker 知识 − 了解 Docker 的基本概念(如 Images、Containers 和基本 Docker 命令)将很有帮助。
- 已安装 Jupyter Notebook − 这将有助于理解在 Docker 中运行它的对比。
- 代码编辑器 − 任何代码编辑器。例如,VSCode、Atom 或您选择的任何其他编辑器,用于创建和编辑配置文件。
- CLI 访问权限 − 命令行或终端的基本使用;您将运行命令来安装 Docker 并管理您的 Jupyter container。
这些先决条件满足了顺利完成本章关于 Dockerize Jupyter 的要求。
设置 Jupyter 项目
让我们设置一个基本的 Jupyter 项目。我们可以创建一个项目目录,包含所有必要的文件,包括配置文件和脚本。
创建项目目录
使用以下命令创建项目目录 −
$ mkdir dockerized-jupyter $ cd dockerized-jupyter
初始化项目
初始化一个版本控制系统如 Git 来帮助您跟踪项目变更。同时,您也可以初始化 Docker −
$ git init $ docker init
创建 Jupyter Notebook 文件
创建一个示例 Jupyter Notebook 文件,用于测试您的设置。
$ touch sample_notebook.ipynb

项目结构和依赖项
现在我们已经有了项目目录,包括 Jupyter 设置所需的结构大纲和依赖项,保持这个项目结构将带来回报——尤其当项目规模变大时。
项目结构
你的项目目录应该类似于这样 −
dockerized-jupyter/ Dockerfile # 用于构建 Jupyter image 的 Dockerfile requirements.txt # Python 依赖项 sample_notebook.ipynb # 示例 Jupyter notebook README.md # 可选:项目文档
依赖项
这个项目的核心依赖项本质上是一个 Jupyter Notebook,加上你在 notebook 中可能想要使用的其他 Python 库。为了处理此类依赖项,你将使用一个 "requirements.txt" 文件,列出所有必须安装到 Docker container 中的 Python 包。
创建 requirements.txt 文件
这个文件应该列出 Jupyter 以及你在使用 notebook 时想要包含的任何其他 Python 包。
requirements.txt 的示例内容 −
jupyter numpy pandas matplotlib
Dockerfile 配置
你的 Dockerfile 将使用这个 requirements.txt 在创建 Docker image 时安装必要的包。我们将在下一节看到 Dockerfile 的详细信息。
项目结构已定义并设置好依赖项后,你现在可以继续在本地运行 Jupyter 并为你的环境设置 Dockerfile 以进行容器化。
在本地运行 Jupyter
在 Docker 化之前,先在本地运行 Jupyter 应用,以查看其是否正常运行。这样你能更好地理解设置,并在最终容器化之前确保你的 Jupyter 环境按预期工作。
步骤 1: 在本地设置 Jupyter
如果你在本地机器上没有安装 Jupyter Notebook,可以使用 pip 轻松安装它。进入你的项目目录,然后执行以下命令 −
pip3 install jupyter
这将安装 Jupyter Notebook 及其依赖项。
步骤 2: 执行 Jupyter Notebook
安装完成后,你可以通过运行以下命令启动 Jupyter Notebook server −
$ jupyter notebook
这将启动 Jupyter server,并在你的默认 web 浏览器中打开 Jupyter Notebook 界面。默认情况下,它将列出当前目录中的所有文件,包括你上面创建的 sample_notebook.ipynb。
步骤 3: 打开和编辑 Notebook
在 Jupyter 界面中点击打开 sample_notebook.ipynb 文件;你可以向这个 notebook 添加一些简单的 Python 代码或笔记来测试你的设置。一个示例 Python 脚本,它导入了一些常用库,包括 numpy 和 pandas,并执行基本计算 −
import numpy as np
import pandas as pd
# 示例:创建一个简单的 DataFrame
data = {'Column1': [1, 2, 3, 4], 'Column2': [10, 20, 30, 40]}
df = pd.DataFrame(data)
print(df)
运行代码单元格以确保一切正常运行。
步骤 4: 验证环境
确保 −
- Jupyter Notebook server 无错误启动。
- 你可以无问题地打开和编辑 notebook。
- 必要的 Python 包(例如 numpy、pandas、matplotlib)正常工作。
创建 Dockerfile
以下是将 Jupyter 容器化的 Dockerfile −
# 使用来自 Docker Hub 的官方 Python 镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 将 requirements.txt 复制到工作目录 COPY requirements.txt . # 安装 Python 依赖 RUN pip install --no-cache-dir -r requirements.txt # 暴露默认的 Jupyter 端口 EXPOSE 8888 # 启动 Jupyter Notebook CMD ["jupyter", "notebook", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]
步骤说明
- 基础镜像 − 使用 python:3.9-slim 提供轻量级的 Python 环境。
- 工作目录 − 将 /app 设置为容器内的默认工作目录。
- 复制依赖 − 将 requirements.txt 复制到容器中。
- 安装依赖 − 安装 Jupyter 和 requirements.txt 中列出的其他 Python 包。
- 暴露端口 − 打开端口 8888 以访问 Jupyter Notebook。
- 命令 − 运行 Jupyter Notebook,设置允许来自任何 IP 的访问,使用端口 8888,并允许 root 访问。
构建 Jupyter 镜像
让我们为 Jupyter 设置构建 Docker 镜像。这个镜像将打包运行 Jupyter Notebook 所需的一切,便于部署和分享。
构建镜像的步骤
1. 打开终端 − 进入包含 Dockerfile 的项目目录。
2. 构建 Docker 镜像 − 运行以下命令构建 Docker 镜像。将 jupyter-image 替换为您想要的镜像名称。
$ docker build -t jupyter-image .
-t jupyter-image − 为镜像打上 jupyter-image 标签。
.: 指定当前目录作为构建上下文。
3. 验证镜像 − 构建完成后,验证您的镜像是否列在 Docker 镜像列表中 −
$ docker images
在列表中查找 jupyter-image,以确认它已成功构建。
运行 Jupyter Docker 容器
有了 Docker 镜像后,下一步是将它作为容器运行。这将在 Docker 容器内启动 Jupyter Notebook,并使其可从主机访问。
要在终端中启动包含 Jupyter 的容器,请运行以下命令。为了从浏览器访问 Jupyter,它将容器的端口 8888 映射到主机的端口 8888。
$ docker run -p 8888:8888 jupyter-image
容器启动并运行后,您应该会在终端中看到类似 http://127.0.0.1:8888/tree?token=some_token 的 URL。您可以在网页浏览器中打开此 URL 来启动 Jupyter Notebook。
结论
在本章中,我们介绍了如何通过设置项目、定义其结构和依赖、在本地运行 Jupyter 以及编写容器化环境的 Dockerfile 来将 Jupyter Dockerize。
我们创建了一个 Docker 镜像并将其作为容器运行,从而使 Jupyter Notebook 更容易访问,并在不同环境中保持一致。这不仅简化了依赖管理,还使您的 Jupyter 环境具有可移植性和可重现性。
后续步骤可能包括使用特定的 Jupyter 扩展对您的 Docker 设置进行定制化、使用 Docker Compose 在多容器设置中运行 Jupyter,或将 Dockerized Jupyter 环境部署到云平台以实现可扩展的数据科学工作流。
Dockerizing Jupyter Notebook 的常见问题解答
关于将 Jupyter Notebook 容器化(dockerizing)有一些非常常见的 FAQ,本节将简要回答它们。
1. 如何连接到 Dockerized Jupyter Notebook?
要连接到 Dockerized Jupyter Notebook,您可以通过 Web 浏览器使用 Docker 主机 IP 地址加上暴露端口作为连接信息来访问 Jupyter Notebook 的界面。根据您的环境,您可能需要配置端口转发或网络设置。
2. 如何在 Dockerized Jupyter Notebook 中安装额外的 Python 包?
要在 Docker 容器中安装其他 Python 包,您可以使用 pip 命令。您可以将包安装命令放入 Dockerfile 中,或者在容器内交互式地调用它们。只需确保您创建的包与基础镜像所使用的 Python 版本兼容。
3. 如何在 Docker 容器中持久化 Jupyter Notebook 数据?
要持久化 Jupyter Notebook 的数据,您需要使用 volume,以便将主机上的一个目录映射到容器内的目录。这样,无论您在运行的 Jupyter Notebook 实例中创建什么 notebook、数据或文件,都会持久化到主机 volume 中,一旦容器停止也不会丢失。