在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'
浙公网安备 33010602011771号