docker搭建带jupyterlab并带SSL和密码

0. 说明

个人需求为在公网服务器上搭建 jupyterlab 方便我的各个电脑以及 ipad 都能轻松随时随地访问。

由于 jupyterlab 本身权限强大,为了安全和方便,实现后至少应该包含以下特性

  • 有登录密码
  • SSL能HTTPS方式访问
  • 避免富容器,不需要编辑容器内的配置就能实现日常需求,包括上面两特性

1. 官方实现方式

参考 https://jupyter-docker-stacks.readthedocs.io/en/latest/using/common.html#docker-options

docker run -it --rm -p 8888:8888 \
    -v /some/host/folder:/etc/ssl/notebook \
    jupyter/base-notebook \
    start-notebook.sh \
    --NotebookApp.keyfile=/etc/ssl/notebook/notebook.key \
    --NotebookApp.certfile=/etc/ssl/notebook/notebook.crt

非常简洁(但暂不包含密码设置,密码似乎需要进入jupyterlab后再设置,暂还不满足个人需求)

不过个人尝试有遇到奇怪的环境问题,表现为

  1. 无法在 jupyterlab 中创建 Terminal 后输入,输入时疯狂报错(无法创建 Thread)
  2. 一旦加载 python kernel 则直接崩掉,docker容器都崩没

个人目前没找到结局方式,欢迎有思路的帮助解答

2. 基于非官方镜像

参考 https://zhuanlan.zhihu.com/p/343379879

个人当前用的 captainji/jupyterlab

参考链接中有作者的 dockerfile:

# 源镜像
FROM ubuntu:20.10

# 使用root用户
USER root

# 建立挂载路径以及apt换源
RUN mkdir /opt/notebooks \
&& sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
&& apt update -y \
&& apt install -y nodejs npm vim curl wget python3 python3-pip -y \
&& alias python=python3

# 安装jupyterlab3及插件,并生成配置文件
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ "jupyterlab==3.0.5" \
&& jupyter lab --generate-config \
&& chmod -R 777 /root/.jupyter/jupyter_lab_config.py \
&& chmod -R 777 /opt/notebooks \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jupyterlab-language-pack-zh-CN \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jupyterlab-lsp==3.2.0 jupyter-lsp==1.1.1 \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jupyterlab_code_formatter \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ python-language-server[all] \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ black isort

# 安装常用库
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pandas \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ numpy \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ matplotlib \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ tqdm \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ scikit-learn \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ ipywidgets \
&& pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ ipympl

# 设置挂载路径
VOLUME /opt/notebooks

# 设置映射端口
EXPOSE 8888

# 设置容器启动时运行的命令
CMD jupyter lab --notebook-dir=/opt/notebooks --ip='*' --port=8888 --allow-root --no-browser

需要的话可以直接修改 dockerfile 创建自己需要的镜像

可以再编辑一个 restart.sh 负责启动容器:

docker stop JupyterLab
docker rm JupyterLab

docker run -d \
        -p 10000:8888 \
        -e JUPYTER_ENABLE_LAB=yes \
        -v /ppfiles/mylab:/opt/notebooks \
        -v /ppfiles/certs:/certs \
        -v /ppfiles/mylab_manage/jupyter_config:/root/.jupyter \
        -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
        -v /etc/timezone:/etc/timezone \
        --restart=always \
        --name JupyterLab captainji/jupyterlab

docker logs -f JupyterLab

其中

        -v /ppfiles/mylab:/opt/notebooks \

挂载宿主机某目录至容器工作空间

        -v /ppfiles/certs:/certs \

挂载证书目录

        -v /ppfiles/mylab_manage/jupyter_config:/root/.jupyter \

挂载jupyterlab的配置文件目录(证书和登录密码的配置放在其下的jupyter_lab_config.py文件中)

之后则需要配置 jupyter_lab_config.py 文件

(如果没有jupyter_lab_config.py文件可以先不配,去掉那行配置),进jupyterlab后,把容器中 /root/.jupyter 目录下拷贝出来就有了。

其中比较重要的几个配置(需要去掉对应行首的#号):

#明文密码:asd
c.ServerApp.password = u'sha1:a69837da1068:07f079cd07ef7efe674d982e788924f7621a024c'
#ssl文件,需要提前放在宿主机的 /ppfiles/certs 下 和 restart.sh 中  -v /ppfiles/certs:/certs \ 这一行配置对应
c.ServerApp.keyfile = '/certs/xxx.key'
c.ServerApp.certfile = '/certs/xxx.pem'

其中password需要sha1方式的(个人之前尝试其他的加密方式会无法登录,不知道为啥)

获得方式是运行:

from jupyter_server.auth import passwd
passwd()

输入两次密码后可得到

再复制进 jupyter_lab_config.py 的 c.ServerApp.password 即可

最后即可 sh restart.sh 运行,一切顺利即可直接访问到带 https 并有密码的 jupyterlab ,一旦遇到问题随时可重新运行脚本重启

有问题或建议欢迎留言讨论

资料

https://jupyter-docker-stacks.readthedocs.io/en/latest/using/common.html#docker-options

https://jupyter-server.readthedocs.io/en/latest/operators/public-server.html

https://zhuanlan.zhihu.com/p/343379879

发表评论