DockerコンテナでPython3、Jupyterの入ったデータ分析環境を作成
背景
データ分析コンペに参加した時に、爆速で Docker コンテナにデータ分析環境を生成するテンプレート を作りましたを参考に、DockerコンテナにJupyter notebookが使える環境構築をしたのでその手順についてまとめました。めちゃくちゃ早く環境構築ができるのと、Dockerコンテナを利用することで環境の再現性が出る等のメリットがあります。
プロジェクトディレクトリ作成
cookiecutterのインストール
$ pip install cookiecutter
プロジェクトディレクトリの作成
$ 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は使用しない
プロジェクトディレクトリが作成されていることを確認
$ ls Makefile config docker national_park_prediction requirements.txt tests README.md data model notebook scripts
イメージ作成・コンテナ起動・修正
作成されたディレクトリでDockerfileからimageの作成、コンテナの起動を行います。 requirements.txtをみるとわかるように、デフォルトでは必要最低限のPythonモジュールをインストールする設定なので必要に応じて追記を行ってimageを作成する必要がありそうです。
イメージの作成
$ 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
イメージが作成されていることを確認
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE national_park_prediction-image latest 2e8a7ad94a6a 9 seconds ago 797MB
# コンテナ起動・自動ログイン $ make create-container docker run -it -v `pwd`:/work -p 8888:8888 --name national_park_prediction-container national_park_prediction-image docker@187ca128cd75:/work$
コンテナ内にプロジェクトディレクトリがマウントされている
$ ls Makefile README.md config data docker forecast_tourist_accomdation_in_national_park model notebook requirements.txt scripts tests
コンテナ内でPythonモジュールをインストールした場合、Dockerfileにも反映をさせて、再度イメージファイルを作成して環境の再現性を保つようにしましょう。例えば、モデル作成に利用したxgboostをコンテナ上でインストールした場合、下記のようにrequirements.txtに追記してビルドを行い、そのイメージファイルを元に再度コンテナを起動します。
awscli click matplotlib jupyter notebook Sphinx flake8 xgboost
起動中のコンテナを表示
$ 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
対象のコンテナを停止
$ docker stop 187ca128cd75
187ca128cd75
イメージの削除
$ 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 ・・・ ・・・ ・・・
ビルド
$ make init-docker
Jupyter notebookの起動
コンテナ上でJupyter notebookの起動を行います。起動後は http://localhost:8888/?token=xxxxxxxxxxxxxxxx にアクセスするとJupyter notebookに入ることができます。 xxxxxの部分はmake jupyterコマンド時に表示されており、下記の例でいうと 7fa9347363b180321b65bac24b900b31d0df6e12a6504fb7 になります。
$ 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