JavaEEだけどDockerがしたい!- GlassFish on Docker

Java EE Advent Calendar 2014 14日目です。

今年はDockerが大躍進した年だな、と思います。

そこで、このビックウェーブに乗り遅れないように、GlassFishを使って、Dockerベースの環境を作ってみました。

今回利用するコンテナはこちら

Appコンテナ

GlassFishが乗っているサーバです。下記のプロセスが動いています。このコンテナの数を増やす事でスケールアウトが可能。

本体はGlassFishですが、周辺システムとしてFluentdとConsulをインストールしてあります。

Dockerテクニック的に言えば、FuluentdやConsulを入れた状態でいったんイメージを構築して、それを継承する形で、glassfishイメージを作ってるので、wildflytomcatにすげ替えることも、比較的簡単に出来る構成にしてあります。

また、通常、Dockerでは1プロセスしか起動できないので、"run.sh"を作って、Fuluentd, Consul, GlassFishの3つのプロセスを起動させています。この辺りは、もしかたしたらKubernetesとかコンテナを管理するシステムを用いることでもっとシンプルに出来るかもしれないです。

他にも、Dockerらしく作るために気をつけた点としてApplicationを最初からデプロイしています。最初は起動前からデプロイしてある構成を想定してたのですが、アプリケーションのデプロイ時にJDBC Sourceを参照するためエラーになるので、auto-deployにして、起動時にデプロイする方式にしました。

DBコンテナ

App Serverが使うDBコンテナです。GlassFish上のアプリがJDBCを利用しているので、App コンテナより先に起動する必要があります。

Consulコンテナ

サービスディスカバリやオーケストレーションを提供するConsulの中央サーバです。今回の構成ではDNSも兼ねています。

  • Consul server agent

Log集計コンテナ

Fuluentdのログ集計サーバです。今回はファイルに吐いてますが、本番だとmongodbとかasticsearchに連携する形になるかと思われます。

ConsulやFuluentdを入れてる理由は、Dockerを使うユースケースでは古き良きオンプレの静的な構成ではなく、クラウド的な動的な構成が想定されるためです。

起動

コンテナは構築済み&docker-hubに上げてあるので、動作確認はシンプルに下記で実施できます。

git clone https://github.com/koduki/docker-javaee.git
cd docker-javaee
./docker-mng.sh up

これで動作します。"http://localhost:8080/javaee-simple-tester/"にアクセスして頂ければ、アクセスが可能です。

まとめ

こんかいはGlassFishクラスタも組んでませんし、リバースプロクシも入れてないので、高可用構成にはなっていません。

ConsulのDNSを経由してラウンドロビンにアクセスすることは可能ですが、HA ProxyとしてConsulを使っても潰れないのかは調査不足。

一方、Consulのイベント通知機能を使えば、Consulクラスタになった時点でGlassFishクラスタに入れるのは簡単そうです。

ただ、その構成にすべきかは、いまいち思案中。設定もデプロイもDockerレベルで完了しちゃうので、GlassFishクラスタを組むメリットは小さいです。

それよりもLBを入れて、負荷分散するほうがよっぽど重要。ただ、GlassFishは原則スティッキーなアクセスを求めるので、この辺をどう解決するのかが課題。クラスタ組まないとセッションレプリケーションもできないですしね。

単純にセッションを無理やりKVSに詰める仕組みを自作してもJavaEEとの相性が悪いので、なんとかHttpSessionレベルをフックする必要があるので、こと辺りは課題として要調査。

来年はこの構成をベースに、もっとスケールアウト出来る仕組みを考えないとなー。

明日はemagさんの「Arquillian Cubeについて」です。

参考