Linux部署JupyterHub实现多用户使用Jupyterlab
一、安装docker
1、安装
2、配置
二、拉取镜像并创建容器
1、拉取镜像
- debian:latest 是 Debian 官方在 Docker Hub 上维护的镜像标签。
- latest 默认指向 Debian 当前最新的稳定版(stable),例如 Debian 12(bookworm)或 Debian 11(bullseye),具体取决于 Debian 官方的更新策略。
- 这个镜像是 最小化基础镜像(minimal base image),仅包含最基本的系统工具和库,适合作为构建其他镜像的基础。
举个例子:
截至今天(2025年8月16日),debian:latest 很可能指向 Debian 12 "bookworm",因为 Debian 12 是当前最新的稳定版(发布于2023年6月),除非 Debian 13 已经发布并成为新的 stable。
2、创建容器
此处使用debian作为基本镜像进行搭建,也可以使用ubuntu和centos等镜像,对外暴露端口号为8000,若有端口冲突,可改为其他端口,jupyterlab服务运行在容器的8000端口上。
3、进入容器
创建完成后进入容器,接下来的众多命令均在容器内执行:
三、安装必要的包
1、更新软件源

# 如果速速很慢,国外源的问题,可以尝试先修改源
# 1. 把 https 换成 http(临时)
sed -i 's|https://mirrors.tuna.tsinghua.edu.cn|http://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
# 2. 更新索引并安装缺失的包
apt-get update -y
apt-get install -y ca-certificates openssl
# 3. 再把 http 换回 https(永久)
sed -i 's|http://mirrors.tuna.tsinghua.edu.cn|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
# 4. 后续正常更新
apt-get update -y && apt-get upgrade -y && apt-get autoremove -y

2、安装软件

四、安装Miniconda3
1、获取下载地址
下载地址: Miniconda3清华镜像站下载
选择较新版本,复制链接,

Miniconda3-py310_22.11.1-1-Linux-x86_64.sh
https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py310_22.11.1-1-Linux-x86_64.sh
2、下载并安装

回车,空格到询问 yes 这里,输入 yes

修改路径


执行安装后,有几点注意:
- 刚执行的时候是服务条款,一路按
Enter,然后要输入的时候输入yes即可;
- 接下来会让确认路径,默认为
~/miniconda3,不要装在root用户目录下,建议装在/opt/miniconda3目录下,装root目录下之后会出现很多问题;
- 最后询问是否初始化,选择
yes;
- 安装完成后可删除安装包,以节省硬盘空间
3、验证是否安装成功
安装完成后重启终端,然后再进去,再进入发现终端(base)开头,说明安装成功
验证一下

五、安装nodejs和npm
nodejs和npm可以使用apt-get包管理工具进行安装:
但版本可能不是很新,以下提供另一种安装方法:
1、下载
node.js中文官网: 下载 | Node.js 中文网 (nodejs.cn)

https://npmmirror.com/mirrors/node/v22.18.0/node-v22.18.0-linux-x64.tar.xz
访问界面,选择Linux 二进制文件 (x64),右键复制链接
返回终端,下载:
解压:
移动并重命名
2、配置环境变量
追加以下内容:
使环境变量立即生效
3、验证
nodejs和npm安装完成,使用以下命令进行验证

六、配置镜像源
npm、pip和conda的软件源都是国外的,在国内访问比较慢,换源有利于提高下载速度。
1、npm换源
2、pip换源
3、conda换源
把 free 源和 msys2 源删掉(conda ≥ 4.7 后这两个基本没用)
七、时区设置
不设置时区后续可能会出现一些问题。
终端执行:
选择时区时选择Asia/Shanghai
城市
八、安装jupyter相关的库
1、需要npm安装的
2、需要conda安装的
这里需要大内存;;------------------------



pycurl必须用conda装,用pip装会报错,或用源码编译安装,没有pycurl就会导致普通用户无法开启jupyterlab
- pycurl 是 Python 对 libcurl 的封装,用来给 JupyterHub 提供 高性能 HTTP/HTTPS 客户端 能力(JupyterHub 内部用它做代理、API 调用、Spawner 与 Hub 通信等)。
- 安装包本身并不大:
- Linux x86_64 wheel 只有 ≈ 250 kB。
- 但它依赖 libcurl 及 openssl 等系统库,Conda 会一次性把兼容版本一起拉下来,所以 下载量可能达到 5-10 MB。
- 真正让你觉得“卡死”的原因通常不是包大小,而是 网络 + 依赖解析:
为什么看起来“卡”
- 依赖解析阶段
Conda 要先算一遍 环境与依赖约束,这一步在容器/低配机器上 CPU 占用高,看起来像假死,其实后台在算。 - 清华源 TLS 握手慢
如果刚装完 ca-certificates,但网络到 TUNA 的 TLS 握手偶尔延迟高,也会出现长时间停顿。 - 没有进度条
旧版 Conda 在解析阶段不显示任何输出,所以 几分钟没动静 会让人误以为死机。
如何缓解
- 第一次耐心等 3-5 分钟,别反复 Ctrl-C。
- 换用 mamba(conda 的 C++ 实现,解析快很多):
离线安装
micromamba(跳过索引)
如果你机器内存小,micromamba 不会解析大索引,速度更快:
3、需要pip安装的
解释一下安装的包的含义:
jupyterlab:jupyter notebook环境jupyterhub:jupyterhub主体程序jupyterhub-idle-culler:用于处理用户空闲进程
九、配置jupyterhub
1、生成配置文件
2、编辑配置文件
将以下内容追加到配置文件/etc/jupyterhub/jupyterhub_config.py中
十、启动
(1)正常启动
创建启动脚本:
写入以下内容:
赋予可执行权限:
然后执行脚本启动jupyterhub
(2)设置开机自启动
若每次启动都需要手动运行脚本来启动是在太麻烦,所以我们将脚本添加到容器的自启动中,让其随着容器的启动而启动。
容器在启动时,会先执行/root/.bashrc文件,我们将要执行的脚本加入其中即可实现jupyterhub随容器的启动而启动
添加以下内容:
添加完成后,我们可以退出容器,然后让容器重启,看重启后jupyterhub是不是自动启动了
退出 docker
exit
# 重启容器
docker resatrt jupyterhub
十一、访问
1、进入容器
创建完成后进入容器,接下来的众多命令均在容器内执行:
1、设置容器 root 密码
在访问前先设置密码,root用户为管理员,docker中的root用户默认是没有密码的,需要我们设置一个:

确认 root 允许登录
容器默认允许 root 登录,但如果你改过 sshd_config 或 pam 配置,就可能被禁用。
临时测试可以:
2、登录
然后再进行登录
查看登录日志
让 root 重新出现在白名单
编辑配置文件 /etc/jupyterhub/jupyterhub_config.py,确认并追加:
重启 JupyterHub 使配置生效
然后再进行登录

登录的密码是你系统用户的密码。若是要添加用户,在用户管理界面添加用户后,还需要在系统终端中修改密码。
登录界面:
登陆后的jupyterlab界面:

十二、用户管理
1、单个或较少用户管理
(1)添加用户
使用root账户登录管理界面,然后点击Add Users添加用户,添加用户时候,每一行一个用户。可选择Admin设置添加的用户是否是管理员

添加后的界面如下:

(2)修改用户
添加用户后,可以点击Edit User进行用户的删除、修改用户名和赋予管理员权限等操作。
(3)修改和设置用户密码
jupyterhub无法在管理界面设置密码,设置密码需要在终端中进行设置。在jupyterhub终端中添加的用户,将被默认添加到系统用户中,并在/home文件夹下生成相应的用户目录:
查看用户

因此,修改密码需要在终端中使用passwd命令来修改密码:
- root用户可直接使用
passwd 用户名来修改密码,且修改密码不需要知道当前的密码:

2、多用户批量管理
当需要有大量添加大量用户时,我们就需要使用chpasswd命令来批量修改密码
(1)添加用户
首先在管理面板中批量添加用户

(2)批量修改密码
然后将用户名和密码对应,写成用户名:密码的形式,存储在文件中,如存储在passwd.txt文件中,文件内容如下所示:
然后在终端执行以下命令,即可完成用户密码的批量修改
chpasswd < passwd.txt
这样添加的用户就可以通过用户名和设置的密码来访问了
十三、jupyterlab功能扩展
jupyterhub是用来管理多用户使用jupyterlab,但我们实际去写代码的界面其实还是jupyterlab。初始的jupyterlab功能十分有限,没有代码提示和自动补全、没有代码自动保存、没有代码格式化,所以我们需要通过安装插件来补全这些功能。jupyterlab插件有很多,这里介绍几个常用的。
1、中文界面
默认的jupyterlab是英文界面,我们需要安装插件来中文化

安装后需要配置
管理员的页面

2、自动保存
自动保存功能不需要安装插件,且jupyterlab是开启的,但jupyterlab中自动保存间隔是120秒,我们需要修改这个值。
- 依次打开设置->高级设置编辑器->JSON设置编辑器

- 然后添加自己的设置

3、自动闭合括号
设置->笔记本,勾选自动闭合括号

4、代码格式化
jupyterlab_code_formatter
该插件安装后需要重启才生效。
当我们写完代码后,点击如图所示的图标,代码就会被自动格式化:
5、树目录
jupyterlab-unfold
6、绘制可交互图
jupyterlab-matplotlib
该插件安装后,使用matplotlib绘图时只要加上以下代码,即可绘制可交互的图像:
绘制的效果如下,可以点击图中的点查看对应数值,以及放大缩小图像等:
7、代码补全和自动提示
安装后重启,重启完成后进入到jupyterlab界面,然后进行设置。
进入设置,选择Code Completion,勾选Continuous hinting后刷新界面即可
效果如下,和Pycharm等IDE提供的代码提示类似:
8、代码执行时间
如图所示,可以看到上次执行代码的时间和执行耗时:
9、绘制流程图
pip install ipydrawio
安装重启后,在开始页,可以看到增加了两个选项,点击可以创建绘图
创建的绘图界面如下,和drawio相似,其实就是drawio的jupyterlab插件:
10、多用户设置同步问题
当我们安装完插件后,需要进行一些设置才能够使用,但配置后我们发现只有当前用户可以使用,其他用户并没有进行配置。这是因为每个用户配置后相应的配置文件均保存在~/.jupyter文件夹下,若我们需要多个用户同时进行某项配置时,最简单的办法是直接使用配置好的用户的.jupyter文件夹替换要配置用户的文件夹即可,那样所有用户的配置都一样了。
值得注意的是,替换文件夹后要配置相应的权限,以免替换后被替换的用户无法访问配置文件而无法加载。最简单的方法是以下设置:
- 当用户成百上千的时候,这么替换也属实麻烦,可以编写python或shell脚本去实现替换,以加快效率
十四、解决终端无法正常显示中文
1、安装locales
2、添加配置
选择zh_CN.UTF-8 UTF-8
3、查看语言设置
一键修复(两条命令即可)
当前 shell 没有继承 /etc/default/locale,
Debian 容器里默认的 /bin/sh -> dash 并不会自动读取它。
手动 source 也不行,是因为:
dash不认识LANG=xxx这种 Bash 语法;- 容器启动时并没有执行
login/pam_env,所以所有变量都是空的。
若不是,可以添加环境变量
追加到/etc/bash.bashrc文件中,然后再使其生效
4、效果
设置完成后重新打开终端,设置成功
原来的显示
现在的显示
十五、解决matplotlib绘图异常
1、问题描述
matplotlib绘图代码如下:
报错:
原因:系统中缺少SimHei字体
2、问题解决
(1)获取matplotlib的字体目录
import matplotlib
print(matplotlib.matplotlib_fname())
(2)打开字体目录
由上一步获取的地址修改得到
(2)打开字体目录
由上一步获取的地址修改得到
3)下载SimHei字体
下载地址:https://www.fontpalace.com/font-download/SimHei/
下载后复制到上一步得到的字体目录
(4)清除matplotlib缓存
将服务器文件 复制到 容器
进入容器
(4)清除matplotlib缓存
(5)修改配置文件
配置文件即第一步获取的文件
在 容器里 执行:
这个地址是python地址版本和自己对应
修改的几处如下:
(6)重启
重启后再运行没问题了
十六、内存占用问题
用户每打开一个Notebook文件,系统就会开始一个jupyter notebook内核进程,用户退出后进程不会自动终止;
jupyterhub虽然可以自动释放资源,但并不会释放jupyter notebook内核进程;
当多个用户访问后,内存一直在增加,没有得到释放;
暂时没有好的解决方法,只能够让jupyterhub容器定时重启;
我们使用Linux中的crontab命令设置定时重启jupyterhub容器,crontab是Linux系统下用于执行定时任务的一个工具,用法可以自行百度。
Debian 基础镜像为了瘦身,默认不带 cron / crontab。
添加以下字段:
- 此字段指定每天凌晨2点30分重启jupyterhub容器
进入容器 安装 xedu环境
- 公共环境(common)里一次性装好你列出的那些库;
- JupyterHub 默认把它作为“模板”,每个用户第一次登录时 自动克隆 到自己的独立环境;
- 之后用户自己在自己的环境里随意增删包,互不干扰。
下面给你一条命令 + 一段配置,10 分钟搞定。
1. 在容器里创建公共环境并装好所有库
正确做法(两步)
- 先创建公共环境(只装 conda 能解决的包)
先装一个可用的 PyTorch(如 1.13.1):
再用 pip 装 XEdu 系列包
https://pytorch.org/get-started/previous-versions/
2. 修改 JupyterHub 配置,实现「首次登录自动克隆」
编辑 /etc/jupyterhub/jupyterhub_config.py,追加以下内容:
3. 重启 JupyterHub
5. 额外说明
- 升级公共库:只需在
common环境里conda update xxx,不会污染已克隆的个人环境。 - 重置个人环境:管理员可
conda remove -n alice --all,用户下次登录会重新克隆。
一句话总结
用 conda create -n common … 装好库 → 配置 pre_spawn_hook → 重启 JupyterHub,
用户首次登录即拥有独立、已预装 XEdu 系列库的环境,互不干扰。


所有评论(0)