用Docker部署Jupyter Notebook

2016/6/26 posted in  Geek心得

想在公司的服务器上搭建一套Jupyter Notebook的开发环境,这样无论走到哪里都可以打开浏览器敲代码了(有木有很屌丝)。然而公司的服务器各种不给力。于是想到了run it anywhere的Docker。

采用Docker部署Jupyter Notebook还有一个优势:一次生成镜像后,可以很方便地二次部署到其他服务器上(比如Amazon的AWS),省去了很多重复性的工作。

由于是第一次使用Docker,踩了不少坑。所以这里记录下了Docker的一些主要使用方法。

下面进入正题。

首先,创建一个anaconda镜像的容器:

docker run -itd -p 8888:8888 -v /your/local/dir:/docker/dir --name anaconda continuumio/anaconda /bin/bash

简单解释一下这行代码:
- run: 创建一个容器
- -i: 打开容器的标准输入
- -t: 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
- -d: 让容器后台运行
- -p hostPort:containerPort: 将本地的hostPort端口映射到容器的containerPort端口上。此处是对8888端口进行绑定(8888端口也是Jupyter Notebook的默认端口)
- -v /your/local/dir:/docker/dir: 挂载一个本地目录到容器中去,以实现本地和容器的文件共享。
- --name: 指定容器的名字,方便后面对容器的管理
- continuumio/anaconda: 要加载的镜像仓库地址
- /bin/bash: 默认容器创建完成后的执行命令。这里为了对容器进行进一步的修改,启动了bash应用。(这也是很常用的一个命令)

如果是第一次创建,docker会首先从服务器上获取镜像(相当于执行命令:docker pull continuumio/anaconda)。

创建完成后,可以用docker ps查看正在运行的容器(docker ps -a查看创建过的所有容器;docker images查看所有下载到本地的镜像)。

以下是几个与容器(镜像)有关的常用命令:
- docker rm [container]: 删除一个已经停止的容器
- docker rmi [image]: 删除一个本地的镜像
- docker start [container]: 启动一个容器
- docker stop [container]: 停止一个容器
- docker inspect [container]: 列出容器的相关信息
- docker attach [container]: 进入一个容器

接下来,我们将用最后一个命令进入到容器里面,并安装Google的深度学习工具包:Tensorflow。

docker attach anaconda

首先安装pip:

apt-get update
apt-get install python-pip python-dev

用pip安装Tensorflow:

export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
pip install --upgrade $TF_BINARY_URL

你也可以继续定制属于你自己的Jupyter(让Jupyter支持更多的语言)。笔者就安装了R和Octave两种语言的kernel。

最后,开启Notebook服务:

jupyter notebook --notebook-dir=your_working_dir --port=8888 --ip=* --no-browser

至此,打开浏览器,开启你的Jupyter之旅吧!

对容器进行更改后,我们需要将其保存为镜像,方便日后的使用。

退出刚才进入的容器(快捷键:Ctrl+P+Q),并执行命令:

docker commit anaconda weitian/myanaconda

即生成了一个名为weitian/myanaconda的镜像(可以用images命令查看)。

我们可以将这个镜像push到docker hub上:

docker login #首次上传需要先登录docker hub
docker push weitian/myanaconda

也可以导出到本地:

docker save -o myanaconda.tar weitian/myanaconda
# 本地加载
docker load --input myanaconda.tar

更多关于Docker的使用介绍可以参见Gitbook上的一本书:Docker —— 从入门到实践