DockerコンテナでPython3、Jupyterの入ったデータ分析環境を作成する

# TL;DR
データ分析コンペに参加した時に、[爆速で Docker コンテナにデータ分析環境を生成するテンプレート を作りました](https://qiita.com/takahi-i/items/12fd6016cd83e8ca1c8d)を利用してDockerコンテナにJupyter notebookが使える環境構築をしたのでその手順についてまとめました。めちゃくちゃ早く環境構築ができるのと、Dockerコンテナを利用することで環境の再現性が出る等のメリットがあります。

# cookiecutterでプロジェクトディレクトリの作成

cookiecutterのインストール

```shell
$ pip install cookiecutter
```

プロジェクトディレクトリの作成

```shell
$ cookiecutter git@github.com:docker-science/cookiecutter-docker-science.git
project_name [project_name]: xxxxxxxxxx
project_slug [national_park_prediction]: national_park_prediction
jupyter_host_port [8888]: 8888
description [Please Input a short description]: This repository is for predicting the number of accumdation in national park
Select data_source_type:
1 - s3
2 - nfs
3 - url
Choose from 1, 2, 3 [1]: 1 # AWSのS3を使用する
data_source [Please Input data source]: s3://project/national_park_prediction/data # S3のデータ格納ディレクトリ
Select use_nvidia_docker:
1 - no
2 - yes
Choose from 1, 2 [1]: 1 # GPUは使用しない
```

プロジェクトディレクトリが作成されていることを確認

```shell
$ ls
Makefile			config				docker				national_park_prediction	requirements.txt		tests
README.md			data				model				notebook			scripts
```

# Dockerイメージ作成・コンテナ起動・修正

作成されたディレクトリでDockerfileからimageの作成、コンテナの起動を行います。
requirements.txtをみるとわかるように、デフォルトでは必要最低限のPythonモジュールをインストールする設定なので必要に応じて追記を行ってimageを作成する必要がありそうです。

イメージの作成

```shell
$ make init-docker

docker build -t national_park_prediction-image -f docker/Dockerfile --build-arg UID=501 .
Sending build context to Docker daemon  20.48kB
Step 1/10 : FROM ubuntu:16.04
...
...
...
Successfully built ade3fb3ef298
Successfully tagged national_park_prediction-image:latest
```

イメージが作成されていることを確認

```shell
$ docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
national_park_prediction-image   latest              2e8a7ad94a6a        9 seconds ago       797MB
```

```shell

# コンテナ起動・自動ログイン
$ make create-container
docker run -it -v `pwd`:/work -p 8888:8888 --name national_park_prediction-container national_park_prediction-image
docker@187ca128cd75:/work$ 
```

コンテナ内にプロジェクトディレクトリがマウントされている

```shell

$ ls
Makefile  README.md  config  data  docker  forecast_tourist_accomdation_in_national_park  model  notebook  requirements.txt  scripts  tests
```

コンテナ内でPythonモジュールをインストールした場合、Dockerfileにも反映をさせて、再度イメージファイルを作成して環境の再現性を保つようにしましょう。例えば、モデル作成に利用したxgboostをコンテナ上でインストールした場合、下記のようにrequirements.txtに追記してビルドを行い、そのイメージファイルを元に再度コンテナを起動します。

``` requirements.txt
awscli
click
matplotlib
jupyter
notebook
Sphinx
flake8
xgboost
```

起動中のコンテナを表示

```shell
$ docker ps
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS              PORTS                    NAMES
187ca128cd75        national_park_prediction-image   "/bin/bash"         8 days ago          Up 8 days           0.0.0.0:8888->8888/tcp   national_park_prediction-container
```
対象のコンテナを停止

```sh
$ docker stop 187ca128cd75
187ca128cd75
```
イメージの削除

```sh
$ make clean-docker
docker rm national_park_prediction-container
national_park_prediction-container
docker image rm national_park_prediction-image
Untagged: national_park_prediction-image:latest
Deleted: sha256:2e8a7ad94a6a4e75cbd3c67d6a87327108c356bd5add3e5851a9221f45231ad5
・・・
・・・
・・・
```
ビルド

```sh
$ make init-docker
```



# Jupyter notebookの起動
コンテナ上でJupyter notebookの起動を行います。起動後は http://localhost:8888/?token=xxxxxxxxxxxxxxxx にアクセスするとJupyter notebookに入ることができます。
xxxxxの部分はmake jupyterコマンド時に表示されており、下記の例でいうと 7fa9347363b180321b65bac24b900b31d0df6e12a6504fb7 になります。

````shell

$ make jupyter

jupyter-notebook --ip=0.0.0.0 --port=8888
[I 01:04:36.114 NotebookApp] Writing notebook server cookie secret to /home/docker/.local/share/jupyter/runtime/notebook_cookie_secret
[I 01:04:36.435 NotebookApp] Serving notebooks from local directory: /work
[I 01:04:36.435 NotebookApp] The Jupyter Notebook is running at:
[I 01:04:36.436 NotebookApp] http://(187ca128cd75 or 127.0.0.1):8888/?token=7fa9347363b180321b65bac24b900b31d0df6e12a6504fb7
[I 01:04:36.436 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 01:04:36.437 NotebookApp] No web browser found: could not locate runnable browser.
[C 01:04:36.438 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(187ca128cd75 or 127.0.0.1):8888/?token=7fa9347363b180321b65bac24b900b31d0df6e12a6504fb7
```

参考：[爆速で Docker コンテナにデータ分析環境を生成するテンプレート を作りました](https://qiita.com/takahi-i/items/12fd6016cd83e8ca1c8d)