昨天想着用jupyter notebook咱anaconda虚拟环境下进行深度学习,然后配置完之后(想要配置的话可以参见我的这篇教程在anaconda虚拟环境下使用jupyter noterbook进行开发教程),装环境的时候有的包下载速度真的不尽如人意,所以就想着用docker来配置jupyter notebook,毕竟这docker只要一次配置,怎么玩都可以,省了配置环境的苦,还是阔以滴。
我的前提配置环境:
Ubuntu18.04、已安装好docker、nvidia-docker、基础的docker镜像和容器的知识。
打开终端,输入以下代码创建可以启用GPU的容器。
NV_GPU=0 nvidia-docker run -it --name mydeepo -p 7777:8888 -v /home/yijie/Codes:/home ufoym/deepo /bin/bash
NV_GPU=0 选择第0个GPU设备 ,用nvidia-docker命令才能在容器中启用GPU,如果不用GPU,可以改为docker命令,参见附录;这里会重新创建一个容器,如果已经存在的容器,可以换一个名字。
--name mydeepo中的mydeepo为容器名字,可以自己指定;
/home/yijie/Codes:/hom中冒号前为需要挂载到容器里面的文件夹的本地路径,冒号后面为容器中的虚拟地址,挂载完成之后,镜像内就可以共本地主机里的文件;
ufoym/deepo为容器依赖的镜像名。
进入容器,若是关闭终端而容器没关,请先优雅的关闭容器再打开,打开后终端再进入容器,详细代码参见附录。
cd home # 进入相关文件夹
mkdir jupyter # 创建jupyter文件夹
vim ~/.jupyter/jupyter-notebook-config.py # 需要调用vim,没有安装的先自行安装
加入如下内容:
c.NotebookApp.ip='*'
c.NotebookApp.password = u'sha1:617e61147d70:3253e38389d33fed2108fd09e06d4b2ec26e91b7'
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888
这里需要自己变动的是第二行的passwd,自己生成的步骤如下,另外打开一个终端,输入ipython或python:
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password: # 自己设置一个密码,例如1234
Verify password:
Out[2]: 'sha1:******'
将生成的密码替换到之前打开的vim界面下的相应位置。
配置完成后,就可以在容器内shell界面启动jupyter了。输入以下代码:
jupyter notebook --allow-root
输入代码后,并没有按预期的跳出jupyter notebook,终端显示如下:
root@1b93da49106d:/# jupyter notebook --allow-root
[W 07:35:09.339 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 07:35:09.342 NotebookApp] Serving notebooks from local directory: /
[I 07:35:09.342 NotebookApp] The Jupyter Notebook is running at:
[I 07:35:09.342 NotebookApp] http://1b93da49106d:8888/
[I 07:35:09.342 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
这是因为docker产生的container是一个新的环境,提示链接的服务器端口已经从8888变成之前我们绑定的7777了,所以需要在浏览器里自己输入网址(这里的地址按自己终端的提示而定,我配置的时候,没有显示这个地址,只显示了如下http://1b93da49106d:8888/,但是当我尝试在浏览器输入该网址的时候,终端会提示出网址,如下所示,即更改成提示的网址并将端口改为7777就可以了,在我这里,即在浏览器输入http://127.17.0.1:7777)
root@1b93da49106d:/# jupyter notebook --allow-root
[W 07:35:09.339 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 07:35:09.342 NotebookApp] Serving notebooks from local directory: /
[I 07:35:09.342 NotebookApp] The Jupyter Notebook is running at:
[I 07:35:09.342 NotebookApp] http://1b93da49106d:8888/
[I 07:35:09.342 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[I 07:35:17.884 NotebookApp] 302 GET / (172.17.0.1) 2.08ms
顺利的话,就可以进入jupyter notebook了,输入之前设置的密码,就可以登录进熟悉的界面了。
可能会遇到的问题,有的同学退出的时候,可能习惯了直接关浏览器关终端,这样在第二次进入jupyter notebook的时候,就会遇到一些问题,比如说端口被占用啥的,此时的解决方法,是进入容器(如果没有正常关闭jupyter notebook的话,会直接在打开就jupyter notebook的状态),Ctrl+c,y,关闭jupyter notebook,再docker stop mydeepo停止容器,然后docker start mydeepo启动容器,docker attach mydeepo进入容器,输入jupyter notebook --allow-root,在浏览器输入网址,打开jupyter notebook,~走正常的流程就可以了。
所以,一定要记得怎么退出的时候,在终端退出jupyter notebook!接下来就可以愉快的进行学习了!推荐一个镜像ufoym/deepo,什么都有!
1、通过交互式shell创建docker容器
Docker的镜像称为image,容器称为container。对于Docker来说,image是静态的,类似于操作系统快照,而container则是动态的,是image的运行实例,类似于conda下面的虚拟环境。比如,有一个image名称为ufoym/deepo,那么比如现在我们创建这个image的container并且进入到这个container的bash命令如下:
docker run -it --name mydeepo ufoym/deepo:latest /bin/bash
其中-i -t 表示创建一个提供交互式shell的容器。
ufoym/deepo是镜像名,如果本地不存在,回到仓库中下载。
latest是镜像ufoym/deepo的标签,可以用命令docker images查看镜像的标签名称。
/bin/bash 是指定容器创建后立即执行的命令。
对于交互式容器,当退出shell后,容器会关闭。 后面可以通过命令重新启动容器。
2、其他docker命令如下:
exit # 退出交互式shell容器
docker ps -a # 查看所有存在的容器
docker rm mydeepo # 强制删除创建名字为mydeepo的容器
docker start mydeepo # 开启容器,mydeepo为容器名字
docker stop mydeepo # 关闭容器,mydeepo为容器名字
docker attach mydeepo # 进入容器,mydeepo为容器名