EnsekiTT Blog

EnsekiTTが書くブログです。

Dockerでデータ分析環境を作るためにJupyter Docker Stacksを使ってみた話

つまりなにしたの?

Jupyter Docker StacksというJupyterを起動できるDockerコンテナを使ってデータ分析環境を立ち上げてみることにした。
f:id:ensekitt:20180726004202j:plain


Jupyter Docker Stacksとは?

Jupyter Docker Stacksは、Jupyterのアプリケーションとブラウザのツール(インタラクティブコンピューティングツールというらしい)
を含むすぐに実行できるDockerイメージのセット。
これを使うとローカルDockerコンテナに個人用Jupyterノートブックサーバを起動できる。
JupyterHubを使ってチームのJupyterLabサーバーを実行したり、Dockerfileをそこから更に作って自分好みにカスタマイズもできる。

Dockerについて

すでにインストール済とする。
docs.docker.com

以降の環境は

Docker CE
Version 18.06.0-ce-mac70 (26399)
Engine: 18.06.0-ce
Compose: 1.22.0
Machine: 0.15.0
Notary: 0.6.1
Credential Helper: 0.6.0
Kubernetes: v1.10.3

でできている。
なお、Dockerのバージョン確認は
f:id:ensekitt:20180725234345p:plain:w300
ここからできる。

どんなスタックがあるのか

ベースはUbuntuでCondaを使って諸々が管理されている。

jupyter/base-notebook

共通的なJupyter Notebookのスタックで他のスタックのベースになっている。
他のスタックで満足できないときはこれをベースに自分で作る用っぽい。
一旦コレで実行例を出してみる。

% docker run -p 8888:8888 jupyter/base-notebook
### 色々ダウンロードして用意してくれる
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(aaaaaaaaaaa or 127.0.0.1):8888/?token=00000000000000000000000000000000000

で実行できた。(ポート番号8888を他のアプリが使っていないようにすること)
トークンをつけずにhttp://127.0.0.1:8888/にアクセスすると
f:id:ensekitt:20180725233654p:plain:w500
こんなページが出てくるので
?token=ここの文字列
をPassword or tokenに入れてログインする。
f:id:ensekitt:20180725233757p:plain:w300
これであとは普通にNotebookを作って開発を始められる。

Pythonのバージョンについて
import sys
print(sys.version)
3.6.5 | packaged by conda-forge | (default, Apr  6 2018, 13:39:56) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)]

こんなバージョンが入っていた。

パッケージについて
!conda info -e

# conda environments:
#
base                  *  /opt/conda

!conda list
# packages in environment at /opt/conda:
#
# Name                    Version                   Build  Channel
alembic                   0.9.9                      py_0    conda-forge
asn1crypto                0.24.0                     py_1    conda-forge
attrs                     18.1.0                     py_1    conda-forge
automat                   0.7.0                    py36_0    conda-forge
backcall                  0.1.0                      py_0    conda-forge
bleach                    2.1.3                      py_0    conda-forge
ca-certificates           2018.4.16                     0    conda-forge
certifi                   2018.4.16                py36_0    conda-forge
cffi                      1.11.5                   py36_0    conda-forge
chardet                   3.0.4                    py36_2    conda-forge
conda                     4.5.8                    py36_1    conda-forge
conda-env                 2.6.0                         0    conda-forge
configurable-http-proxy   3.1.0                   node8_1    conda-forge
constantly                15.1.0                     py_0    conda-forge
cryptography              2.2.1            py36hdffb7b8_1    conda-forge
decorator                 4.3.0                      py_0    conda-forge
entrypoints               0.2.3                    py36_1    conda-forge
gmp                       6.1.2                hfc679d8_0    conda-forge
html5lib                  1.0.1                      py_0    conda-forge
hyperlink                 17.3.1                     py_0    conda-forge
idna                      2.7                      py36_2    conda-forge
incremental               17.5.0                     py_0    conda-forge
ipykernel                 4.8.2                    py36_0    conda-forge
ipython                   6.4.0                    py36_0    conda-forge
ipython_genutils          0.2.0                      py_1    conda-forge
jedi                      0.12.1                   py36_0    conda-forge
jinja2                    2.10                       py_1    conda-forge
jsonschema                2.6.0                    py36_1    conda-forge
jupyter_client            5.2.3                      py_1    conda-forge
jupyter_core              4.4.0                      py_0    conda-forge
jupyterhub                0.8.1                    py36_0    conda-forge
jupyterlab                0.32.1                   py36_0    conda-forge
jupyterlab_launcher       0.10.5                   py36_0    conda-forge
libedit                   3.1.20170329                  0    conda-forge
libffi                    3.2.1                         3    conda-forge
libgcc                    7.2.0                h69d50b8_2    defaults
libgcc-ng                 7.2.0                hdf63c60_3    defaults
libsodium                 1.0.16                        0    conda-forge
libstdcxx-ng              7.2.0                hdf63c60_3    defaults
mako                      1.0.7                      py_1    conda-forge
markupsafe                1.0                      py36_0    conda-forge
mistune                   0.8.3                    py36_1    conda-forge
nbconvert                 5.3.1                      py_1    conda-forge
nbformat                  4.4.0                      py_1    conda-forge
ncurses                   5.9                          10    conda-forge
nodejs                    8.10.0                        0    conda-forge
notebook                  5.6.0                    py36_0    conda-forge
openssl                   1.0.2o                        0    conda-forge
pamela                    0.3.0                    py36_0    conda-forge
pandoc                    2.2.2                         1    conda-forge
pandocfilters             1.4.2                      py_1    conda-forge
parso                     0.3.0                      py_0    conda-forge
pexpect                   4.6.0                    py36_0    conda-forge
pickleshare               0.7.4                    py36_0    conda-forge
pip                       9.0.3                    py36_0    conda-forge
prometheus_client         0.2.0                    py36_0    conda-forge
prompt_toolkit            1.0.15                   py36_0    conda-forge
ptyprocess                0.6.0                    py36_0    conda-forge
pycosat                   0.6.3                    py36_0    conda-forge
pycparser                 2.18                       py_1    conda-forge
pygments                  2.2.0                      py_1    conda-forge
pyopenssl                 18.0.0                   py36_0    conda-forge
pysocks                   1.6.8                    py36_1    conda-forge
python                    3.6.5                         1    conda-forge
python-dateutil           2.7.3                      py_0    conda-forge
python-editor             1.0.3                    py36_0    conda-forge
python-oauth2             1.0.1                    py36_0    conda-forge
pyzmq                     17.1.0           py36hae99301_0    conda-forge
readline                  7.0                           0    conda-forge
requests                  2.19.1                   py36_1    conda-forge
ruamel_yaml               0.15.44          py36h470a237_0    conda-forge
send2trash                1.5.0                      py_0    conda-forge
setuptools                40.0.0                   py36_0    conda-forge
simplegeneric             0.8.1                      py_1    conda-forge
six                       1.11.0                   py36_1    conda-forge
sqlalchemy                1.2.10                   py36_0    conda-forge
sqlite                    3.20.1                        2    conda-forge
terminado                 0.8.1                    py36_0    conda-forge
testpath                  0.3.1                    py36_0    conda-forge
tini                      0.18.0               h470a237_1    conda-forge
tk                        8.6.8                         0    conda-forge
tornado                   5.1                      py36_0    conda-forge
traitlets                 4.3.2                    py36_0    conda-forge
twisted                   17.5.0                   py36_0    defaults
urllib3                   1.23                     py36_0    conda-forge
wcwidth                   0.1.7                      py_1    conda-forge
webencodings              0.5                      py36_0    conda-forge
wheel                     0.31.1                   py36_0    conda-forge
xz                        5.2.3                         0    conda-forge
yaml                      0.1.7                         0    conda-forge
zeromq                    4.2.5                hfc679d8_3    conda-forge
zlib                      1.2.11               h470a237_3    conda-forge
zope.interface            4.5.0            py36h470a237_0    conda-forge

確かに分析系のパッケージは入っていなくてNotebookをインストールしたままのような感じ。

jupyter/minimal-notebook

base-notebookにくわえてNotebookの文書変換のためのPandocとTeX Liveや
git、emacs、jed、vim、unzipが更に入っているみたい。
コレでもまだ分析環境とは言えない。

jupyter/r-notebook

R言語が扱えるNotebookを作ることができる。
もちろんプロットに必要なパッケージや分析に使えるRandomforestなども入っているみたい。
Rで分析を行うときはこれを立ち上げれば良い。

jupyter/scipy-notebook

Pythonの分析環境としてNotebookを作ることができる。
Pandas,numpy,scipy,scikit-learn,scikit-image,matplotlibなどPythonをデータ分析言語たらしめるものたちが入っている。
bokehやseabornなどのきれいな可視化ツールもあるのでそのまま素敵なNotebookが作れる。
baseでRequsetsも入っていてBeautifulSoupもこれに含まれているので、スクレイピングもできる様子。

jupyter/tensorflow-notebook

みんな大好きDeepLearning用のNotebookを作ることができる。
NvidiaDockerではないっぽいのでGPUは使えない。scipy-notebookに加えてTensorFlowとKerasが使える。

jupyter/datascience-notebook

Pythonのscipy-notebook, r-notebookに加えてJuliaの環境が追加される。
データ解析何でも来いってかんじのNotebook。僕は欲張りなので普段遣いはこれにしようと思った。

jupyter/pyspark-notebook

scipy-notebookに加えてPythonをサポートしたApacheSpark、Hadoopが含まれている。
あまり大きなデータを扱ったことがなかったのでSparkを使ったことが無いけど、
だからこそこういうNotebookから使ってみるのが良さそう。

jupyter/all-spark-notebook

pyspark-notebookに加えてRやScalaもサポートしている。
Spark関連全部のせっぽい。使いこなせる気がしない。

作業を開始・中断・再開する方法

% docker run -p 8888:8888 jupyter/base-notebook
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
# Ctrl+Cでコンテナを落として中断する。

# 落ちているコンテナを確認
% docker ps -a
docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS               NAMES
30fe4575a2b1        jupyter/base-notebook   "tini -g -- start-no…"   3 minutes ago       Exited (0) 51 seconds ago                       xenodochial_lewin

# 作成されたイメージを確認
 % docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jupyter/base-notebook          latest              786c009bc5ad        4 days ago          718MB

# コンテナを再開する
## ファイルが残っていることを確認する。新たに立ち上げると別の環境になるのでstartを使う
 % docker start -a xenodochial_lewin
Completing containers
xenodochial_lewin  30fe4575a2b1  --       6 minutes, jupyter/base-notebook

環境を削除する方法

Docker削除の手順と同じで、

# コンテナを停止する
Ctrl+c

# コンテナを削除する
## 停止済みプロセスを確認して削除
## Notebook等は別途バックアップしないとここで消える
 % docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                     PORTS               NAMES
30fe4575a2b1        jupyter/base-notebook   "tini -g -- start-no…"   8 minutes ago       Exited (0) 6 seconds ago                       xenodochial_lewin
 % docker rm xenodochial_lewin

# イメージを削除する
## 当分使わないなと思ったImageを削除する。
## base-notebookを使わなくなったけどdatascience-notebookに入れ替えるならほとんど共用なので消さないほうが良い
 % docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
jupyter/base-notebook          latest              786c009bc5ad        4 days ago          718MB
% docker rmi jupyter/base-notebook:latest

おわりに

これで自分の環境を汚さずに一通り環境を作って作業できる状態になりました。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。