Jupyter の Docker イメージを使ってみる

【更新】Jupyter 5 系のアップデート版の記事が別にあります。

- [JupyterのDockerイメージまとめ - Qiita](http://qiita.com/kshigeru/items/ea174d6bcacc474f2a51)

-----

[IPython](http://ipython.org/)はバージョン4.0から [Project Jupyter](http://jupyter.org/) に統合されるようになりました。JupyterはPythonだけでなく、R, Julia, Scalaからも使えるようになり、データ分析の核となるツールと言えます。40を超えるプログラミング言語から使えるだけでなく、[Jupyter Notebook Viewer](http://nbviewer.jupyter.org/) を介して共同作業を促したり、Apache Spark と統合することも可能です。ちょっと [SciPy Stack](http://www.scipy.org/stackspec.html#stackspec) を試してみようかな、と思って IPython Notebook を使う世代とは一線を画すものになっています。

これまでは[NumPy](http://www.numpy.org/)や[pandas](http://pandas.pydata.org/)と言えばインストールが大変な印象でしたが、Jupyterは複数のDockerイメージを用意してくれていますので、比較的簡単に試すことができます。ブラウザで完結したい、という場合は [Try Jupyter!](https://try.jupyter.org/) のサイトですぐに試してみることも可能です。

## Notebookサーバーの起動

公式のDockerイメージを使ってNotebookサーバーを起動します。基本的には [jupyter/datascience-notebook](https://hub.docker.com/r/jupyter/datascience-notebook/) が良いと思いますが、Sparkを使う場合は [jupyter/all-spark-notebook](https://hub.docker.com/r/jupyter/all-spark-notebook/) か [jupyter/pyspark-notebook](https://hub.docker.com/r/jupyter/pyspark-notebook/) のどちらかが良いでしょう。
イメージには多くのパッケージが予めインストールされており、4.5GBくらいあります。ダウンロードの待ち時間でインストールされているパッケージを一通り眺めてみるのが良いでしょう。


```bash
$ docker pull jupyter/datascience-notebook
$ docker images jupyter/datascience-notebook
REPOSITORY                     TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
jupyter/datascience-notebook   latest              8e21bfc3eeba        11 hours ago        4.592 GB

```

8888番ポートを使ってコンテナを起動します。

```bash
$ docker run -d --name notebook -p 8888:8888 jupyter/datascience-notebook
```

ブラウザでアクセスすると IPython Notebook よりキレイになった感じのインターフェイスを確認できます。「New」を押してみると複数の選択肢が登場することで期待感が高まるかもしれません。

![スクリーンショット 2015-09-24 21.35.10.png](https://qiita-image-store.s3.amazonaws.com/0/37996/96196da6-6361-e0ac-3b45-80c14072b999.png "スクリーンショット 2015-09-24 21.35.10.png")

## Python のノートブック

色々使えるとは言っても、既存資産の流用という観点からは Python が主流になるでしょう。
Python 3 の各種モジュールが利用できることを確認しておきます。まずは[Bokeh](http://bokeh.pydata.org/en/latest/index.html)を使って sin/cos カーブを描いてみます。

![スクリーンショット 2015-09-24 21.48.01.png](https://qiita-image-store.s3.amazonaws.com/0/37996/da6e257a-cba8-47d7-6e2c-5cd10d989b9c.png "スクリーンショット 2015-09-24 21.48.01.png")

次に、pandasのモジュールを使ってYahoo!のAPIから日経平均を取得してみます。グラフの軸に日本語が使っても文字化けしないことも確認しておきましょう。

![スクリーンショット 2015-09-24 21.57.36.png](https://qiita-image-store.s3.amazonaws.com/0/37996/c37d036f-d4a4-bef2-ef42-ebdfb5d512df.png "スクリーンショット 2015-09-24 21.57.36.png")

## R のノートブック

普通にRを書くならRStudioの方が使いやすいとは思いますが、チームでノートブックを共有したりサーバーサイドでクラスタを組む可能性も視野に入れると、Jupyterの使い方に慣れておいた方が良いと言えます。また、環境によってパッケージがインストールされている・いない、あるいはインストールできる・できないという環境差異を吸収する意味でも有用でしょう。

なお、カーネルを切り替えると右上のロゴも切り替わってくれます。複数の環境を行き来する場合には重宝する機能だと思います。

![スクリーンショット 2015-09-24 22.23.46.png](https://qiita-image-store.s3.amazonaws.com/0/37996/9f1b5872-9e02-486a-6b49-1060be40f0ad.png "スクリーンショット 2015-09-24 22.23.46.png")

## データのアップロード

Jupyter Notebook になってからなのか、IPython Notebook のときからだったか分かりませんが、データファイルをアップロードすることも可能です。Docker経由で起動するとデータコンテナとリンクさせる方法に難儀する場合があるかもしれません。しかし、「Upload」ボタンを使うとローカルファイルシステムにあるデータをアップロードできます。もちろん、クライアントとサーバーが別々のマシンで動作している場合にも便利です。

![スクリーンショット 2015-09-24 22.30.14.png](https://qiita-image-store.s3.amazonaws.com/0/37996/b2a71e0c-420c-42f1-efc3-84b7d12a27ad.png "スクリーンショット 2015-09-24 22.30.14.png")

アップロードしたファイルはどの言語のノートブックからでも参照できます。試しにカーネルをJuliaにして確認してみます。あまり違いが無いかもしれませんが、右上の言語表示が Julia 0.3.2 になっています。

![スクリーンショット 2015-09-24 22.48.20.png](https://qiita-image-store.s3.amazonaws.com/0/37996/30ed53f5-b643-c22c-5686-e37498574df4.png "スクリーンショット 2015-09-24 22.48.20.png")

カーネルがどの言語であってもプリントプレビューやMarkdownでのダウンロードなどが可能です。簡易レポートとして分析結果を記録しておく手段としても有用と言えそうです。

## パッケージのインストール

ターミナルを起動してパッケージをインストールすることも可能です。たとえば、`pip` を使って *xlsxwriter* をインストールしてみます。

![スクリーンショット 2015-09-24 23.11.53.png](https://qiita-image-store.s3.amazonaws.com/0/37996/af377ece-efba-37e6-d5cb-44af282acd5f.png "スクリーンショット 2015-09-24 23.11.53.png")

## まとめ

公式のDockerイメージを使って Jupyter Notebook サーバーを起動し、Python, R, Julia が動作することを確認しました。イメージをダウンロードするには時間がかかりますが、複数ソフトウェアのバージョン不一致に起因するトラブルもなく、非常に簡単に導入できると思います。

組織やメンバーのスキル、あるいは分析手法によって異なる実行環境とデータストレージを用意するのは骨が折れると思いますが、Jupyter に統合しておくことで管理コストを低減することができるかもしれません。出力形式もおおよそは統一されますので、記録手段としても有用そうです。