Dockerを利用したデータ解析環境の構築

データ解析に長らく関わってくると、解析環境の複製をしたくなります。 例えば、デスクトップマシンAで行っていた解析を、デスクトップマシンBでも再現したい! という場面に出くわします。 その際に活躍するのが、dockerやvagrantというソフトで代表される仮想化技術です。 PythonのバージョンやOSの種類を揃える手間を、肩代わりし、 設定ファイルとして維持する事が可能になります。

本ページでは、 dockerを利用した仮想環境の調達・移植方法について、 実例を交えて解説してゆきます。 Dockerを利用することで 本来のデータ解析に専念できます。

対象読者

本題に移る前の断り書きとして述べますと、 本ページから得られるものは、

といった要望を充足するための情報です。

また、dockerの運用に際し、

が好ましいとされます。 予めご了承いただくようお願い申し上げます。

Dockerの概観

端的に言うとdockerとは、アプリケーションの仮想実行を支援するシステムです。 マシン設定/環境設定をコードとして記述し他者に渡すことができ、 そのコードをもとに環境構築が自動化できるため、 使用感からすれば、仮想化技術を提供するツールです。

Dockerの特徴に関する解説はTech Basics「Docker」および【Docker入門】コンテナ型仮想化技術Dockerを使ってみた 、既存の仮想化技術との相違に関する解説は超入門Docker:第1回 Dockerとは - @IT、dockerの提供するアプリケーションシステムに関する議論はコンテナを使う動機 なぜDocker(コンテナ)が期待されるのかが詳しいです。

Dockerの実用例

以下のコンテンツでdockerの運用例を紹介していきます。


Dockerインストールから試運用まで on Windows10 desktop machine

データ解析のための仮想環境調達を目的とし、 Windowsマシンにてdockerが利用可能となるまでの道筋を実例とともに説明します。ここでのゴールは、 dockerでJupyter notebookサーバーを立ち上げることです。

Dockerのインストール

Docker Toolboxからdockerを利用可能にする手順を説明します。 というのも、Docker Toolboxを利用して設備をそろえるのが、 マシンプラットフォーム的に汎用性のある方法だからです。 Install Docker Toolbox on Windowsのページ内リンクから Docker Toolbox.exe を入手し、 セットアップウィザードを実行します。 セットアップウィザードのデフォルトチョイスに従えば設定部分の失敗はないはずです。

脱線気味の補足ですが、 dockerのインストールにおける代替案を提示します。 Windows10 Pro/education edition利用者は、 Hyper-V(Windowsに搭載されているハイパーバイザー)が使えるため、 インストール時の選択肢が広がります。 Docker CE for Windowsのページ内リンクから InstallDocker.msi を入手する方法でも dockerを利用可能になれます。 こちらの導入手順の詳細は、 無償の「Docker for Windows」で手軽にLinuxコンテナを利用する が詳しく解説しています。

docker_engineの起動

Dockerのインストール後は、 実際にdockerのAPIを叩いて動かすことになります。 コマンドプロンプト/ターミナルから操作しましょう。 ですがdockerのAPIを利用するには、 docker_engine(dockerのdaemon)が起動している必要があります。 その起動方法は次の2つです。

前者は自動でよしなにやってくれます。後者のコマンド実行例は次の通りです。

  $ cd "/c/Program Files/Docker Toolbox"
  $ start.sh

いずれの方法も、 dockerのマスコットキャラクター(クジラ)のアスキーアートが 通常出力されればOKです。実際は次のように出力されると思います。



                          ##         .
                    ## ## ##        ==
                 ## ## ## ## ##    ===
             /"""""""""""""""""\___/ ===
        ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
             \______ o           __/
               \    \         __/
                \____\_______/

  docker is configured to use the default machine with IP 192.168.99.100
  For help getting started, check out the docs at https://docs.docker.com

  Start interactive shell

それでも心配な人にのために、 dockerが本当に利用可能であるかどうかは、 docker statsdocker imagesで docker_engineに関するエラーが返ってくるか否かで判断できます。 参考までに、dockerのdaemonが起動していないために 返ってくるエラー出力の例を示します。

$ docker stats
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/version: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

これではdockerでやりたいことができません。

セクションの最後に、dockerのdaemonの終了方法を示します。 手順は次の通りです。

  1. C:\Program Files\Oracle\VirtualBoxをパスに追加し、VBoxManage CLIを叩けるようにする
  2. VirtualBox上の、dockerホストに対応するVirtualMachineのidを入手する
      $ VBoxManage list runningvms
      "default" {33286eb8-93e0-4db8-96eb-97d7f087335f}
    
  3. VirtualMachineの電源をオフするUsage: VBoxManage controlvm <uuid|vmname> poweroff
      $ VBoxManage controlvm 33286eb8-93e0-4db8-96eb-97d7f087335f poweroff
      0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    

また、dockerと同時にインストールされるはずの Oracle VM VirtualBox Manager にアクセスし、 起動している仮想環境を”電源オフ”状態にすることによっても、 dockerのdaemonを終了させることができます。 この操作は必須ではありませんが、 dockerホストマシンの起動時および ベースマシンのシャットダウン時の警告を 出なくするために有用です。

DockerのJypyter notebookイメージの使用

Dockerの設備が揃ったら、dockerのAPIをCLIから叩いてゆきましょう。 ゴールは、データ解析のための仮想環境を調達し、 Jupyter notebookサーバーを立ち上げることでした。

次の3つのコマンドを覚えていただきます。 それは、docker pulldocker rundocker rmです。 これらのコマンドの概観を、操作の流れとともに説明します。 Dockerイメージとして公開されている既存のアプリケーションを 手元のマシンに落とし(docker pull)、 dockerイメージからDockerコンテナを生成し アプリケーションとして走らせ(docker run)、 dockerコンテナを削除する(docker rm) という流れです。

ここでdockerイメージとは、 Dockerfileをソースにdocker buildした生成物であり、 その生成物の頒布のために最適化されたファイルシステムです。 また、dockerコンテナとは、 dockerイメージをdocker runすることで生成するアプリケーションです。 Dockerコンテナとしての頒布は考えられないため、 dockerコンテナは使い捨てる覚悟で使用するのが基本です。

以降より操作の実例に移りますが、断り書きとして一言。 ここで紹介するコマンドはすべて、 管理者権限#でコマンドを実行していることにご注意ください。 (interactive shellの表示上は一般ユーザー$扱いだと思います。 特にdockerホストを仮想環境上に立ち上げないdocker実行環境では、 以下のコマンドでは権限の関係で処理されない場合があります。)

まずは、dockerイメージをネット上から引っ張ってきます。 コマンドは次の通りです。 Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]

  # docker pull jupyter/datascience-notebook:latest

docker pullはdockerイメージを直接入手するため、 手元でDockerfileからdockerイメージをビルドする必要がなく、 とりかかりもスムーズです。 コマンド実例として用いたjupyter/datascience-notebookは、 ubuntu16.04をベースに Conda Python 3.x environmentとJupyter Notebook 5.0.xで 環境が構築されています。 そのため汎用性とカスタマイズ性が素晴らしいです。 というのも、

といった特長があるからです。 jupyter/datascience-notebookの詳細は、 jupyter/datascience-notebook on DockerHub および jupyter/datascience-notebook on GitHub をご覧ください。

次に、docker runします。docker runは、dockerイメージをベースにdockerコンテナを生成するコマンドです。コマンドは次の通りです。 Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  # docker run -it -p 8888:8888 --name notebook-server-1 jupyter/datascience-notebook /bin/bash

このコマンドでエラーが帰らなければ、 “notebook-server-1”と命名されたdockerコンテナ内のbashに操作が移ります。 この中で作業を進めましょう。 Dockerコンテナ内からもとのinteractive shellに戻るには、 exitとタイプし実行するか、 ctrl+dを打鍵しましょう。

さて、当初の目的である、jupyter notebookサーバーの立ち上げを行います。 その手順は2つ、 dockerコンテナ内でjupyter notebookコマンドを与える方法と、 docker runのargumentで直接サーバーを走らせる方法です。 後者の場合は、

  # docker run -it -p 8888:8888 --name notebook-server-2 jupyter/datascience-notebook start-notebook.sh --NotebookApp.token=''

などのcommand line argumentでdockerコンテナを立ち上げることがあります。 前者も後者も、IP設定がデフォルトの場合なら、 ブラウザで192.168.99.100:8888にアクセスすると notebookサーバーに接続できます。

最後に、動かしていたdockerコンテナを消去します。 この操作を行わないと、新規dockerコンテナが立ち上がらない場合があります。 コマンドは次の通りです。 Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]

   # docker rm notebook-server-1 notebook-server-2

また、最初から使い捨てを想定するならば、docker run時に--rmというオプションを付けることで、’docker rm’の手間が省けます。

  # docker run -it -p 8888:8888 --rm --name notebook-server-3 jupyter/datascience-notebook /bin/bash

Docker無償版をダウンロードしたい場合に見るページです。

親切なことに本家がチュートリアルを用意しています。 Dockerは利便性が高く参入しやすい技術基盤を提供しながら、 ユーモラスな側面(Dockerに出てくるcowsayってなに?) も持ち合わせています(?)。 我々もそうありたいものです。

話題として、docker_engineの起動 が近いです。 ここでは、ローカルマシン上でdockerを利用する際の操作を説明しており、 docker-machineAPIを活用する操作を紹介しています。 複数のdockerホストの立ち上げを自動化したい場合、 このページの説明がすごく参考になります。


まとめ

本ページでは、データ解析におけるdockerの積極的な利活用を提案しました。 具体的な内容としては、dockerをローカルマシンで利用するための手順を示しました。 Dockerはマルチプラットフォームで動くアプリケーションを開発する人が良く利用している印象を持ちます。 ですが、上述のような利用法もあるため、 データサイエンティストにとっても有益なツールだと捉えています。

皆様のdocker活用の一助となることを喜ばしく思います。