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后再设置,暂还不满足个人需求)
不过个人尝试有遇到奇怪的环境问题,表现为
- 无法在 jupyterlab 中创建 Terminal 后输入,输入时疯狂报错(无法创建 Thread)
- 一旦加载 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