ローカル環境でJupyter Notebookを動かすときの俺的ベストプラクティス


# 2016/8/5追記

紹介したDocker Image https://hub.docker.com/r/jupyter/notebook/ はDeprecatedとなってしまったようです・・・ https://github.com/jupyter/docker-stacks を使えということなので、ちょっと試してみて書き換えようと考え中


Jupyter Notebookは簡単に処理を試したり、試した経過を簡単に記録しておけたりするので、お仕事だけでなく、社会人博士での活動の上でも、なくてはならない存在です。

ただ一方で、Jupyterは現在もがんがん開発が進んでいる状態ですので、より改善されたバージョンを常に追わねばならず骨が折れます。
個人的には、どのバージョンからどのバージョンへアップデートするかとかを気にするのはツラいので、Dockerを使って**Jupyter Notebookがイチからインストールされた状態をDocker Imageとして保ちたい**ところです。そうすれば、コンテナの状態そのものには気をつかわず、Notebookファイルや関連するリソースのみに気をつかえばよくなるはず・・・

適当なサーバにDockerをインストールしてJupyter Notebookを起動しておいてもよかったのですが、ネットワーク接続がない環境でも使えるようにしたかったので、ローカル環境にDocker ToolboxをインストールしてJupyter Notebookを動かすことにしました。これが結構楽だったのでメモ。

# TL;DR

1. 最新のJupyter Notebookを使い続けるには、Docker上で[Jupyter公式のDocker Image](https://hub.docker.com/r/jupyter/notebook/)を使うのがよさげ
2. ローカルでDockerを簡単に使うには、[Docker Toolbox](https://docs.docker.com/toolbox/overview/)のQuickstart Terminalを使うのがよさげ

# ローカルへのDocker Toolboxのインストール

ローカル環境でのDockerの実行は、自分は[一昔前](http://qiita.com/yacchin1205/items/a422e4e130ef92457390)はVirtualBoxインストールしてvagrantでboot2dockerしてみたいなことをしましたが、今はDocker Toolboxのインストーラ一発でできるのでクッソ楽です。

ということで、[Docker Toolbox](https://www.docker.com/products/docker-toolbox)のページからインストーラをダウンロード・実行します。自身はWindows環境、Mac環境ともに特につまづいたポイントはない感じでしたが、以下を参考に・・・。

- [Mac OS X へのDockerのインストール方法](http://qiita.com/hshimo/items/e24b1fbfbf775ec7c941)
- [Windows10マシンにDocker Toolbox を入れて個人用の開発環境を作る](http://qiita.com/osuo/items/99a2b7413ce75f8217be)

インターフェースは、自分は特にこだわりはないので **Docker Quickstart Terminal** を使うようにしています。Docker Toolboxをインストールして、Quickstart Terminalを起動したら、[whalesay](https://hub.docker.com/r/docker/whalesay/)を実行してみてコンテナが起動できることを確認します。

```
$ docker run docker/whalesay cowsay boo
 _____
< boo >
 -----
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/
```

[Moby Dock](https://blog.docker.com/2013/10/call-me-moby-dock/)は業務ですさんだ心を癒してくれますね。

# ローカルDockerでのJupyter Notebookの起動

Jupyterのイメージはいろいろあるわけですが、今後もメンテされ続けると期待できそうなものとしては、[Jupyter公式のDocker Image](https://hub.docker.com/r/jupyter/notebook/)が、シンプルですが最も使いまわしがしやすそうな感じです。
次点として、 https://github.com/jupyter/docker-stacks もありますが、ツールが豊富にインストールされているイメージを含む代わりに、仕様が管理しきれている感じではなく、継続的に使うには怖い感じがあります。

自分がコンテナに与えているパラメータは以下のような感じ。

- コンテナ名 ... `jupyter`
- Jupyter Notebookを起動するポート ... `8888`
- Notebookディレクトリ ... Notebookファイル(.ipynb)などを保存するローカル環境のディレクトリを絶対パスで指定する
    - Macの場合: ローカルのファイルパスをそのまま記述できる
    - Windowsの場合: 例えばCドライブのユーザーフォルダならば `/c/Users/` みたいな感じで指定できる

Quickstart Terminalで以下のようにタイプすればJupyter Notebookが起動します。

```
$ docker run -d --name jupyter -p 8888:8888 -v Notebookディレクトリ:/notebooks jupyter/notebook:4.2.0
```

> 現在のところ、Docker ImageのTagはJupyterのバージョンを明示する(`4.2.0`など)のがよさそう。
> `latest`だと起動してくれなかったり、`stable`だと`4.2.0.dev`が起動したりとちょっと怪しげ・・・

これで起動完了。`http://DockerホストVMのIPアドレス:8888` をブラウザで開けばJupyter Notebookを使うことができます。

なお、DockerホストVMのアドレスは、Quickstart Terminalを開いた時のメッセージで知るのが一番楽かもしれません。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/9bee13a1-dccf-502d-bfd1-74bb3356ef02.png)

この場合は `http://192.168.99.100:8888` をブラウザで開けば、Notebookのリストが現れます。
[New]メニューからNotebookを作ることができ、Notebookのファイルは、先に指定したNotebookディレクトリに保存されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/28770/7781d26b-70a7-55ea-826d-091792de2467.png)

## コンテナの停止・再開

Jupyterの使用を終えて、コンテナを停止する場合は、コンテナ名を指定して`docker stop`すればOK。

```
$ docker stop jupyter
```

コンテナを再開する場合は以下のようにする。

```
$ docker start jupyter
```

## コンテナの削除

Jupyterコンテナを削除する場合は、コンテナ名を指定して`docker rm`すればOK。
このコンテナにインストールしたパッケージなどの情報もあわせて削除される。

```
$ docker rm jupyter
```


# Jupyterイメージのカスタマイズ

Jupyter NotebookイメージはUbuntu 14.04ベースなので、例えばnumpyがほしければ、Notebookのセルに `!apt-get update && apt-get install -y python-numpy` とか書いて実行すればインストールできます。
ただ、例えば公式のDocker Imageのバージョンが上がって、新たに最新Docker Imageで起動するなどとした場合、改めてnumpyをインストールする必要があります。こんな場合は、 Dockerfileを書いて、公式Docker Imageをベースに独自のDocker Imageを作って管理するのがよいかもしれません。

例えば、 https://github.com/yacchin1205/research-notebook/blob/master/Dockerfile のように、公式イメージを`FROM`とし、自分が必要とするパッケージをインストールするようなDockerfileを書いておき、このファイルがあるディレクトリで、

```
$ docker build -t yacchin1205/research-notebook .
```

とかすれば、

```
$ docker run -d --name jupyter -p 8888:8888 -v Notebookディレクトリ:/notebooks yacchin1205/research-notebook
```

とするだけで、独自Docker ImageをベースとしたNotebookを実行することができるようになります。
[Docker Hub](https://hub.docker.com/)をつかえば、この辺の管理がもっと楽になると思いますが、ここでは説明は割愛・・・

# まとめ

こんな感じで、作業に必要なJupyter Notebookの環境をDockerfileで定義して、ローカル環境上で起動し、業務や計算処理に使っています。Jupyter Notebookのバージョンが上がってもこの形なら追い続けられるかなと。

また、Docker Imageに作業環境をまとめてあるので、同じ作業環境をもうちょっとリッチなクラウド上のマシンで起動する、みたいなことも簡単にできるので、ローカルでは手狭となったら割と簡単に移せるかなと。

そんな感じで、Jupyter Notebookを活用していろいろかしこく回していきたいですね、というところで。