本地连接运行在服务器docker中的jupyter notebook。

1.首要条件是拥有了安装了jupyter的docker image

以笔者的例子来说,笔者搭建的是一个深度学习训练和使用tensorrt部署的环境,笔者的Dockerfile如下:


FROM nvidia/cuda:11.1-cudnn8-devel-ubuntu20.04

RUN apt update && apt install -y python3 \
python3-pip \
swig \
vim \
git \
&& rm -rf /var/lib/apt/lists/*

RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install tensorflow-gpu==2.4.0 keras==2.4.3
RUN pip install -U keras2onnx tf2onnx==1.8.2 pillow pycuda scikit-image
RUN pip install jupyter notebook

WORKDIR /

这个image使用nvidia/cuda:11.1-cudnn8-devel-ubuntu20.04作为base,选择devel分支可以正常使用nvcc指令,后面编译pycuda需要用到nvcc程序。

然后使用命令sudo docker image build -t tensorrt:tensorflow .构建新的image。其中,image名称设为tensorrt是为了表示此image的功能,tag设为tensorflow表示是基于tensorflow/keras的model来做tensorrt加速部署。

2.基于此image启动一个container

sudo nvidia-docker run -it -p 7777:8888 tensorrt:tensorflow

在此命令中,-it表示打开container的交互式shell,-p表示端口映射,7777:8888表示将docker中8888的端口映射到宿主机的7777号端口上,8888号端口是jupyter notebook的默认端口。注意如果想使用cuda,需要使用nvidia-docker命令开启container。

开启container后,会打开docker中tensorrt:tensorflow这个container的shell,和ubuntu的终端一样使用。在此shell中,进入python环境。执行python3进入python的编程环境。

使用如下的代码来获取支持jupyter notebook远程连接的密码。

from notebook.auth import passwd
passwd()

python会提示输出密码,输入自己喜欢的简单密码就可以,笔者在这里设置的密码是313。然后python会生成一个长串的密钥。复制此密钥。

然后在container的shell中执行jupyter notebook --generate-config。执行完成后会在/root/.jupyter/目录下生成一个jupyter_notebook_config.py文件。使用vi打开此文件。

在文件中添加如下的内容(也可以在文件中找到对应的内容取消注释,这样做略微麻烦一些)。

c.NotebookApp.ip='*'
c.NotebookApp.password = u'刚才复制的长串密钥'
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888

保存退出。

3.启动jupyter notebook

在container的shell里面执行jupyter notebook --allow-root

然后在本地机器的浏览器中输入服务器的ip和对应的端口(7777),例如笔者的服务器ip是192.168.3.11(服务器在本地局域网中),在本地电脑浏览器中输入192.168.3.11:7777即可打开服务器端docker container中的jupyter notebook。

4.将修改的container内容推送到image中

由于修改的内容使用Dockerfile来控制略为困难,因此直接使用docker commit命令将修改推送到image中去。但是依然建议使用Dockerfile来定制镜像,使用Dockerfile来定制镜像,不管是制作者还是用户,都能轻易的看出对镜像的定制内容,做了何种修改,但是使用docker commit指令,将会屏蔽掉对镜像所作的定制内容,没有人能看到具体对镜像做了什么,只能得到最终修改好的镜像,因此使用docker commit指令来定制的镜像又被称为黑箱镜像,应尽量避免使用docker commit。关于docker的最佳实践中docker commit部分参考利用 commit 理解镜像构成

Ctrl + P + Q退出当前container,但是依然会保持container的运行。

使用sudo docker container ls获取当前container的container id。

执行docker commit。语法格式为docker commit -m '注释' container_id 镜像名

sudo docker commit -m 'add jupyter remote'  替换为container_id  tensorrt:tensorflow

commit之后,修改的内容就会更新到tensorrt:tensorflow镜像中,可以选择将镜像上传到docker hub。

sudo docker image tag tensorrt:tensorflow borninfreedom/tensorrt:tensorflow

执行tag操作的目的在强化学习docker环境配置中已经说明。

sudo docker image push bornifreedom/tensorrt:tensorflow

5.使用此镜像

用户可以基于上述说明自己制作镜像,也可以使用笔者已经上传到docker hub的镜像,如果使用笔者的镜像,只需要执行

docker pull borninfreedom/tensorrt:tensorflow