Dockerで構築するJupyter notebookのデータ分析環境

機械学習などでPythonを使ったデータサイエンスの分析環境を構築する場合、WindowsにAnaconda環境を作成しても良いですが、xgboostなど、Win環境では環境構築がしにくい場合もあります。

そんな場合は、Dockerを使うとサクッと必要なライブラリを揃えることができて便利ですよ。

今回は、Dockerを使ってそんな環境を作る手順を説明します。

私の使った環境はWindows10ですが、Macでも問題なくできると思います。(むしろ、Windows10の方が環境構築という意味では罠が多いかも。。)

使用するDockerイメージの説明

Nynumやpandasなど、データサイエンスや機械学習に使えるライブラリやJupyter Notebookの実行環境をパッケージ化してくれているDockerイメージは、Jupyterの公式ページで公開されています。

いくつかイメージがあり、ベースになっているものから、順に、いろいろなライブラリが追加されて、大きくなっていきます。

  • jupyter/base-notebook
  • jupyter/minimal-notebook
  • jupyter/r-notebook
  • jupyter/scipy-notebook
  • jupyter/tensorflow-notebook
  • jupyter/datascience-notebook
  • jupyter/pyspark-notebook
  • jupyter/all-spark-notebook

ちょうど、こんな感じで派生していきます。

イメージ名称と、使われているライブラリについては、このページに詳細が記載されているので、確認して、自分がやりたいことにマッチしているかを確認しましょう。

Jupter notebookの環境を用意する

それでは、DockerでJupter notebookの環境を作ります。

ただ動かすだけでなく、後々、ライブラリを追加したり、作成したnotebookが永続化により残しておけるような、使いやすい環境にしてみようと思います。

まず、全体のフォルダ構成です。

Dockefileはこのように、シンプルなものです。

FROM jupyter/minimal-notebook

EXPOSE 8888

FROM jupyter/minimal-notebookのところに、先ほどのイメージ名称を記述します。今回は、「jupyter/minimal-notebook」を使いました。

Dockerイメージのビルド

Dockerfileを作って配置したら、ルートのディレクトリ(例だとdc_jupyterディレクトリ)で以下のコマンドを打ちます。

これで、イメージの取得とbuildが行われます。my_jupyterは作成するイメージ名ですので、お好きな名前に変更してもOKです。

docker build -t my_jupyter .

さて、次にコンテナを起動するのですが、初回のみ「パスワードの生成」を行います。

パスワードを生成する

のちほど、ブラウザ経由でJupyter notebookを立ち上げるのですが、公式のコンテナを使用すると、その時に「パスワード」の入力を求められます。

このパスワードは「sha1」形式でコンテナ起動時に渡す必要があるので、そのためのパスワードを生成しておきます。

幸いなことに、dockerは、一時的にコンテナを立ち上げる方法がありますので、それを使います。

以下のコマンドを入力して、コンテナを立ち上げます。

–rmオプションがついているので、コンテナは終了後、すぐに削除されます。

なお、my_jupyterが上記でbuildしたイメージ名であることに注意しましょう、

docker run -it --rm my_jupyter /bin/bash

これで、匿名コンテナに、bashで入ることができます。

そこで、以下のコマンドを打って、sha1形式のパスワードを生成します。

python -c 'from notebook.auth import passwd;print(passwd())'

すると、パスワードの入力を促されるので、2回入力します。

こんな感じになるはずです。

jovyan@ae166a89c02f:~$ python -c 'from notebook.auth import passwd;print(passwd())'
Enter password:
Verify password:
sha1:9526426cdbc3:a62c9b7ecd466f0ce4953d12bbxxxxx88525d56e

9526426cdbc3:a62c9b7ecd466f0ce4953d12bbxxxxx88525d56eの部分がsha1形式のパスワードです。

これは、自分が入力したパスワードによって異なります。

この文字列はどこかにコピーしておきましょう。のちほど使いますので。

終わったら

exit

で、コンテナを抜けると、この一時的なコンテナは破棄されます。

Jupyter notebook用のデータ分析用コンテナを立ち上げる

いよいよ、Jupyter notebookを使えるコンテナを立ち上げます。

以下のようなコマンドを打ちます。

「\」の部分は、見やすさのために改行していますが、実際には改行せずに、1行で入力します。

docker run --user root -e GRANT_SUDO=yes \
  -e TZ=Asia/Tokyo -d -p 8888:8888 --name con_jupyter \
  -v /d/docker_jupyter/jupyter:/home/jovyan/work \
  my_jupyter start-notebook.sh \
  --NotebookApp.password='sha1:9526426cdbc3:a62c9b7ecd466fxxx25d56e'

いくつか、説明をしておくと、

--name con_jupyterの部分は起動するコンテナ名なので、ご自由に設定して構いません。

-v /d/docker_jupyter/jupyter:/home/jovyan/workの部分は、ファイルの永続化のために指定しています。

永続化しておかないと、コンテナをstopした後、せっかく作成したnotebookやモデルなどが消えてしまいますので、ホスト側のフォルダと共有しているわけです。

「:」より前の/d/docker_jupyter/jupyterがホスト(Windows)側のディレクトリ、後ろの/home/jovyan/workがコンテナ内部のディレクトリです。

公式イメージでは、デフォルトで「jovyan」が作成され、それがnotebookの使用ユーザとして使われます。

そのユーザのhomeディレクトリ配下にnotebookなどが作られます。

my_jupyterは元になるイメージ名です。上記でbuildしたイメージ名を指定します。

最後の'sha1:9526426cdbc3:a62c9b7ecd466fxxx25d56e'は、自分で先ほど生成したsha1形式のパスワードを指定します。

JUpyter notebookを使ってみる

コンテナの起動に成功したら、ブラウザで「http://localhost:8888」にアクセスしてみましょう。

このようなが画面が表示されましたか?

この画面で、sha1化する前のパスワードを入力すれば、ログインできます。

以下のような画面になって、Jupyter notebookが使えるはずです。

pipによる追加インストールなどのカスタマイズの方法

公式のイメージを使うと、最初からいろいろなライブラリがインストールされていて便利ですが、本格的に機械学習を進めていくと、どうしても、他のライブラリをインストールしたくなります。

そういったときには、Jupyter notebookからインストールしてもいいんですが、コンテナ立ち上げのたびにそういうことしたくないですよね。

そんな時に、最初に出てきたDockerfileに追記すると便利です。

ここに、pipコマンドを記載しておけば、必要な追加ライブラリをインストール済のイメージを作成できます。

例えば、こんな感じで。

FROM jupyter/minimal-notebook

RUN pip install 'ggplot==0.6.8'

COPY setup.sh /usr/local/bin/start-notebook.d/
RUN chmod +x /usr/local/bin/start-notebook.d/setup.sh

EXPOSE 8888

また、公式イメージには、「Hook」という便利な機能があり、/usr/local/bin/start-notebook.d//usr/local/bin/before-notebook.d/に「.sh」の拡張子のファイルを置いておくと、コンテナ起動時に自動で実行してくれます。