Dockerで持ち運び可能なデータ分析環境(Jupyter)を構築する

# はじめに
データ分析ではライブラリのインストールや管理の問題が多くつきまといます。
またデータ分析の結果をシェアしたい場合にも依存しているライブラリの共有が問題になります。
いわゆる、**「分析はできたけど自分のパソコンでしか動かない」**問題です。

この問題を解決するためにDockerを利用します。
イメージを再利用することで環境構築を容易にしつつ、データ分析環境をシェアできるようにコンテナ化します。


## Docker Image
すでにあるイメージを利用してそれをカスタマイズすることが手っ取り早いと考えられます。
まず要件としては、

* Python3系
* Jupyter Notebook
* pandas
* numpy
* scipy
* matplotlib

などが入っていることが必須条件になります。


## Volume
データを永続化させるためにVolumeを設定する必要があります。
今回はDocuments/notebooksに分析用のコードを配置することにします。
そしてコンテナ上の/home/notebooksにマウントすることでコンテナ内でその分析用コードを利用したり編集します。

## requirements.txt
Documents/notebooksにrequirements.txtをおきます。
もし必要なライブラリが入っていなかった場合に追加でインストールするライブラリを書いておきます。とりあえず試しにseabornを書いておきます。

```
seaborn
```

## Dockerfile
Documents/notebooks上にDockerfileというファイルを作成し、そこに以下の設定を書きます。
ベースのイメージはminicondaを使用し、python環境はintelpython3_fullをインストールします。
具体的にこれらに何が入っているかは後ほど調査します。

```
# Set the base image using miniconda 
FROM continuumio/miniconda3:4.6.14 

# Set environmental variable(s)
ENV ACCEPT_INTEL_PYTHON_EULA=yes

# Set working directory 
WORKDIR /home/notebooks

# Add requirements file 
ADD requirements.txt /app/

# Installs, clean, and update   
RUN apt-get update \
    && apt-get clean \
    && apt-get update -qqq \
    && apt-get install -y -q g++ \ 
    && conda config --add channels intel \
    && conda install  --yes --quiet intelpython3_full=2019.4 \ 
    && conda install jupyter -y --quiet \
    && pip install --upgrade pip \ 
    && pip install -r /app/requirements.txt

# Run shell command for notebook on start 

CMD jupyter notebook --port=8888 --no-browser --ip=0.0.0.0 --allow-root

```

## docker-compose.yaml
Documents/notebooks上にdocker-compose.yamlを作成し、以下の設定を書きます。Volume、portなどの指定を行っています。データベース用のコンテナを追加するときにはこちらに追記していく形で対応できます。

```
version: '3'
services:
  notebook:
    container_name: python_notebook
    labels:
      description: Intel Python 3 using Jupyter Notebooks
      name: jupyter notebook 
    ports:
      - "8888:8888"
    volumes:
      - ~/Documents/notebooks:/home/notebooks
    build: . 
```

##  build
上記の設定でビルドします。結構時間がかかりました。

```
docker-compose build 
```

## run
buildが完成したら動かしてみます。

```
docker-compose up
```

うまく動くとURLが発行されるので、そこにアクセスするとjupyter notebookが開きました。

## 環境詳細
Pythonのバージョンと入っているライブラリは以下のような形になっていました。

> docker exec CONTAINER_ID python --version

```
Python 3.6.8 :: Intel Corporation
```

> docker exec CONTAINER_ID pip list

```
Package                            Version                
---------------------------------- -----------------------
absl-py                            0.7.1                  
asn1crypto                         0.24.0                 
astor                              0.7.1                  
backcall                           0.1.0                  
backports.shutil-get-terminal-size 1.0.0                  
bleach                             2.1.3                  
certifi                            2018.1.18              
cffi                               1.11.5                 
chardet                            3.0.4                  
conda                              4.6.14                 
cryptography                       2.3                    
cycler                             0.10.0                 
Cython                             0.29.6                 
daal4py                            2019.4                 
decorator                          4.3.0                  
entrypoints                        0.2.3                  
funcsigs                           1.0.2                  
gast                               0.2.2                  
grpcio                             1.14.1                 
h5py                               2.8.0                  
html5lib                           1.0.1                  
idna                               2.6                    
intel-tensorflow                   1.13.1                 
ipykernel                          4.6.1                  
ipython                            6.3.1                  
ipython-genutils                   0.2.0                  
ipywidgets                         7.0.0                  
jedi                               0.12.0                 
Jinja2                             2.9.6                  
jsonschema                         2.6.0                  
jupyter                            1.0.0                  
jupyter-client                     5.1.0                  
jupyter-console                    5.1.0                  
jupyter-core                       4.4.0                  
Keras-Applications                 1.0.7                  
Keras-Preprocessing                1.0.9                  
kiwisolver                         1.0.1                  
llvmlite                           0.27.1+0.gf008359.dirty
Markdown                           3.1                    
MarkupSafe                         1.0                    
matplotlib                         3.0.3                  
mistune                            0.8.3                  
mkl-fft                            1.0.13                 
mkl-random                         1.0.4                  
mkl-service                        1.0.0                  
mock                               3.0.5                  
mpi4py                             3.0.0                  
nbconvert                          5.2.1                  
nbformat                           4.4.0                  
notebook                           5.2.2                  
numba                              0.42.1                 
numexpr                            2.6.8                  
numpy                              1.16.2                 
pandas                             0.24.1+0.g1700680.dirty
pandocfilters                      1.4.1                  
parso                              0.2.0                  
path.py                            11.0.1                 
pexpect                            4.2.1                  
pickleshare                        0.7.4                  
pip                                19.1.1                 
prompt-toolkit                     1.0.15                 
protobuf                           3.7.1                  
ptyprocess                         0.5.2                  
pycosat                            0.6.3                  
pycparser                          2.18                   
pyeditline                         2.0.0                  
Pygments                           2.2.0                  
pyOpenSSL                          17.5.0                 
pyparsing                          2.2.0                  
PySocks                            1.6.7                  
python-dateutil                    2.6.0                  
pytz                               2018.4                 
PyYAML                             4.1                    
pyzmq                              16.0.2                 
requests                           2.20.1                 
scikit-learn                       0.20.3                 
scipy                              1.2.1                  
seaborn                            0.9.0                  
setuptools                         39.0.1.post20180504    
simplegeneric                      0.8.1                  
six                                1.11.0                 
SMP                                0.1.4                  
TBB                                0.1                    
tensorboard                        1.12.2                 
tensorflow                         1.13.1                 
tensorflow-estimator               1.13.0                 
termcolor                          1.1.0                  
terminado                          0.8.1                  
testpath                           0.3                    
tornado                            4.5.2                  
traitlets                          4.3.2                  
urllib3                            1.24.1                 
wcwidth                            0.1.7                  
webencodings                       0.5.1                  
Werkzeug                           0.14.1                 
wheel                              0.31.0                 
widgetsnbextension                 3.2.0                  
xgboost                            0.81 
```

要件である、pandas,numpy,scipy,matplotlibなど基本的なライブラリは揃っていることが確認できました。
さらに必要があればrequirements.txtでインストールすることでカスタマイズができます。