Docker部署JupyterLab服务

Jupyter看起来是个基于web界面的python的IDE+笔记本程序,似乎在非计算机专业的python课程上很流行。直接部署一般需要anaconda和ipython环境,对于咱来说没什么必要。官方也有提供各个版本的docker镜像,很方便就可以pull过来直接用,同时也不影响本机的环境,因此选择用docker部署一个JupyterLab服务。

官方文档:不同版本的docker映像

jupyter官方就有提供各种docker映像,环境和用途各不相同。这里咱选择官方minimal版本+python3.11。它包含基本的功能和工具,同时不包含对咱来说不必要的额外python第三方库和对别的语言的支持。以后有什么需要用到的python库在这个容器中用pip安装即可。

docker pull jupyter/minimal-notebook:python3.11

拉取映像后就可以直接从镜像启动容器了。但默认使用的是容器内的存储空间,主机不能直接访问在jupyter容器中编写的程序和笔记,jupyter工作区内的文件在容器关闭后也会丢失。从容器复制文件很不方便,配置文件也不好管理。可以把一个主机的目录挂载(bind-mounts)到容器内作为工作区来解决这个问题,即做一个简单地docker持久化。

试着在主机中用某个用户新建一个jupyter的工作区,再写一套Dockerfile和docker-compose.yml,把该目录挂载到容器内。

# Dockerfile
FROM jupyter/minimal-notebook:python-3.11

USER root
RUN groupmod -g 1000 users ; usermod -u 1000 jovyan
USER jovyan

此处Dockerfile的作用是修改容器的默认用户jovyan的uid和gid,使它与主机中jupyter工作区所属的用户的uid和gid一致,从而解决主机和容器的权限问题。

# docker-compose.yml
version: '3'

services:
jupyter:
build: .
container_name: jupyter
ports:
- 8888:8888
environment:
TZ: Asia/Shanghai
volumes:
- ./workspace/:./jovyan/:rw # 将主机中的jupyter工作区映射到容器中的默认home目录

目录结构:

目录结构

其中workspace是容器工作区目录,所属用户的uid和gid要和Dockerfile中指定的相同;jupyter_server_config.py是jupyter服务的配置文件

更推荐像以上通过在Dockerfile中修改容器内原用户uid和gid的方法。如果只在docker-compose.yml中用user字段指定uid和gid,那么在容器中该uid和gid实际上并没有对应的用户和组,会出现一些问题。(如在容器内命令行中用户名显示为i have no name!)

同时,对于jupyterlab服务的配置项可以直接在workspace/.jupyter中的jupyter_server_config.py中指定,其修改会直接映射到容器内$HOME/.jupyter下的默认配置文件。实际上配置文件也没什么需要修改的项,但如果要允许localhost外的客户端通过网络访问的话需要修改c.ServerApp.allow_remote_access为true并在c.ServerApp.local_hostnames列表中添加绑定的IP。如果想要jupyter服务支持SSL,也需要在这里指定SSL的证书和密钥。

c.ServerApp.allow_remote_access = True
c.ServerApp.local_hostnames = ['localhost', '192.168.1.1']

评论