Docker で IPython Notebook を動かす


Docker で Python 3.4 を使えるようにして IPython Notebook を動かしてみます。
Python 3.4 に対応し切れていないライブラリもいくつかありますが、徐々に移行は進んでいますので、これから書くなら Python 3.4 が良いでしょう。ライブラリの対応状況は [Python 3 Wall of Superpowers](https://python3wos.appspot.com/) で確認できます。

Docker を使う理由は：

* Python 3.4 を使うときに、一手間かかることもある
* *numpy* や *scipy* などを使うときはインストールが大変なこともある (特にWindows)
* 計算量が増えるときは EC2 でインスタンスタイプを変えられると便利

IPython Notebook でデータ分析を進める理由はこの辺が分かりやすいと思います。

* [不正論文を減らす仕組みがここにある。iPython Notebookで作るデータ資料。 - Qiita](http://qiita.com/nezuq/items/7c4af92ebf4c3152f491)
* [IPython Notebookをアドホック分析環境として使う](http://nbviewer.ipython.org/gist/shunsukeaihara/dc2552453e1272866e2a)
	* nbviewer で表示した例
	* 後半はC拡張の話題になるので、ある程度使っている人向けの内容

# 公開イメージ

Python や IPython の Docker イメージは Docker Hub に登録されていたり、Github で公開されています。まだ決定版が無いような気がしますので、いくつかの `Dockerfile` を読み比べてくると良さそうです。

基本的には Ubuntu ベースで構築されていますが、Python のどのモジュールを使うかで依存する C ライブラリなどが異なります。 大雑把には、 *numpy* などの数値演算を想定したものと、PostgreSQL などのデータベース接続を想定したものがあります。
なお、そもそもの Python のバージョンも２系と３系で異なります。

| レポジトリ | Python | 簡単な説明 |
|:---------|:---------|:--------|
| [ipython/notebook](https://registry.hub.docker.com/u/ipython/notebook/) (Docker Hub) | Python 2.x | IPython notebook in a docker container. |
| [micktwomey/ipython3.4-notebook](https://registry.hub.docker.com/u/micktwomey/ipython3.4-notebook/) (Docker Hub) | Python 3.4 | Docker IPython 2.0 Notebook (micktwomey/ipython3.4) + Python 3.4 (micktwomey/python3.4) image |
| [unfairbanks/docker-ipython-notebook](https://registry.hub.docker.com/u/unfairbanks/docker-ipython-notebook/) (Docker Hub) | Python 2.x | Docker container image capable of running an iPython notebook server |
| [dckc/ipython-docker](https://github.com/dckc/ipython-docker) (Github) | Python 2.x | docker container for ipython notebook |
| [crosbymichael/python-docker](https://github.com/crosbymichael/python-docker) (Github) | Python 2.x | Dockerfile for python on debian |
| [mingfang/docker-ipython](https://github.com/mingfang/docker-ipython) (Github) | Python 2.x | Run IPython, Pattern, NLTK, Pandas, NumPy, SciPy, Numba, Biopython inside Docker |


# 自作イメージと使い方

今回は、自分の勉強がてらと、各ライブラリの最新バージョンを使うために、Docker イメージを手作りして Docker Hub に登録してみました。Github と連携した Automated Build で作成しておくと、イメージのビルドは自動で進めてくれて便利です。

* [skitazaki/python34-ipython](https://registry.hub.docker.com/u/skitazaki/python34-ipython/)

イメージを指定してコンテナを立ち上げると、IPython Notebook が8888番ポートで起動します。 `-p` オプションでホストマシンから転送するポート番号を指定できます。（ここでは、指定方法が分かるようにポート番号を変えています）

```bash
$ docker run -d -p 8080:8888 skitazaki/python34-ipython
```

ホストマシンとファイルを共有したい場合は、 `/notebook` をマウントします。

```bash
$ docker run -d -p 8080:8888 -v $PWD:/notebook skitazaki/python34-ipython
```


ブラウザで8080番ポートにアクセスすると、IPython Notebook が使えるようになっています。


![Home.png](https://qiita-image-store.s3.amazonaws.com/0/37996/4b4572d1-50aa-7f48-d0fb-8051d1f8e1b3.png "Home.png")

「New Notebook」をクリックすると新規にノートブックを作成できます。
*pylab* (※今後は *matplotlib* だけの方が行儀が良いらしい) を有効にし、 *pandas* を使ってグラフを描画できることが確認できます。

![Untitled0.png](https://qiita-image-store.s3.amazonaws.com/0/37996/5281df1a-7255-214e-c272-8cb0aa32d9c3.png "Untitled0.png")

EC2 で起動するときは80番ポートを公開しても良いですし、SSHのトンネリングでも利用できます。対象となるデータに合わせて、セキュリティグループや公開範囲を設定しましょう。

ノートブックの編集が終わったら、HTML 形式で出力することも可能ですし、画面上から Python ソースコードも IPython Notebook のソースコードもダウンロードできます。ピボットテーブルなどでデータの概要を確認してグラフを描く用途には、これで十分なことも多いでしょう。IPython Notebook では Markdown 形式で説明も追加できますので、単なるソースコードよりも管理に便利だと思います。


単なるインタラクティブシェルを使いたい場合は以下のようにコンテナを立ち上げます。

```bash
$ docker run -it skitazaki/python34-ipython ipython
```

Python のライブラリを追加でインストールしたい場合は、コマンドに `/bin/bash` を指定し、`pip3 install {LIBNAME}` でインストールしてください。インストールが終わったら、以下のコマンドで IPython Notebook サーバーを起動できます。

```bash:コンテナ
root% ipython-notebook-startup.sh /notebook
```

# その他

Python の有用なライブラリはこちらにまとめられています。たまに眺めてみると新たな発見があるかもしれません。

* [vinta/awesome-python](https://github.com/vinta/awesome-python)

Docker を使うときはチートシート ([wsargent/docker-cheat-sheet](https://github.com/wsargent/docker-cheat-sheet)) に書いてあるエイリアスを設定しておくと便利です。 `.bashrc`/`.zshrc` などに追記しておきましょう。

```bash:.bashrc
alias dl='docker ps -l -q'
```

Docker の導入編としては以下の記事が分かりやすいと思います。

* [レッツトライ！夏休みに覚えるDocker - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/2322/)
* [Docker向けのコンテナをゼロから作ってみよう - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/2226/)