Dockerfile配置APM监控实现Java容器的性能监控
通过Dockerfile可以用来构建容器镜像,我们一般也是通过这种方式来构建一个Tomcat应用服务容器,如果要实现对容器中的Tomcat服务(或是其他Java应用)进行APM(应用性能管理)监控,就需要我们在容器中放置javaagent并做相关配置,而在已生成的容器中修改配置不符合容器管理的规范,所以我们建议在发布镜像时就将javaagent植入,这样在生成容器时就可以通过环境变量参数来决定是否开启监控。
(请持续关注smooth的博客:https://blog.csdn.net/smooth00,另外有关容器的文章还可以关注:《搭建Jmeter容器集群平台》、《以容器部署Ganglia并监控Hadoop集群》、《Rancher及Docker快速上手指南(一)》、《Rancher及Docker快速上手指南(二)》、《Rancher及Docker快速上手指南(三)》、《Jenkins自动化部署容器》)
以下是以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: zhengguanghuaFROM ubuntu:14.04.3
#作者
# MAINTAINER zhengguanghua <zq2599@gmail.com>
# 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监控平台就能看到应用服务的监控数据:
总结:对于性能监控来说,容器和虚拟机下操作其实没有太大差别,唯一的差别是容器是一种封装的应用,既然是封装,我们的监控服务也应该一起封装进去,而不是等容器部署完了,才开始考虑监控的配置和开启,一是不方便操作,二是不符合容器的管理要求(容器是即用即生成,不用即消亡,不适合在容器里做过多配置化操作)。
Dockerfile配置APM监控实现Java容器的性能监控相关推荐
- 性能调优之Java系统级性能监控及优化
性能调优之Java系统级性能监控及优化 对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化Ap ...
- Java的JVM性能监控与故障处理工具详细介绍以及使用案例
给一个系统定位问题的时候,知识.经验是关键基础,数据是依据.工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照文件(threaddump/javacore文件).堆 ...
- java 监控 emc 存储_EMC存储性能监控管理手册范本
<EMC存储性能监控管理手册范本>由会员分享,可在线阅读,更多相关<EMC存储性能监控管理手册范本(18页珍藏版)>请在人人文库网上搜索. 1.word格式EMC VNX540 ...
- 监控宝服务器与服务性能监控配置
之前公司有使用过监控宝来进行网络和服务器,及服务器性能监控,在此记录一下各监控配置方式 目录 一.目的 2 1.1 监控目的 2 1.2 本文目的 2 二.理论基础 2 2.1 相关理论 2 2.2 ...
- 基于网络监控软件的流量、性能监控
2019独角兽企业重金招聘Python工程师标准>>> 随着Internet技术的不断发展,网络中出现的不安全因素越来越多,网络管理及安全越来越为用户所重视,用户对网络的要求越来越高 ...
- linux系统和性能监控之cpu篇,Linux性能监控之CPU篇(2)
正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列.CPU使用率和上下文切换.以下是一些对于CPU很普遍的性能要求: 1.对于每一个CPU来说运行队列不要超 ...
- 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具
jre的bin目录下的工具,都非常小.它都是tools.jar下面的代码的一层封装而已.tools.jar不是java标准,是Hotspot实现的. 名称 作用 jps JVM Process Sta ...
- Java虚拟机:性能监控与故障处理工具
概述: 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据.工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照文件(threaddump/javacore文 ...
- java对redis性能监控编码_Redis状态与性能监控
Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...
最新文章
- 一个Solidity源文件的布局
- Informatica:当好大数据的清道夫
- Linux服务器负载均衡LB
- 初学者css常见问题_5分钟内学习CSS-初学者教程
- 微软推中文Live地图搜索服务与Office集成
- 智能语音技术新发展与发展趋势
- hdc mfc 画扇形图_canvas画扇形、饼图
- psql json操作符合函数
- 进击的小程序:品牌自营GMV同比增长210%,这些行业增速最快……
- 《程序设计技术基础》第1-5章例程
- FB正在大规模重构React Native,预计今年发布
- Etcd分布式存储系统
- php 安装swoole扩展
- Solaris 11中的变化
- Java中的getBytes()方法详解
- 来着QQ邮箱的垃圾网页分析,能力有限,没什么实际的进展
- 关于证明PAC可学习
- 数值积分公式及龙贝格(Romberg)算法实现matlab
- Echarts字体和线条颜色设置操作笔记
- 【纯干货】标题里的大学问,月薪10000元以上的运营,是这样写宝贝标题的
热门文章
- 三星电视618钜惠火热进行中,6月2日总裁直播惊喜“价”到
- unity发射弓箭轨迹的实现
- 一点关于应届毕业生找工作的建议。
- ORACLE DataGuard环境搭建详细步骤(新方法)
- Https环境将key秘钥和crt格式证书转成cer证书
- 物理机安装 CentOS 8.3
- 工程师小哥魔术揭秘“三仙归洞”,把我都看蒙了!
- 内网穿透软件对比——cpolar : 网云穿(下)
- java 隐藏父类方法,java 子类继承父类成员变量的隐藏、实现方法的重写
- js中数组的entries方法