JupyterHub In Docker:简单示例

目录

本文介绍如何使用 Docker 搭建最简单的 JupyterHub 服务。

示例来自 jupyter/dockerspawner 的源码。

概述

本文依照官方示例,在单个主机上搭建最简单的 JupyterHub 服务。

JupyterHub 服务运行在名为 Hub 的容器中,并为每个用户创建自己的 docker 容器。

示意图

准备

下载 jupyterhub 镜像,该镜像包含 jupyerhub 的基本组件,但不包含 notebook

docker pull jupyter/jupyterhub

下载为用户实际运行的 jupyter 镜像

docker pull jupyter/base-notebook

创建网络

为 jupyterhub 创建一个单独的 Docker 网络 jupyterhub

docker network create jupyterhub

构建镜像

jupyterhub 镜像使用默认的配置,想要使用 Docker 运行 jupyterhub,并且想为每个用户运行单独的 Docker 容器,需要构建自己的镜像。

镜像需要安装额外的 python 包:

  • dockerspawner:使用 Docker 为用户创建 notebook
  • jupyterhub-dummyauthenticator:模拟验证过程,可以输入任意用户,仅用于测试

将上述包放到 requirements.txt 文件中。

dockerspawner
jupyterhub-dummyauthenticator

另外,需要为 jupyterhub 定义配置文件 jupyter_config.py

# 仅用于测试,不能用于生产环境
c.JupyterHub.authenticator_class = 'dummyauthenticator.DummyAuthenticator'

# 使用 docker 加载环境
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'

# 监听所有的 IP 地址
c.JupyterHub.hub_ip = '0.0.0.0'

# 用于连接 hub 的主机名或IP地址,这里通常是 hub 的容器名称
c.JupyterHub.hub_connect_ip = 'jupyterhub'

# 选择一个 docker 镜像,应该与 Hub 中的 jupyterhub 版本保持一致
c.DockerSpawner.image = 'jupyter/base-notebook'

# 告诉用户容器连接 docker 网络
c.DockerSpawner.network_name = 'jupyterhub'

# 服务停止时会删除容器
c.DockerSpawner.remove = True

Dockerfile 文件如下:

FROM jupyterhub/jupyterhub:latest

COPY requirements.txt /tmp/requirements.txt

RUN python3 -m pip install --no-cache -r /tmp/requirements.txt

COPY jupyterhub_config.py /srv/jupyterhub/jupyterhub_config.py

使用如下的命令构建镜像

docker build -t hub .

启动 Hub

启动 Hub 时,我们需要:

  • 在 docker 网络中运行
  • 暴露 8000 端口
  • 挂载主机的 docker 套接字

下面的命令在 9500 端口启动 jupyterhub

docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --net jupyterhub \
  --name jupyterhub \
  -p 9500:8000 \
  hub

运行

访问 http://some-ip:9500,可以看到下面这样的登录界面。 因为我们使用 DummyAuthenticator,所以输入任意用户名和密码,都可以直接登录。

使用 windorc 用户登录后,可以进入 jupyter notebook 界面

执行 docker ps -a 命令可以看到创建了一个 jupyter-windroc 的容器。

CONTAINER ID        IMAGE                   COMMAND                  CREATED              STATUS              PORTS                    NAMES
bea93673fc33        jupyter/base-notebook   "tini -g -- start-no…"   About a minute ago   Up 57 seconds       8888/tcp                 jupyter-windroc
64615720f22f        hub                     "jupyterhub"             About an hour ago    Up About an hour    0.0.0.0:9500->8000/tcp   jupyterhub

参考

https://github.com/jupyterhub/dockerspawner/tree/master/examples/simple