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 付属のターミナルを使用して実行することで動作しました。