在Docker上搭建本地Jupyter服务

1、选择Docker镜像

Jupyter官方在docker hub上提供了一些镜像,常用的一些镜像有:
jupyter/minimal-notebook:附带Pandoc、TeX Live、git、emacs、jed、nano、tzdata、unzip。
jupyter/scipy-notebook:基于jupyter/minimal-notebook并附带pandas、numexpr、matplotlib、scipy、seaborn、scikit-learn、scikit-image、sympy、cython、patsy、statsmodel、cloudpickle、dill, numba、bokeh、sqlalchemy、hdf5、vincent、beautifulsoup、protobuf、xlrd 。
jupyter/tensorflow-notebook:基于jupyter/scipy-notebook并附带tensorflow、keras。
可在官方文档查阅完整的Docker镜像信息。

2、自定制镜像

一般来讲,镜像默认提供的库可能无法满足我们的需求,因此需要另外安装一些Lib。自定制的实现两种方式:

方式一

(1)可以先随便启动一个镜像

docker run -p 8888:8888 jupyter/scipy-notebook

(2)访问http://localhost:8888,在jupyter notebook中新建一个terminal,之后就可以用pip、conda等命令安装所需的库了。这里需要说明一点,如果要使用sudo权限,则需要在启动容器时加入-e GRANT_SUDO=yes参数,这点在使用apt-get安装依赖项时可能会用到。
(3)安装完成后提交镜像修改(用于持久化,如果不提交镜像,一旦删除容器就需要重新配置),后续就可以使用镜像jupyter/my-scipy-notebook启动容器了。

docker commit jupyter/my-scipy-notebook

方式二(推荐)

直接通过Dockerfile构建子镜像,以下给出一个示例,Dockerfile的具体用法可参阅官方文档

ARG BASE_CONTAINER=jupyter/sci-notebook
FROM $BASE_CONTAINER

#使用apt-get时需要切换到root用户,注意一定要先使用apt-get update更新源
USER root
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    gfortran \
    gcc && \
    rm -rf /var/lib/apt/lists/*

#切换到普通用户$NB_UID(这个是在父镜像jupyter/base-notebook中定义的变量,默认为jovyan)
USER $NB_UID
#以下通过pip、conda等命令安装一些库
RUN pip install --quiet --no-cache-dir \
    'tensorflow==2.1.0' \
    'keras==2.3.1' \
    'jupyter-lsp==0.8.0' \
    'jupyter-tensorboard==0.2.0' \
    'jupyterlab_latex==2.0.0' \
    && \
    conda install --quiet --yes \
    'descartes==1.1.0' \
    'geopandas=0.7.0' \
    'scikit-learn==0.22.2.post1' \
    'scikit-image==0.16.2' \
    'cartopy==0.17.0' \
    'jupyter_contrib_nbextensions==0.5.1' \
    'nodejs==13.10.1' \
    'python-language-server==0.31.9' \
    'r-languageserver==0.3.4' \
    'jupytext==1.4.1' \
    'nbdime==2.0.0' \
    'ipysheet==0.4.3' \
    && \
    conda install -c plotly --quiet --yes \
    'plotly==4.5.4' \
    'plotly-orca==1.3.0' \
    'plotly-geo==1.0.0' \
    'chart-studio==1.0.0' \
    && \
#   配置nbextension
    jupyter contrib nbextension install --user --skip-running-check \
    && \
#   安装jupyterlab插件,依赖项在上述pip、conda命令中已安装
#   这里注意要先使用--no-build参数安装,最后再build
#   build时加入--dev-build=False --minimize=False参数,不然容易报out of memory错误
    jupyter labextension install -y --no-build \ 
    '@jupyter-widgets/jupyterlab-manager' \
    'jupyter-matplotlib' \
    '@krassowski/jupyterlab-lsp' \
    '@jupyterlab/toc' \
    'jupyterlab-spreadsheet' \
    'ipysheet' \
    '@jupyterlab/latex' \
    '@jupyterlab/geojson-extension' \
    '@jupyterlab/mathjax3-extension' \
    '@jupyterlab/katex-extension' \
    'jupyterlab-plotly' \
    && \
    jupyter lab clean && \
    jupyter lab build --dev-build=False --minimize=False \
    && \
    conda clean --all -f -y && \
#   修复权限,fix-permissions是默认提供的脚本,位置在/usr/local/bin/fix-permissions,读者可以自行打开查看脚本说明
    fix-permissions $CONDA_DIR && \
    fix-permissions /home/$NB_USER

#安装matplotlib中文字体
#需要将字体放在Dockerfile同一目录
COPY SimSun.ttf /opt/conda/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf
COPY SimHei.ttf /opt/conda/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf
#注意一定要清除缓存,否然中文字体仍无法识别
RUN rm -rf ~/.cache/matplotlib

编写完Dockerfile后,进入Dockerfile所在目录并运行以下命令构建镜像。

docker build -t jupyter/my-scipy-notebook .

3、启动镜像

启动镜像时,参数设置可参阅另一篇文章,这里需要注意两个参数:
(1)用-w /mnt/document指定jupyter的根目录,如不指定,根目录默认为/home/jovyan/work
(2)start-notebook.sh --NotebookApp.password=''用于设置访问密码,引号里填写的内容,可用以下python脚本生成(需要安装有jupyter notebook):

from notebook.auth import passwd
passwd()

根据提示输入密码,最后会生成一个hash串(如输入密码123456,输出sha1:0191f5662e87:9bd5edfc543f54d6ccdfcb2a775cdf41c8808586),把生成的hash串填入即可使用密码。
最后给出一个完整的启动示例:

docker run -d --name jupyter -p 10001:8888 --restart always -v /Users/Docker:/mnt/document -w /mnt/document jupyter/my-scipy-notebook start-notebook.sh --NotebookApp.password='sha1:0191f5662e87:9bd5edfc543f54d6ccdfcb2a775cdf41c8808586'
posted @ 2021-01-23 14:11  Mr_Purity  阅读(1316)  评论(0)    收藏  举报