编者注:注意文章时效性。
前言(牢骚):今天着实是不适合工作的一天,香港中文大学的开源框架mmdetection,就那么几个简单的步骤,安装了N遍,就是不成功。参考了很多博客,没有问题啊,等我再研究研究到时候记录一下。正题来了,今天这里记录一下如何在linux的容器内配置jupyter notebook,供本地调用,这就是我今天的成果,真的是忧桑~~~
由于很多人使用的linux服务器不是图形界面的,很多公司也不是人手一台服务器,是很多人共用的,因此在本地使用jupyter notebook来操作服务器上的实例是一个不错的选择,并且可以进行图像显示,方便查看一些测试结果。说道这里,不得不再次发个牢骚,下午找了一个博客,写的都差不多,然后我就坚信不疑流程就是这样的,然后我就安装了N遍,失败了N遍(夹杂这mmdetection安装失败的双重打击),一方面是我个人的不严谨,另一方面,网上的一些博客真的是不够详细,这里我就记录一下相对详细的流程,也希望大家不会走无谓的弯路。
任务
在一台linux服务器上,起了一个个人使用的容器,然后在容器内安装配置jupyter notebook,最后要实现的是本地windows浏览器可以远程访问容器内的jupyter实例,开始记录。
一、在服务器上新建容器
docker run -it --name=jupyter_test -p 0987:8888 nvidia/cuda:9.0-cudnn7-devel-centos
这个命令,即新建一个容器,名字是 jupyter_test ,-p 选项是设置端口映射,0987 代表服务上的端口(自己定,要求是一个没有被占用的端口),8888 为容器内使用的端口(也是可以修改的,不过自己的容器也没有必要修改,后边具体会说到)。具体整行docker命令就不解释了,这个也不是唯一的,使用docker的同学自然都了解,按照你自己的习惯即可,这里主要是说一下和正常起容器唯一的区别就是需要设置一下 -p 参数。当然啦,这个参数不设置也是可以的哦,那默认值就是 ‘-p 8888:8888‘,设置的目的就是为了避免多个人的容器里都使用jupyter,如果都用默认的 8888 端口,那你知道啦,会冲突呀!
OK,那这里再详细说一下为什么要进行端口映射呢?如果我们没有涉及docker容器的概念,我们只是想把一台服务器上的jupyter实例映射到windows的浏览器上,那就直接把服务器上的一个端口,默认jupyter实例会使用 8888 端口(上文说过,可以修改),映射到本地就可以了。当涉及docker容器的时候,我们可以理解为 本地浏览器 ==》服务器 ==》容器 之间的三层连接,因此需要服务器和我们的容器之间进行一个映射,也就是 -p 的作用。
二、容器内安装配置jupyter notebook
1. 安装ipython, jupyter
pip install ipython
pip install jupyter
2. 生成配置文件
jupyter notebook --generate-config
这条命令之后会提示生成了一个配置文件,如下:
Writing default config to: /root/.jupyter/jupyter_notebook_config.py
3. 进入ipython,设置密码并生成密钥(可略过,直接到 d)步骤)
ipython
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:43b95b731276:5d330ee6f6054613b3ab4cc59c5048ff7c70f549'
In [3]: exit()
在 Enter password: 和Verify password: 这两部分,是输入一个你想设置的密码,用于在本地启动jupyter的时候验证的,这一段代码的作用就是把你设置的密码通过内置的函数生成一段密钥’sha1:43b95b731276:5d330ee6f6054613b3ab4cc59c5048ff7c70f549′ (每次都不同的哦),后续将这个密钥填写到生成的配置文件里,系统会自动解析成你设置的密码。到这里你能了解到什么?对,就是这段代码不设置也没问题,无非就是每次启动的时候会自动生成密码就是了,怎么看随机生成的呢,后续会再讲。
4. 修改配置文件
这个时候就要修改在 2 中生成的文件了
vi /root/.jupyter/jupyter_notebook_config.py
这里设置的就是调用jupyter notebook时候的默认参数,如果想要修改哪一项,需要将每个参数前边的 # 打开才能生效哦,不打开就还是默认的啦。需要修改的参数如下:
c.NotebookApp.ip='*' #设置访问notebook的ip,*表示所有IP,这里设置ip为都可访问
c.NotebookApp.password = u'sha1:43b95b731276:5d330ee6f6054613b3ab4cc59c5048ff7c70f549' #填写刚刚生成的密钥,如果没设置密码,也可以不改
c.NotebookApp.open_browser = False # 禁止notebook启动时自动打开浏览器,当然我们的服务器本身也没有浏览器,因此不改也可
c.NotebookApp.port =8888 #指定访问的端口,默认是8888,想改就改,如果改了,那第1步中的 -p 对应端口号也要修改
c.NotebookApp.allow_root = True #允许用户使用root权限,也是改不改都行的,就是启动jupyter实例的时候有区别,后续会提及
以上五个参数是一般都会这样修改的,当然具体改不改,怎么改,注释里已经说明了,大家看心情,下边我就说一下让我撞了一下午墙的一个参数吧。
c.NotebookApp.allow_remote_access = True #其实看字段都知道要修改,当然要允许远程访问啦
为什么我撞墙了呢,就是我找到的排在度娘前边的博客,几乎都没有写这一条啊啊啊啊!!!当我知道了要修改这个的时候,还特意搜了一下,明明很多博客都写了这一条啊,为啥推给我的都是没有这一条的,居然还有好评,真的是醉醉的哦,只能怪自己不是vip吧,哈哈。
5. 启动jupyter实例
jupyter notebook &
和在windows启动jupyter命令一样,后边加一个&是让服务器的命令行只输出系统日志,不输出其他的运行代码之类的日志,实际运行就了解了,也就是说只运行jupyter notebook命令也是可以的。
这里要提一个前边说的 c.NotebookApp.allow_root 参数了,如果不设置为True,那启动jupyter的时候需要添加root权限,命令如下
jupyter notebook --allow-root
三、本地登录jupyter
通过第2个大部分,服务器端已经把jupyter实例启动了,接下来就是在本地浏览器操作jupyter咯
打开本地浏览器,在网址栏里输入服务器的ip+映射端口号,加入服务器的ip为 10.1.12.189,那么输入为
http://10.1.12.189:0987
端口号0987是我们启动docker容器设置的,到这里,本地浏览器就会跳转到jupyter的输入密码界面了,输入之前设置的密码,ok,验证通过,跳转到具体文件夹里啦。
到这里又要对前文留下的一个小尾巴解释一下了,前文说设置密码和生成密钥部分可以略过,当然也就是ipython就不用安装了,那如果略过了怎么对jupyter的登录进行验证呢?如果不设置密码,当我们启动一个jupyter实例,并在本地浏览器打开的时候,页面是这样:
当我们在服务器命令行启动jupyter命令的时候,会输出一个token信息,如果你找不到,ok,没问题,上图中红框的命令在服务器命令行执行一下(对,就在启动jupyter命令之后直接输出执行),会再次输出一次token信息,把这个token直接填写在 Password or token 框里,或者在 Setup a Password部分的Token框里输入,并设置一个 New Password 一样可以进入。
我们可以到前文我们修改的config文件里去看,有一个token参数,默认设置是 <generate>,也就是每次启动jupyter实例都会随机生成啦,你也可以把这个设置成固定的,自己探索吧。
四、设置不进入容器启动jupyter实例
第3步中的服务器启动jupyter实例是我们在容器里运行的命令,那当我们配置完容器里的jupyter notebook之后,下一次如果再想启动容器里的jupyter实例,可以不进入容器内,直接在linux服务器中运行命令即可
docker exec jupyter test jupyter notebook &
五、总结
最后还要说一下,如果没有涉及容器的同学,只是服务器和本地之间的映射呢,过程一样,不需要建立容器,直接在linux服务器上进行jupyter的安装配置就行了。如果更改了config的端口,在本地浏览器访问的时候,填写更改后的端口号即可,默认还是8888.整体常规流程就是这样了,没怎么上图,大家多多包涵。时间紧迫,我继续去撞mmdetection的墙了,争取找出问题好分享给各位同学,本篇记录如果有什么问题和错误,欢迎批评指正!