Docker Tool BoxによるJupyter環境の作成 ～2.Jupyter Notebookの起動～



前回書いた以下の記事でwindowsにてdockerを使う環境を作ることができた
[Docker Tool BoxによるJupyter環境の作成 ～1.Windowsへの導入～](https://qiita.com/daisuke19891023/items/0d4ba8792247eddb02e1)

docker環境ができたのでいよいよjupyterを使う準備をしていきたいと思う
準備することは主に以下の3点

 - virtual boxの設定
 - dockerイメージの取得
 - dockerコンテナの起動

# 1.virtual boxの設定

最初にやっておくと楽なのがvirtual boxの設定を変えておくこと。後々ネックになるのが以下の二点
 - メモリ　→大量データを読み込む際にメモリ不足となる可能性がある
 - 共有ディレクトリのマウント　→作成した分析ファイルが消えてしまうのを防ぐためにローカルとマウントする

## 1.1.メモリの増設

dockerに割り当てられるメモリが規定だと1GBとなっているので、もっと増やしたい場合に実施。
やり方としてはvirtualboxの設定を変えるだけ
docker tool boxをインストールするとvirtual boxも勝手に入るので、検索窓からvirtual boxを起動

するとすでにdefaultという名前で仮想マシンが起動しているので、まずはこれを停止する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188827/df2835ab-414b-f305-dcc0-503bc4fe69d5.png)


停止すると、設定→システムでメモリの量を変えることができる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188827/c2f4b8be-7eb9-6cf3-ceff-0e21cf732e6e.png)

docker起動時にメモリ割り当ての量をオプション指定できるが、そもそも仮想マシンへのメモリ割り当てが少ないと分けられるだけのメモリがなくなってしまうので、この段階でメモリを増やしておく

## 1.2.共有ディレクトリのマウント

dockerのディレクトリとローカルのディレクトリをマウントしておくと、
docker、jupyter上で作ったファイルがローカルに残ることになる。
筆者の場合は不意にdockerやPCが落ちてしまった際にjupyter上で作っていた
ファイルが消し飛ぶことが何度もあったが、この設定をしておくとファイルを守ることができる

手順は以下の記事を参考にしました

[Docker toolbox on windows マウント：Dockerコンテナの中でホストのフォルダを見たい](https://qiita.com/hnishi/items/db10505e36c95587851d)

やることとしては、virtual boxの設定→共有フォルダで現在共有フォルダ設定済みの一覧を見ることができる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188827/74d71d88-a403-1c0d-27b8-6d1083f1c974.png)

右側にある追加ボタンを押すと、共有フォルダとして追加することができる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188827/f769ee99-68ce-3020-6189-ed1e2d70e12b.png)

これで仮想マシンとローカルマシンのマウントはできたので、
次はdocker上での設定を実施するためんいdocker tool boxにて以下のコマンドを実施

※c:\work\jupyterというローカルディレクトリをjupyterという名前で仮想マシンにマウントしていますので、`jupyter`の部分は自身のマウントしたディレクトリに読み替えてください

jupyterというfolderを作成

`$ docker-machine ssh default 'sudo mkdir -p /jupyter'`

マウントを実施
`docker-machine ssh default 'sudo mount -t vboxsf -o uid=0,gid=0 jupyter /jupyter'`

これでdockerコンテナをRunする際に上記を指定するとローカルとマウントした状態とすることができる

# 2.dockerイメージの取得

jupyter notebookをすぐ使うことができるdockerイメージがあるので、それをダウンロードに挑戦してみる

dockerイメージの種類は以下の記事がキチンとまとめているので参照していただきたい。
[JupyterのDockerイメージまとめ](https://qiita.com/kshigeru/items/ea174d6bcacc474f2a51)

手元でkaggleに挑戦するという前提だと分散昨日はいらないので、
以下のイメージをダウンロード（PCで画像処理するのもきついから本当はtensorflowもいらないのだけど、将来を見据えて）

`$ docker pull jupyter/tensorflow-notebook`

イメージは4GB以上あるので、しばし待つ必要がある

イメージを取得できたかは以下のコマンドで確認できる

    $ docker images
    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    jupyter/tensorflow-notebook   latest              590112b8736d        2 months ago        4.95GB

この状態まできたらいよいよdockerを起動することができるようになる

# 3.dockerコンテナの起動

以下のコマンドでdockerコンテナを起動することができる

docker run -d --name jupyter_work -v "/jupyter:/home/jovyan/work" -m 3g -p 8888:8888 jupyter/tensorflow-notebook:latest

色々オプション指定しているが、意味としては以下の通り

## -d デタッチドで起動

dockerをバックグラウンドで動かすためのオプション
http://docs.docker.jp/engine/reference/run.html#detached-vs-foreground

## --name コンテナ名を指定
後からコンテナに対していろいろ操作を行いたい場合、勝手に振られるコンテナIDを使用するよりもコンテナ名を指定した方が何かと楽。
今回は`jupyter_work`という名前を使用

## -v マウントを指定
dockerコンテナのディレクトリとローカル側（仮想マシン）のディレクトリをマウントする

`ローカル側のディレクトリ:dockerコンテナのディレクトリ`で対応を指定できる
今回ローカル側は上記までの手順で作成したディレクトリ、docker側はjupyterのホームディレクトリを指定

## -m メモリ指定
使用するメモリの量を指定。今回は大盤振る舞いで3GBを指定

## -p　ポートの指定

使用するポートを指定する。jupyterは基本的に8888を使うことが多い

http://docs.docker.jp/engine/reference/run.html#detached-vs-foreground

## イメージ名を指定
dockerコンテナを作る元となるイメージを最後に指定。
コンテナ名：タグ名で指定するので、今回は以下のものを指定することになる
jupyter/tensorflow-notebook:latest

## 起動の確認
起動に成功した場合、dockerプロセスが存在するので
`$ docker ps`で起動中のプロセスを確認できる

    $ docker ps
    CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
    5b45d59d5291        jupyter/tensorflow-notebook:latest   "tini -g -- start-no…"   2 hours ago         Up 2 hours          0.0.0.0:8888->8888/tcp   jupyter_work

また、ログ確認して正しく動いていることを確認

    $ docker logs jupyter_work
    /usr/local/bin/start-notebook.sh: ignoring /usr/local/bin/start-notebook.d/*

    Container must be run with group "root" to update passwd file
    Executing the command: jupyter notebook
    [W 04:18:43.422 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
    [I 04:18:43.482 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.6/site-packages/jupyterlab
    [I 04:18:43.482 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
    [I 04:18:43.500 NotebookApp] Serving notebooks from local directory: /home/jovyan
    [I 04:18:43.500 NotebookApp] The Jupyter Notebook is running at:
    [I 04:18:43.500 NotebookApp] http://(5b45d59d5291 or 127.0.0.1):8888/
    [I 04:18:43.501 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

ログに表示されるURLをブラウザでたたけばいよいよjupyterを使うことができる。
しかしながら、ちなみにログに表示されるIPアドレスだとアクセスができないとのこと。
実は別のIPアドレスが開いているとのこと
以下参考記事
[TensorFlowのDockerのJupyterが動かない](https://endoyuta.com/2016/10/31/tensorflow-docker-jupyter/)

IPアドレス部分を上記サイトのコマンドに切り替えたことでjupyterの画面を開くことができる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188827/9c98d3ff-1aa3-e4db-923f-095af922350a.png)

ここまでできれば後は市井に転がっている手順でデータ分析を実施することができるようになりますので、
ぜひ楽しいデータサイエンスライフを過ごしてください１