WindowsでKaggleのDocker Imageを導入して環境構築

手元のwindowsのノートブックにKaggleのDocker Imageを使って手軽に環境構築しようとした際に詰まった部分を備忘として記録します。

基本的に「[天色グラフィティ](https://amalog.hateblo.jp/entry/data-analysis-docker)」の記事を参考にしていますので、まずこちらを参照し、OSがwindowsのWin10 Pro以外かつDocker toolboxをお使いの場合は参考になるかと思います。


##つまずいた点①　docker-composeのyamlの実行がvolume nameのエラーでうまくいかない
上記の記事の通りdocker-composeのyamlファイルを作成したら、エラーになりました。

```
version: "3"
services:
  jupyter:
    build: .
    volumes:
      - $PWD:/tmp/working
    working_dir: /tmp/working
    ports:
      - 8888:8888
    command: jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/38264263-54d8-0c26-4068-040ac9e80e33.png)
「volume name is too short, names should be at least two alphanumeric characters」というエラーが出てきます。[調べてみた結果](https://gist.github.com/DQNEO/c7c68f8f6e06eb4cfa9e#gistcomment-2114149)、yamlファイル中のvolumesの環境変数の表記が`$PWD`は変数ですが、手元の環境ではうまく動かず、`${PWD}`とPWD（現在のディレクトリパスを取得する）コマンドを実行するようにした方がうまくいくようです。
そのため`$PWD:/tmp/working`ではなく`${PWD}/tmp/working`の方でうまくいきました（Docker初学者のため、より詳細の理由についてはコメント頂ければ幸いです。）


##つまずいた点②　ブラウザでDockerに接続できない
`docker-compose up --build`で修正したyamlファイルで実行すると、kaggleの分析環境でjupyter notebookが立ち上がった状態でうまくコンテナをビルトできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/59d86ff5-3671-67c5-d0f7-70e6c381eef5.png)
しかし、ブラウザで「http://localhost:8888/?token=XXXX」
をURLで入力してDockerの8888ポート経由でjupyter notebookに接続しようとしてもうまくいきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/72bbc720-dc4d-fa3d-e2d7-7e40a8b39ea5.png)
Docker toolboxの場合、直接localhost(ローカルホスト)に接続できず、Docker Toolboxで動かしている仮想マシンのIPアドレスを取得してURLにlocalhostの代わりに入力する[工夫](https://qiita.com/jusotech10/items/b292ac38197926fc6afa)が必要です。

```
> docker-machine ip default
192.168.XX.XX
```
するとうまくjupyter notebookに接続することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/c5a7bcb0-a30d-a9ee-0a19-df34472cacb3.png)

##つまづいた点③　ホストOSのディレクトリへのマウントがうまくできない
前述のyamlファイルの`volume`の部分はマウントするディレクトリを表していますが、実は自分の環境においては、マウントがうまくいかずホストOS（ローカル）とVM上のディレクトリが同期しませんでした。
調査した結果以下が原因であることがわかりました。

1. Oracle VirtualBoxのフォルダ共有設定がなされていない
2. docker側のVMのブートファイル（boot2docker.iso）のバージョンがdocker toolboxのインストール時に一緒にインストールされたVirtualBoxのバージョンと一致していない。

1.は「Oracle VM VirtualBox マネジャー」を立ち上げ、現在使用しているdocker machine VMの
詳細>共有フォルダ>新規共有フォルダを追加する>自動マウント・永続化にするにチェックすることで、マウントができます。windows向けのdocker toolboxはVirtualBoxを経由しているため、このような設定をしないとdockerのコマンドが効果を持ちません。
**VM VirtualBoxアイコン**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/1a93e9a5-c240-95f4-ea0a-ba7141b1ed10.png)
**VM VirtualBoxマネジャー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/9fb088c5-f9ae-16f4-71aa-c3cc76077edf.png)
**VM詳細の共有フォルダー設定ウィンド**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328424/3cc9673f-b77a-0f0e-f99d-5a26f9c2538d.png)
ところが、1.について設定しても、マウントがうまくいきませんでした。原因は最初にインストールしたVirtualBoxのバージョンとDockerのVMのブートファイルのバージョンが一致しなかったことが原因です。（なぜこうなったかは不明）
ブートファイルを現状のVirtualBoxのバージョンに合わせて変えるのもできますが、私はVirtualBoxを最新のバージョンにインストールしなおし、同時にブートファイルも更新しました。
ブートファイルは、`C://Users/{ユーザー}/.docker/machine/cache/boot2docker.iso`として格納されています。このファイルは[**ここ**](https://github.com/boot2docker/boot2docker/releases?after=v18.09.7)で入手できます。
VirtualBoxのバージョンは、ヘルプ>VirtualBoxについてで確認することができ、[**ここ**](https://www.virtualbox.org/wiki/Download_Old_Builds_5_2)でインストーラーをダウンロードできます。
ブートファイルを置き換え、VirtualBoxの再インストールを実施し、古いdocker VM machineをVirtualBoxマネジャーにて削除を行います。Docker Quick Start Terminalを起動すると、自動的にブートファイルに基づき、新たなdocker用のVMを立ち上げてくれます。
細かいことですが、ブートファイルのバージョンとVirtualBoxのバージョンの違いはそのまま、ホストOSのマウントに使用するGuestAdditions.isoのという設定ファイルのバージョン違いになり、マウントがうまくいかない原因になります。

## つまづいた点④ jupyter notebookを毎回立ち上げたくない
Docker imageに基づきyamlファイルでDockerコンテナを作成しましたが、コンテナを立ち上げるごとにjupyter notebookが立ち上げるコマンドが入っていますので、その都度コンテナとともにjupyter notebookが立ち上がってしまいます。その時下記のようなコマンドでコンテナを立ち上げ、アタッチすることで、実質前述のyamlファイルの設定において、jupyter notebookを立ち上げない以外は同様な設定でコンテナにアクセスできます。

```
docker run -t -i --name {コンテナ名} -p 8888:8888 -v $PWD:/tmp/working:/tmp/working -w /tmp/working {Dockerイメージ名} /bin/bash
```
もろもろinstallやディレクトリを作成したのち、`jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
`でjupyter notebookを立ち上げて使うこともできます。同様に上のdockerコマンドにあったyamlファイルを作って実行することもできます。（ここでは割愛します）
参考までによく使うdockerコマンドを下に記します。

```docker
#VMを立ち上げる
docker-machine start {VM名}
#現在作成されているイメージ一覧
docker images
#現在作成されているコンテナ一覧
docker ps -a
#上記で確認したコンテナを名称ないしIDでスタートする
docker start {コンテナ名/コンテナID}
#スタートしたコンテナにアタッチする
docker attach {コンテナ名/コンテナID}
#VMを終了する
docker-machine stop {VM名}
#不要なイメージを削除する
docker rmi {イメージ名/イメージID}
#不要なコンテナを削除する
docker rm {コンテナ名/コンテナID}
```

##最後に
手軽に市販のwindowsのノートブックで分析してみたいが、環境を汚したくない場合、Dockerはすごく便利なソフトウェアです。それを一般的なWindows 10 Home Editionで導入した際につまづいた点をまとめました。参考になれば幸いです。