Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

Jolokiaを使ってコンテナ内のjarをホスト側から取得してみる

貴子です。
弊社では絶賛docker乗り換え中で、コンテナ内のjarプロセスを監視したくなりました。
監視ツールとしてはmackerelとsensuを使っていますが、
まだその2つでグラフ表示したりメモリーの使用率のアラートを設定したりまでは出来ていません。
この記事は「コンテナ上でplayのjarを実行して、Jolokiaを起動して、ホスト側から値を取得するところまで」です。

Jolokiaとは?

リモートJVMにアクセスをするためのJavaエージェントで、http経由でJVMの情報を取得できる様になります。
詳しくは公式サイトをどうぞー。
jolokia.org

Jolokiaを使ってコンテナ内のjarをホスト側から取得する

ホストOSにはAmazon linuxを使っていて、コンテナはCentOS6で試しています。
1.ホスト側でjolokiaのjarを用意する

cd Jolokia #作業ディレクトリ
wget https://repo1.maven.org/maven2/org/jolokia/jolokia-jvm/1.3.2/jolokia-jvm-1.3.2-agent.jar

2. Dockerfileを作成する
監視したいjar (sample-docker.jar) を作業ディレクトリ内に置きます。

vim Dockerfile
# Dockerfile記入内容
FROM centos:centos6
MAINTAINER Takako Onoue

RUN yum -y update
RUN yum -y install java-1.8.0-openjdk*
RUN mkdir -p /opt/application

ADD ./sample-docker.jar /opt/application/
ADD ./jolokia-jvm-1.3.2-agent.jar /opt/application/

EXPOSE 9000 8778
CMD java -jar /opt/application/sample-docker.jar

3. コンテナを起動させる
9000がplayの利用ポートで、8778がjolokiaのです。

# Dockerfileをビルドしてdocker imageを作成します。
docker build -t sample .
# バックグラウンドでコンテナを起動します。
docker run -d --name play-jar -p 8778:8778 -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-t sample

プロセスが立ち上がったか確認します。
f:id:t_onoue:20151020122012p:plain
4. docker内に入って、Jolokiaを起動させる
これは、まだDockerfile内に処理を収めることができてないところです。。。
先ほど確認したprocess idを元にbashでログインします。

docker exec -it b2d0e2a686df bash  
# playのprocess idを取得  
jps  

f:id:t_onoue:20151020122421p:plain
id = 1ですね、Jolokiaの起動コマンドの引数に入れてを打ちましょう。

java -jar /opt/application/jolokia-jvm-1.3.2-agent.jar --host 0.0.0.0 start 1

f:id:t_onoue:20151020130828p:plain
起動できましたねー。
それではURLを取っておいて、ホスト側からアクセスしてみましょうか。
5.ホストOSから情報がJolokiaを経由してJVMの情報を取得する

curl http://172.17.0.13:8778/jolokia/

f:id:t_onoue:20151020124443p:plain
アクセスできますね。
使用しているHeapMemoryでも取ってみましょうか。

curl http://172.17.0.13:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage|jq

f:id:t_onoue:20151020124527p:plain
うん、良い感じですね。

Jolokia込でDockerfileが書けてない・0.0.0.0で全てのipに開放しちゃっているとかの
課題はありますが、一先ずここまでです。