2017年12月6日

Oracle対応アプリケーションのDockernize事始め

本エントリはJPOUG Advent Calendar 2017 Day6の記事です。

普段はPostgreSQLのブログなのですが、今回はスピンオフ企画(番外編)として、先日のJPOUGのイベント「JPOUG in 15 minutes #6」で発表した「Oracle対応アプリケーションのDockernize事始め」の内容をブログエントリとしてお送りします。(Oracleネタを書くブログが無いので・・・)

なお、資料は公開していますので、興味のある方はそちらも併せてどうぞ。

■なぜ今さら「Docker」か、という前口上


既にDockerに十分触れている方、慣れている方には釈迦に説法になるかと思いますが、なぜ最近になってDockerに着目して使うようになったのか、ということからお話しようと思います。

私がDockerを使い始めたのは、実は先日のJPOUGのイベントでのセッションが決まってからです。なので、片手間に触り始めてからまだ数ヶ月と言ったところです。

ずっと興味は持っていたのですが、自分が普段使っている環境が長いことRHEL6/CentOS6系だったこと、Dockerでどうしても使ってみたいことが無かったので、なかなか手を動かして試してみるところまで到達しませんでした。

そういう状況ではあったのですが、春先に自分が開発しているツールをオープンソースとして公開したあたりから、少し状況が変わってきました。
オープンソースとして開発する際、さまざまなフレームワークやライブラリに依存した開発をすることがあります。そうなると、動作させるためにはそれらを整えた環境を構築する必要があります。

しかし、環境構築も、自分が慣れている技術スタックならまだしも、不慣れなスタックを整備するのは技術的のみならず心理的障壁も高くなります。また、特にデータベースエンジニアや基盤系エンジニアの方だと、「不要なものは自分の環境に入れたくない(環境を汚したくない)」という心理も働くと思われ、そうなると公開したツールを試してもらうのもなかなか難しくなります。(簡単に試せないものを紹介する側も気が引けますし)

というわけで、環境をカプセル化して簡単に試してもらうにはDocker化してみるのがいいのでは、と考えたのが、今回Dockerに触ってみる動機になったのでした。

■HecatoncheirのDocker化


というわけで、HecatoncheirのDocker化を試みます。

Hecatoncheirはデータベースから情報を収集してレポジトリに保存するクライアントツールと、レポジトリの情報を公開するサーバから構成されています。

そして、それらのツールはさまざまなPythonライブラリと、Oracle DatabaseのクライアントライブラリであるOracle Instant Clientに依存しています。

これらをDocker化し、コマンド一発で数分以内に利用できるようにするところまでを目指します。

目標は以下の通りです。
  • コマンド一発で数分で利用可能に
  • 収集したレポジトリのデータは残せるようにする(永続化可能にする)

■Dockerイメージ化する


イベントの時とは説明の順序が違いますが、Dockerイメージ化してみます。イメージ化するためにはDockerfileと呼ばれる定義ファイルを作成します。このファイルで、Dockerイメージに何を含めるかを決めます。

プレゼンの際には抜粋したDockerfileでしたが、全体は以下のようになっています。
FROM centos:7
MAINTAINER Satoshi Nagayasu <snaga@uptime.jp>

#ADD oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm /tmp
#ADD oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm /tmp

ENV ORACLE_HOME=/usr/lib/oracle/12.2/client64
ENV LD_LIBRARY_PATH=$ORACLE_HOME/lib
ENV LANG=C

# pip
RUN yum install -y gcc python-devel
RUN curl -o get-pip.py https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py; rm get-pip.py

# Oracle support
RUN yum install -y libaio unzip
RUN rpm -ivh https://s3-ap-northeast-1.amazonaws.com/uptime-dev01/oracle/oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
RUN rpm -ivh https://s3-ap-northeast-1.amazonaws.com/uptime-dev01/oracle/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
#RUN rpm -ivh /tmp/oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
#RUN rpm -ivh /tmp/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

# PostgreSQL support
RUN rpm -ivh https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
RUN yum install -y postgresql10-devel

# MySQL support
RUN rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
RUN yum install -y mysql-community-devel

# Hecatoncheir
RUN curl -O https://codeload.github.com/snaga/Hecatoncheir/zip/develop; unzip develop
RUN cd Hecatoncheir-develop; pip install -r requirements.txt; pip install .
また、Dockerfileの作成・更新は、以下のような流れで行っていました。

今回はベースイメージをCentOSにしましたので、Dockerfileは最低限以下の内容から始まります。
FROM centos:7
MAINTAINER Satoshi Nagayasu <snaga@uptime.jp>

docker buildでイメージが作成できて、docker run /bin/bash で起動や動作に問題がないことが確認できたら、少しずつコンテンツを追加していきます。

今回イメージを作成する際、最初はOracle Instant ClientのRPMファイルをローカルに置いてrpm -iしていたのですが、Githubで管理する場合には50MB以上のファイルは置けないため、s3にファイルを置いてHTTP経由で直接rpm -iするように切り替えました。
#ADD oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm /tmp
#ADD oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm /tmp

# Oracle support
RUN rpm -ivh https://s3-ap-northeast-1.amazonaws.com/uptime-dev01/oracle/oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
RUN rpm -ivh https://s3-ap-northeast-1.amazonaws.com/uptime-dev01/oracle/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
#RUN rpm -ivh /tmp/oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
#RUN rpm -ivh /tmp/oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
の部分になります。

■Dockerイメージを使ってデータベースプロファイリングをする


というわけで、作成したDockerイメージを使ってみます。

今回、DockerイメージはDocker Hubに登録してありますので、まずはそちらをdocker pullで取得します。


Pulling a docker image from Satoshi Nagayasu on Vimeo.

次に、クライアントを動かして、Oracle Databaseに接続してデータベースのプロファイリングを行います。


背景が水色の部分はDockerのコマンドとオプション、白い部分はHecatoncheirのコマンドとオプションです。

最終的には、ホストの /tmp/docker というディレクトリ(Dockerコンテナ内では /docker ディレクトリ)に repo.db というファイルが作成され、プロファイリングした結果がそこに保存されます。


Running data profiling from Satoshi Nagayasu on Vimeo.

■プロファイリングしたデータを閲覧する


最後にサーバを起動して、レポジトリの情報を閲覧可能にします。

ブラウザ経由で、データの状態を確認することができます。



Running the repository server from Satoshi Nagayasu on Vimeo.

■まとめ


以上、今回はOracle Databaseに対応したツールをDocker化する方法についてご紹介しました。

冒頭でも紹介しましたが、オープンソースのツールを使う/使ってもらう場合、依存関係が多くなり、環境構築がハードルになるケースが多々あります(慣れている人であっても)。

特に、HecatoncheirのようにさまざまなDBMSに対応したツールを開発する場合、クライアントライブラリなども含めると依存関係が多岐に渡るため、Dockerは非常に便利であると感じました。

ぜひ、データベースエンジニアにも新しいツールやソフトウェアを積極的に試してみていただければと思います。もちろん、Hecatoncheirも使ってみていただけると嬉しいです。

では、また。

0 件のコメント:

コメントを投稿