ぶるーすくりーん

ぽんこつプログラマ日記

personium.io を Docker 環境でたててみる

先日、personium.io という Baas がOSS化されました。
で、個人的に最近 Docker のポータビリティなとこにとても惹かれていて、personium.io も Docker でさっと動かせたらいいなーと思って試行錯誤してみたので、その記録。

つくってみた Dockerfile

環境

構成

personium.io を動かすには、Java Servlet Container と Elasticsearch が必要。
なので、Elasticsearch を動かす用の Docker と、personium.io がのっかった tomcat を動かす用の Docker のプロセスをそれぞれ立ち上げることにした。

warのビルド

personium.io では、今のところイメージを配布していないので、自前でビルドする必要がある。
普通 Dockerfile では、外部公開されているイメージを Web からとってきて・・・というアプローチが多いみたいだけど、しょうがないのでローカルで事前にビルドするようにした。

ただ、自前で war をビルドするくらいなら、Dockerfile にする必要ないんじゃないかって気もする。。

ローカル環境に maven をインストールしていなかった&ローカル環境汚したくなかったので、ビルドから docker を利用してみた。

maven Repository | Docker Hub Registry イメージを利用させてもらっています。

また、.m2リポジトリを毎回再作成していると、ビルドに時間がかかってしょうがないので、ローカルディレクトリをマウントするようにしてみた。

$ git clone git@github.com:personium/io.git
$ docker run -it --rm --name maven -v io/core:/usr/src/core -v ${WORK_DIR}/resources/.m2:/root/.m2  -w /usr/src/core maven mvn clean package
$ docker run -it --rm --name maven -v io/engine:/usr/src/engine -v ${WORK_DIR}/resources/.m2:/root/.m2 -w /usr/src/engine maven mvn clean package

Dockerfileの内容

Dockerfile で FROM を使用する際は、最小構成のイメージを利用することが推奨されていたけど、今回やりたいのは、tomcat に personium.io をデプロイしたいだけなので、ベースイメージとしてtomcat:7.0.57-jre7 を使用させてもらった。

Dockerfile 内では以下を実施している。

  • ビルドしたwarファイルの配置
  • tomcat の設定変更

personium.io では、dc-config.properties という設定ファイルを CLASSPATH の通ったところに置く必要がある。
このプロパティファイルは、イメージに含めず、docker を起動する毎に読み込み直して欲しかったので、tomcat の設定ファイル setenv.sh で独自の CLASSPATH を追加するようにした。

Add ./resources/tomcat/setenv.sh /usr/local/tomcat/bin/

2015/01/28 追記
プロパティファイルを毎回読み込み直す必要が無くなったので、Dockerfile 内でデフォルトの プロパティの配置まで行うように変更しました。
ただ、後から設定ファイルを別のものに差し替えることもできるよう、tomcat の設定ファイル setenv.sh で独自の CLASSPATH を追加しています。

ADD ./resources/tomcat/setenv.sh /usr/local/tomcat/bin/
ADD ./resources/dc-config.properties /usr/local/personium/

使い方

まず、Elasticsearchのデーモンを起動。

$ docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch dockerfile/elasticsearch-1.3.4

次に、ビルドした personium.io の docker を起動する。
このとき、Elasticsearch の IPアドレスdc-config.properties に書いてあげる必要があるので、だいぶごりっとした感じになってしまった。

$ ES_HOST=`docker run -it --rm -p 8080:8080 --name personium --link elasticsearch:elasticsearch dockerfile/personium env | grep ELASTICSEARCH_PORT_9300_TCP_ADDR | sed -e 's/.*=\(.*\)$/\1/'`
$ sed -e "s/=\${ELASTICSEARCH_PORT_9300_TCP_ADDR}/=${ES_HOST}/g" ./resources/dc-config.properties > ./resources/conf/dc-config.properties
$ docker run -it --rm -p 8080:8080 --name personium -v ${WORK_DIR}/resources/conf:/usr/local/personium --link elasticsearch:elasticsearch dockerfile/personium


2015/01/28 追記
Elasticsearch に接続するために、 --link オプションを指定します。

--linkオプションを指定すると、起動する personium.io コンテナの hosts ファイルに elasticsearch という値で、Elasticsearch コンテナの IP アドレスが定義されます。

実は、イメージのビルド時にデフォルトの dc-config.properties を含めていて、ここで Elasticsearch のホストを elasticsearch として定義しているので、コンテナ間でのアクセスが可能になります。

$ docker run -d -p 8080:8080 --name personium --link elasticsearch:elasticsearch personium

感想

Dockerfile つくるにあたって、どこまで Docker のお仕事にさせるかってとこが悩ましかった。

一応、1回イメージを作成すれば、次からはさくっと動かせるようにはなったけど、作成手順がだいぶ煩雑になってしまった感がいなめない。。

本当は、Docker Hub からイメージダウンロードできてデフォルト設定で動くと便利なんだけど、ローカルで war ビルドしなければならない現状だと実現は難しいな。

2015/01/28 追記
作成手順を整理し、Makefile にしてみたので、GNU Make が使用できる環境では、さくっとイメージビルドもできるようになりました。
また、Windows (x64) 環境でも、ビルド手順を Docker 付属のターミナルを使用して実行することで動作しました。