機械学習などで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」の拡張子のファイルを置いておくと、コンテナ起動時に自動で実行してくれます。