boot2dockerでIPython Notebook環境構築


# 2016/6/5追記

今は Docker Toolbox と Jupyter Notebook を使うのがよさげなので書きました。[ローカル環境でJupyter Notebookを動かすときの俺的ベストプラクティス](http://qiita.com/yacchin1205/items/efaa498ca68e7c169015)

# はじめに

データ解析とかの作業を日常的にやるようになってきていて、都度都度Pythonコードを書いているわけですが、案の定（自分のスペック的に）細かいコードが散らかってきてあとでどれを何に使ったのかわからなくなるわけです。

そこでIPython Notebookに関心が。院生の時に、データ解析のプログラムとそこから得られた分析結果をいっしょに並べておけば、プログラムへの理解補助になってうれしいんじゃない？みたいな話をやっていて、これをお手軽に実現できそうだなと。そんな流れで試してみたメモ。

#目標

Windows環境でさっくりIPython Notebook環境を作って試す。
気持ちとしては、

* Windows上に直接環境を作ってしまうと、後々パッケージを追加したくなった際にWindows固有のことで大変な目に遭いそう
* IPython NotebookのDockerコンテナは色々あるみたいだしうまく活用しながらやりたい

ということで、

1. Windows環境にboot2docker仮想環境を作る
    * boot2docker仮想環境とホストWindows環境のファイルはできるだけ簡単に共有する
2. boot2docker仮想環境上にIPython Notebookコンテナを作る
    * boot2docker仮想環境を介してホストWindows環境のファイルもできるだけ簡単に共有する

みたいなやり方を考えてみる。

#使うもの

* すでに手持ち環境にインストール済み
    * [VirtualBox](https://www.virtualbox.org/) 4.3.12
    * [Vagrant](http://www.vagrantup.com/) 1.6.5
    * [vagrant-multi-putty](https://github.com/nickryand/vagrant-multi-putty) 1.4.4 ... Windows環境でVagrantいじるときにすごくうれしい
* 今回使ってみるもの
    * [dduportal/boot2docker](https://vagrantcloud.com/dduportal/boxes/boot2docker) ... [mitchellh/boot2docker](https://vagrantcloud.com/mitchellh/boxes/boot2docker) がvboxsfに非対応っぽかったのでこっちを。参考：http://qiita.com/sudahiroshi/items/ecd5a81d923b6d9c2672
    * [skitazaki/python34-ipython](https://registry.hub.docker.com/u/skitazaki/python34-ipython/) ... 参考：http://qiita.com/kshigeru/items/c7e2326c094d47647508

#作り方

作業フォルダは `C:\test\boot2docker-vboxsf` とする。

###boot2docker仮想環境の作成

1. 作業フォルダで `vagrant init` する

    ```
    > vagrant init dduportal/boot2docker
    A `Vagrantfile` has been placed in this directory. You are now
    ready to `vagrant up` your first virtual environment! Please read
    the comments in the Vagrantfile as well as documentation on
    `vagrantup.com` for more information on using Vagrant.
    ```
    dduportal/boot2dockerを利用するためのVagrantfileが作業フォルダに生成される。

2. Vagrantfileのネットワーク設定を書き換える
    今回はboot2docker環境をポートフォワードではなく、ホストからのアクセス限定で利用することとし、今回は `192.168.33.11` を振ってみる。
    もともとコメントアウトされている箇所を以下のように変更。

    ```ruby:Vagrantfile
    # Create a private network, which allows host-only access to the machine
    # using a specific IP.
    config.vm.network "private_network", ip: "192.168.33.11"
    ```

3. 作業フォルダで `vagrant up` して仮想環境を作成、起動する

    ```
    > vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    ==> default: Importing base box 'dduportal/boot2docker'...
    ==> default: Matching MAC address for NAT networking...
    ==> default: Checking if box 'dduportal/boot2docker' is up to date...
    ==> default: Setting the name of the VM: boot2docker-vboxsf_default_1412262151282_87930
    ==> default: Fixed port collision for 2375 => 2375. Now on port 2200.
    ==> default: Fixed port collision for 22 => 2222. Now on port 2201.
    ==> default: Clearing any previously set network interfaces...
    ==> default: Preparing network interfaces based on configuration...
        default: Adapter 1: nat
        default: Adapter 2: hostonly
    ==> default: Forwarding ports...
        default: 2375 => 2200 (adapter 1)
        default: 22 => 2201 (adapter 1)
    ==> default: Running 'pre-boot' VM customizations...
    ==> default: Booting VM...
    ==> default: Waiting for machine to boot. This may take a few minutes...
        default: SSH address: 127.0.0.1:2201
        default: SSH username: docker
        default: SSH auth method: private key
        default: Warning: Connection timeout. Retrying...
    ==> default: Machine booted and ready!
    ==> default: Checking for guest additions in VM...
    ==> default: Configuring and enabling network interfaces...
    ==> default: Mounting shared folders...
        default: /vagrant => C:/test/boot2docker-vboxsf
    ```
    最後のメッセージのように、boot2docker仮想環境上の `/vagrant` がホストの `C:\test\boot2docker-vboxsf` と自動的に共有される。

これでboot2docker環境の起動完了。`vagrant putty` とかすると仮想環境にSSHできる。

```console
Using username "docker".
Authenticating with public key "imported-openssh-key"
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 1.2.0
             master : e75396e - Fri Aug 22 06:03:48 UTC 2014
docker@boot2docker:~$ ls -la /vagrant
total 5
drwxrwxrwx    1 docker   staff            0 Oct  2 15:02 ./
drwxr-xr-x   17 root     root           400 Oct  2 15:03 ../
drwxrwxrwx    1 docker   staff            0 Oct  2 15:02 .vagrant/
-rwxrwxrwx    1 docker   staff         4951 Oct  2 15:02 Vagrantfile
docker@boot2docker:~$
```

ディレクトリ `/vagrant` から `C:\test\boot2docker-vboxsf` の内容が見えていて、変更が互いに反映されることを確認。

###IPython Notebookコンテナの起動

boot2dockerにIPython Notebookコンテナを作ってみる。
ここでは、

* `C:\test\boot2docker-vboxsf\notebook` (`/vagrant/notebook`) がIPython Notebookのデータディレクトリとして機能するようにする
* IPython Notebookのポートは `8080`

としてみる。boot2docker環境上で以下のコマンドを実行する。

```console
docker@boot2docker:~$ mkdir /vagrant/notebook
docker@boot2docker:~$ docker run -d -p 8080:8888 -v /vagrant/notebook:/notebook skitazaki/python34-ipython
Unable to find image 'skitazaki/python34-ipython' locally
Pulling repository skitazaki/python34-ipython
...
3f1228b888bd: Download complete
(コンテナID)
docker@boot2docker:~$ 
```

これで、IPython Notebookコンテナの `/notebook` として、boot2docker環境内の `/vagrant/notebook` が対応づき、これにWindowsホストの `C:\test\boot2docker-vboxsf\notebook` が対応づく形になる。
特にエラーなどなければこれで起動は完了。念のため `docker ps` とかして、コンテナが実行されていることを確認。

###動作確認

ブラウザから `http://192.168.33.11:8080` にアクセスしてみる。

![ipythonnotebook.png](https://qiita-image-store.s3.amazonaws.com/0/28770/28fd89ab-854d-43a3-9742-fea8022fbdda.png)


ここでNotebook(たとえばHello)を作ると、`C:\test\boot2docker-vboxsf\notebook` に `Hello.ipynb` ができていることが確認できる。
また、解析対象のデータなどはこのフォルダ以下に置いておけば、適宜Notebook中のPythonコードから読み込むことができる。


あらためて、boot2dockerお手軽だなと。しばらくこの環境で遊んでみます。