貴子です。
弊社では絶賛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
プロセスが立ち上がったか確認します。
4. docker内に入って、Jolokiaを起動させる
これは、まだDockerfile内に処理を収めることができてないところです。。。
先ほど確認したprocess idを元にbashでログインします。
docker exec -it b2d0e2a686df bash # playのprocess idを取得 jps
id = 1ですね、Jolokiaの起動コマンドの引数に入れてを打ちましょう。
java -jar /opt/application/jolokia-jvm-1.3.2-agent.jar --host 0.0.0.0 start 1
起動できましたねー。
それではURLを取っておいて、ホスト側からアクセスしてみましょうか。
5.ホストOSから情報がJolokiaを経由してJVMの情報を取得する
curl http://172.17.0.13:8778/jolokia/
アクセスできますね。
使用しているHeapMemoryでも取ってみましょうか。
curl http://172.17.0.13:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage|jq
うん、良い感じですね。
Jolokia込でDockerfileが書けてない・0.0.0.0で全てのipに開放しちゃっているとかの
課題はありますが、一先ずここまでです。