本地连接服务器docker中的jupyter notebook
Published:
本地连接运行在服务器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