Python 和 Jupyter Notebooks
最近我开始使用 Jupyter Notebook 开发 Python 代码,但总是遇到需要下载依赖项或下载失败的问题。考虑到这种情况会持续下去,并且我希望开发环境能够在不同电脑之间轻松迁移,所以我开始学习 Docker 的工作原理。
我用的是一台配备 2.8 GHz 英特尔酷睿 i7 处理器的电脑,于是开始研究如何在这台电脑上搭建 Docker 环境,以便将来切换到其他平台。我找到了两种使用 Jupyter Notebook 在 Docker 中安装英特尔 Python 的方法。在安装英特尔 Python 发行版时,我使用 Jupyter Notebook 作为代码、公式和可视化的前端。目前我用它来上课,发现它在团队成员之间共享代码时非常方便。
如前所述,为了实现这一点,我希望使用 Docker,它允许将 Jupyter Notebook 容器化,从而打包和运行应用程序。使用 Docker 可以轻松创建一个可迁移的编码环境。当使用 Docker 为 Python 发行版设置 Jupyter Notebook 时,可以使用现成的镜像,也可以将其作为基础镜像进行自定义。下面我将介绍在 Jupyter Notebook 上为 Intel Python 设置 Docker 镜像的两种方法。
Docker 镜像
Intel 发行版在 Docker 中同时提供了 Python 2 和 Python 3 镜像,并提供核心配置和完整配置两种选择。核心配置包含 NumPy/SciPy 及其依赖项,而完整配置则包含 Intel 发行版的所有内容。就我而言,我使用的是 Intel Python 2 的完整版本。
要开始使用 Docker 镜像运行 Jupyter Notebook,我从 Docker Hub 下载了所需的镜像,并设置了一个卷来配合该镜像使用。卷是使用 Docker 容器时可选的,但它可以实现数据的持久化存储。我之所以使用卷,是因为我将所有要运行的 Notebook 都存储在了卷中。当容器停止运行时,数据不会持久保存,而如果数据仅在容器内可用,当其他进程需要这些数据时,很难将其导出。因此,我在主机上创建了一个卷,以便稍后与容器一起使用。要设置此 Docker 容器,我按照以下步骤操作:
- 从Docker Hub下载 Docker 镜像。
~/Documents/notebooks我在计算机上创建了一个文件夹作为 Docker 卷,并将其附加到/home/notebooksJupyter Notebook 容器中。这样,即使关闭 Notebook,文件仍然可以轻松访问并进行版本控制。- 打开终端并运行笔记本。
# Pull image
docker pull intelpython/intelpython2_full
# Set up folder
mkdir ~/Documents/notebooks/
# Run the notebook
docker run -v ~/Documents/notebooks:/home/notebooks -p 8888:8888 intelpython/intelpython2_full jupyter notebook --ip='*' --port=8888 --allow-root --no-browser
这或许适用于许多应用场景,但我却遇到了问题。我在 Jupyter Notebook 中运行代码时,调用了 seaborn 库,该库用于 Python 中基于 matplotlib 的可视化。这个库用于在 Python 中创建更美观的统计图形。然而,从 Docker Hub 获取的 Intel Python 完整镜像并没有提供所需的库。因此,我尝试使用 Dockerfile 自定义 Docker 镜像,添加了 seaborn 库。
用于自定义的 Dockerfile
为了创建一个基于 Intel Python 的自定义 Docker 镜像,以便在 Jupyter Notebook 中运行,我参考了 Intel Python 在 Docker Hub 上的 Dockerfile,并以此为基础创建了一个 Dockerfile。然后,我使用 continuumio/miniconda 作为基础镜像。这是因为 Anaconda 是一个基于 Python 的平台,包含了 Python 和 R 中最常用的数据分析软件包。这些软件包可以通过 conda 依赖和环境管理器进行安装。通过使用此镜像,在创建自定义镜像时,所有 Intel Python 中未包含的必要软件包都可以通过 conda 安装。
# Set the base image using miniconda
FROM continuumio/miniconda3:4.3.27
# Add metadata
LABEL version="1.0" \
description="Intel Python 2 using Jupyter Notebooks" \
date_created="01march2018" \
date_modified="28march2018"
这样,环境变量ACCEPT_INTEL_PYTHON_EULA就通过 ENV 命令设置为“yes”。这表示接受了 Intel Python 的最终用户许可协议 (EULA),每次创建新环境时都需要接受该协议。设置此变量后,可以使用 RUN 命令在新层中执行 shell 命令。每次执行此命令都会创建一个新层。使用此命令,可以使用 conda 安装 Intel Python、seaborn 以及您可能需要的任何其他数据科学库。然后使用 apt-get 更新并安装 g++。配置自定义镜像后,即可构建并运行它。
# Set environmental variable(s)
ENV ACCEPT_INTEL_PYTHON_EULA=yes
# Installs, clean, and update
RUN conda config --add channels intel\
&& conda install -y -q intelpython2_full=2018.0.1 python=2 \
&& conda install seaborn \
&& apt-get clean \
&& apt-get update -qqq \
&& apt-get install -y -q g++
构建图像
Dockerfile编写完成后,在运行命令之前,请务必检查命令行当前目录是否正确。我经常会因为先查看其他内容,然后再返回构建镜像而误入错误的目录。
$ ls
Dockerfile
然后,要构建镜像,请运行带有 `-t` 标签的构建命令。该标签会为镜像指定一个易于识别的名称,我将其命名为 `test_intel`,以便能够快速从列表中找到它。构建镜像可能需要几分钟时间。
docker build -t test_intel .
运行映像
镜像构建完成后,您可以在本地计算机上检查 Docker 镜像仓库,查看镜像是否已添加到列表中。运行此命令后,将显示一个列表,其中包含镜像的仓库名称、标签、镜像 ID、创建时间和大小,如下例所示。这是一个很好的检查方法,可以确保镜像已成功构建,然后再继续下一步。
docker image ls
REPOSITORY TAG IMAGE ID SIZE
test_intel latest ce5d8aa2966d 6.52GB
完成后,就可以运行镜像了。运行镜像的过程与第一个示例中设置核心或完整 Docker 镜像(不进行任何自定义)的过程类似。要运行此命令,请将镜像名称替换为您在之前步骤中创建的新镜像名称 test_intel。
docker run -v ~/Documents/notebooks:/home/notebooks -p 8888:8888 test_intel jupyter notebook --ip='*' --port=8888 --allow-root --no-browser
在终端运行此命令后,应该会出现一个 URL,您可以复制该 URL 并粘贴到浏览器中,连接到已安装 Intel Python 发行版的 Jupyter Notebook。连接成功后,即可开始使用您的自定义环境。要关闭服务器和所有内核,请Control-C在终端中使用以下命令。
参考
适用于 Python、 Docker
、Seaborn
和 Miniconda的 Intel 发行版的 Intel 优化软件包。
封面图片来自Docker Wallpapers。