Docker とは

Docker というアプリケーションの名前を聞いたことがある人も多いと思います。エンジニアにとってはすでに当たり前の技術となっていますが、実はデータ分析者にとっても便利なツールなのです。

Docker はコンテナと呼ばれるアプリケーションの実行環境(仮想環境)を提供します。例えば以下のようなアプリケーションがコンテナとして提供されています。

  • データベース
    • PostgreSQL
    • MySQL
    • SQL Server
  • ウェブサーバー
    • Apache
    • Nginx
  • アプリケーションサーバー
    • Rails
    • ASP.NET Core
  • 分析ツール
    • RStudio
    • Jupyter
    • TensorFlow

もちろん上記以外にもいろいろなコンテナが公開されているし、自分で作ることもできます。

コンテナによる分析環境の作成

自分の作業用マシンにこのようなアプリケーションをインストールしている分析者も多いでしょう。 macOS ユーザーであれば Homebrew を使えば導入も簡単だし、 Docker なんていらないのでは、と思うかもしれません。しかし、作業用マシンにインストールしているうちに、ソフトウェアの依存関係がわからなくなったり、設定ファイルをいじっているうちに環境が壊れてしまった、といった経験はないでしょうか。 Docker のコンテナは、このような問題を解決してくれます。

コンテナは独立した仮想環境を提供してくれます。 Docker のコンテナは、 Dockerfile と呼ばれる設定ファイルによって、必要なソフトウェアをインストール・設定したイメージを作成し、そのイメージを立ち上げることによって作成されます。つまりイメージを起動するたびに、必要なソフトウェアがインストール・設定された新しい仮想環境を得ることができます。これによって、設定ファイルをいじって環境を壊してしまったり、依存関係がわからなくなるといった問題がなくなります。

また、 Docker のイメージはレジストリーと呼ばれる共有サーバーを経由して、チームメンバーと共有することもできます。サーバーと聞くと難しく感じるかもしれませんが、 DockerHub という Docker が提供している SaaS もありますし、 Azure、 AWS、 GCP といった各種パブリッククラウドもレジストリーサーバーのマネージドサービスを提供しています。

ワークフロー例

実際の分析案件で考えてみましょう。

Docker のない世界

案件がはじまり、 CSV のデータを預かりました。これを扱いやすいようにデータベースに投入します。普段から R で作業しているため必要なライブラリーがインストールされており、すぐ分析作業にとりかかることができます。

プロジェクトが終わり、顧客も満足して追加発注をもらい、メンバーも増員することができました。そこで新しいメンバーにこれまでのデータと分析コードを共有し、まずは追試してもらうことから始めようとしました。しかし新しいメンバーは分析初心者で、データベースや R に慣れていません。

フォローしようと一緒に実行してみても、エラーが発生し動きません。これは必要なライブラリーが入ってないからだと、一つ一つライブラリーをインストールしていきました。必要なライブラリーが全て揃ったはずなのに、やはり動きません。色々調べてみると、どうやらデータベースの設定が自分と異なっていたからでした。

環境が異なると困るので、共有データベースを構築して作業を進めることにしました。しばらくは問題がなかったのですが、分析が進み、複雑な分析を行うようになると、自分の SQL の結果がなかなか返ってこないということがしばしば起こります。どうやらメンバーが重い SQL を実行している模様です。

しばらくして SQL の結果に再現性がなくなってきました。なぜだろうと思って調査していると、なぜか不思議なことにデータベースのデータ数が変わっています。どうやら新人がついうっかり DELETE 文を発行してしまったデータを削除してしまったみたいです。泣く泣くデータの再投入を行い、データが変わった時点から分析を再実行します。

その後もいろいろ発生した問題を解決しながらプロジェクトを進められるようになりました。ある時顧客から、分析を内製化するために、これまでの作業手順書が欲しいと言われました。アドホックに分析すればよいと思っていたので、ドキュメントは特に用意していなかったため、必要なライブラリーの再調査をまた行うことになりました。

プロジェクトが終わり、後始末としてデータを削除します。ローカルのデータやスクリプトを削除し、構築したデータベースを削除し、お疲れ様でした。後日、試行錯誤していた際に別のフォルダーにバックアップしていた案件のデータが出てきたのは内緒ですよ。

Docker のある世界

案件がはじまり、 CSV のデータを預かりました。これを扱いやすいようにデータベースや分析環境を設定したイメージを作成し、コンテナ上で分析を行います。イメージのビルドの試行錯誤で時間がかかりました。

プロジェクトが終わり、顧客も満足して追加発注をもらい、メンバーも増員することができました。そこで新しいメンバーにこれまでのデータと分析コードを共有し、まずは追試してもらうことから始めようとしました。新しいメンバーにイメージを共有し、コンテナを立ち上げてもらうことですぐに分析に取りかかることができました。共有したコードも問題なく実行できて安心です。

コンテナを実行している環境も独立させているため、一方の作業が他方の作業を阻害することもありません。データをうっかり消してしまっても、コンテナを立ち上げれば元通りです。

ある時顧客から、分析を内製化するために、これまでの作業手順書が欲しいと言われました。コンテナを作成する際の Dockerfile やコードに、必要なライブラリー等が含まれているため、環境のセットアップから実行までの手順書はすぐに用意することができました。

プロジェクトが終わり、後始末としてデータを削除します。 Docker の作業コンテナとイメージを削除し、イメージをビルドする際のフォルダーを削除し、お疲れ様でした。

まとめ

Docker があると、メンバーが増えるなど、他の人と環境を共有するのが容易です。また、各々独立したコンテナ環境ができるので、作業のコンフリクトも起こりづらいです。最初のイメージ作成は多少時間がかかってしまいますが、一度環境が整えばあとは簡単です。

コンテナを作成するための手順はコードという形で残り、再度セットアップするのも難しくありません。コンテナに分析環境の一切合切が集約されるため、後始末も簡単です。

Docker はデータ分析者にとっても便利なツールです。環境が共有されると、分析の再現性も担保することができます。最初はとっつきづらく、学習に時間を要するかもしれませんが、慣れるとその学習コスト以上のメリットを享受することができるはずです。ぜひ触ってみてください。