Dockerfile配置APM监控实现Java容器的性能监控

通过Dockerfile可以用来构建容器镜像,我们一般也是通过这种方式来构建一个Tomcat应用服务容器,如果要实现对容器中的Tomcat服务(或是其他Java应用)进行APM(应用性能管理)监控,就需要我们在容器中放置javaagent并做相关配置,而在已生成的容器中修改配置不符合容器管理的规范,所以我们建议在发布镜像时就将javaagent植入,这样在生成容器时就可以通过环境变量参数来决定是否开启监控。

(请持续关注smooth的博客:https://blog.csdn.net/smooth00)

以下是以Zoho Applications Manager当中的应用性能管理产品为例(像听云、OneAPM等应用性能管理也属于同类产品,原理一样,以下配置的关键是将监控代理javaagent的jar包和相关配置文件通过Dockerfile写入到镜像中,并通过环境变量更改配置项):

1、修改catalina.sh

一般APM监控,都是在catalina.sh中追加JAVA_OPTS配置,如下:

export JAVA_OPTS="$JAVA_OPTS -javaagent:$CATALINA_HOME/apminsight/apminsight-javaagent.jar"

我们这次也是这么干的,但是会加一个开关来if控制:

if [ "$APM_IS_OPEN" = "true" ] ; then

export JAVA_OPTS="$JAVA_OPTS -javaagent:$CATALINA_HOME/apminsight/apminsight-javaagent.jar"

fi

2、修改apminsight.conf

这是监控代理的配置文件,其他产品也有类似的配置文件,主要是对以下几个参数进行标准化设置

application.name=@APM_NAME@ #这是应用名,这个名称是用来替换的

apm.host=@127.0.0.1@ #这是APM监控平台的IP,也是用来替换的

apm.port=@9090@ #这是APM监控平台的端口,也是用来替换的

3、准备好要部署tomcat的文件或要替换的配置文件

比如:jdk-8u171-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz、tomcat-users.xml、server.xml,这些文件都是要确保可以在真实机器上安装部署和使用的。

然后准备要发布到tomcat上的应用war包或者文件,我的环境是rfzf.war

4、配置Dockerfile文件

# First docker file from zhengguanghua

# VERSION 1.0.1

# Author: zhengguanghua

FROM ubuntu:14.04.3

#作者

# MAINTAINER zhengguanghua

# add java and tomcat 支持包到容器中

ADD jdk-8u171-linux-x64.tar.gz /usr/local/

ADD apache-tomcat-8.5.32.tar.gz /usr/local/

RUN mv /usr/local/apache-tomcat-8.5.32 /usr/local/tomcat

# 配置 java and tomcat 环境变量

ENV JAVA_HOME /usr/local/jdk1.8.0_171

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/tomcat

ENV CATALINA_BASE /usr/local/tomcat

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#定义工作目录

ENV WORK_PATH /usr/local/tomcat

#定义要发布的war包文件名

ENV WEB_APP rfzf.war

#删除原文件tomcat-users.xml,可不删除直接COPY覆盖

#RUN rm $CONF_PATH/$USER_CONF_FILE_NAME

#复制文件tomcat-users.xml

COPY  ./tomcat-users.xml $WORK_PATH/conf/

#复制文件server.xml

COPY  ./server.xml $WORK_PATH/conf/

#复制APM监控代理目录apminsight

COPY apminsight $WORK_PATH/apminsight

#复制文件catalina.sh

COPY  ./catalina.sh $WORK_PATH/bin/

#复制tomcat启动文件(文件里也包含apminsight监控代理的配置替换命令)

COPY startTomcat.sh /usr/local/

#给可执行文件赋权限,并配置东八区时区

RUN chmod +777 /usr/local/startTomcat.sh && chmod +777 $WORK_PATH/bin/catalina.sh \

&& /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \

&& echo 'Asia/Shanghai' >/etc/timezone

#复制war包到wepapps目录下

COPY ./$WEB_APP $WORK_PATH/webapps/

# container listener port

# EXPOSE 8080

# startup web application services by self

# CMD /usr/local/tomcat/bin/catalina.sh run

#让容器当前目录定位到工作目录下

WORKDIR $WORK_PATH

#启动容器

CMD ["sh", "/usr/local/startTomcat.sh"]

5、编写startTomcat.sh

由于容器的CMD一般只能执行一个进程命令(多个CMD命令也是最后一个覆盖前面的),所以把APM监控代理的配置文件修改命令和tomcat启动命令全放到startTomcat.sh中,通过一个CMD命令调用。

#!/bin/bash

#用sed将环境变量替换成apminsight.conf中的参数

sed -i "s/@APM_NAME@/${APM_NAME}/g" /usr/local/tomcat/apminsight/apminsight.conf

sed -i "s/@127.0.0.1@/${APM_HOST}/g" /usr/local/tomcat/apminsight/apminsight.conf

sed -i "s/@9090@/${APM_PORT}/g" /usr/local/tomcat/apminsight/apminsight.conf

#启动tomcat,容器不能用后台运行进程,所以用run在控制台显示

/usr/local/tomcat/bin/catalina.sh run

以上启动tomcat命令用run(必须用run,用catalina.sh start或是startup.sh都不好使),可以防止容器一启动就关闭(这是容器的一个特性,也是最大的一个坑,应用进程必须在前台运行,才能成为容器的守护进程,即进程一旦退出或从前台中止运行容器也会跟着停止)。

以下总结一下容器start.sh的命令原则:

(1)原则上一个容器就运行一个进程,这就是为什么容器服务要尽量简单,多进程应用需要拆分成多个容器

(2)容器中要是运行多个守护进程时,前面的进程要用后台方式运行(或添加 &),否则后面的服务无法启动

(3)容器中最后一个守护进程一定要用前台方式运行,否则start.sh退出,容器退出,所有的服务就白启动了

注:为什么CMD命令默认一定是覆盖而不是继承或追加,很多初次接触这块的人都会不理解这么设计的用意(觉得不能同时多次调用CMD不方便),其实这么实现是很有必要的,比如你在Dockerfile用FROM继承了一个基础镜像,每个基础镜像肯定都有自己的一套进程逻辑和CMD启动命令,如果不设计成覆盖的模式,那么我们对原有容器镜像的任何配置和修改,以及追加新进程,都要顾及太多原有进程的影响,这不利于镜像的继承或嵌套。

6、构建镜像

将以上所有文件都传到一个目录下,比如/home/rfzf-tomcat,然后我们进入这个目录,执行以下命令build成镜像:

docker build -t docker-tomcat:1.0 .

7、调用镜像生成容器

建议将tomcat的logs目录通过卷的方式持久化日志文件,在宿主机上建立目录/opt/tomcat-logs,并赋予读写权限。以下是生成容器的命令:

docker run --name docker-tomcat -d --restart=unless-stopped -p 8080:8080 -e APM_NAME=Docker_Tomcat -e APM_HOST=172.16.1.251 -e APM_PORT=9099 -e APM_IS_OPEN=true -v /opt/tomcat-logs:/usr/local/tomcat/logs docker-tomcat:1.0

这样就可以生成容器,而且通过环境变量(-e)将APM的HOST、端口等替换(在启动tomcat前被替换)了,而且通过APM_IS_OPEN=true,在catalina.sh中也会调用apminsight-javaagent.jar监控代理文件。

以下是运行的容器监视图:

通过Tomcat的业务窗体访问,在APM监控平台就能看到应用服务的监控数据:

       总结:对于性能监控来说,容器和虚拟机下操作其实没有太大差别,唯一的差别是容器是一种封装的应用,既然是封装,我们的监控服务也应该一起封装进去,而不是等容器部署完了,才开始考虑监控的配置和开启,一是不方便操作,二是不符合容器的管理要求(容器是即用即生成,不用即消亡,不适合在容器里做过多配置化操作)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 在资治通鉴中,“纳谏”是一个有意思的词。 唐太宗告诉继位者要善于纳谏,两司马在史记中也花了不少笔墨称颂能纳谏的,批...
    吴少杰1988阅读 214评论 0 0
  • 1、应用程序PING发出的是什么报文()ICMP是(Internet Control Message Protoc...
    远o_O阅读 468评论 0 0
  • 我原以为在武侠的世界里是没有丝毫余地的,刀剑无眼,快意恩仇,所以自小我们便被教导着刻苦练功,希望能够谋得一份差...
    我不当院长好多年阅读 335评论 0 1