通过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容器的性能监控相关推荐

  1. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化 对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化Ap ...

  2. Java的JVM性能监控与故障处理工具详细介绍以及使用案例

    给一个系统定位问题的时候,知识.经验是关键基础,数据是依据.工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照文件(threaddump/javacore文件).堆 ...

  3. java 监控 emc 存储_EMC存储性能监控管理手册范本

    <EMC存储性能监控管理手册范本>由会员分享,可在线阅读,更多相关<EMC存储性能监控管理手册范本(18页珍藏版)>请在人人文库网上搜索. 1.word格式EMC VNX540 ...

  4. 监控宝服务器与服务性能监控配置

    之前公司有使用过监控宝来进行网络和服务器,及服务器性能监控,在此记录一下各监控配置方式 目录 一.目的 2 1.1 监控目的 2 1.2 本文目的 2 二.理论基础 2 2.1 相关理论 2 2.2 ...

  5. 基于网络监控软件的流量、性能监控

    2019独角兽企业重金招聘Python工程师标准>>> 随着Internet技术的不断发展,网络中出现的不安全因素越来越多,网络管理及安全越来越为用户所重视,用户对网络的要求越来越高 ...

  6. linux系统和性能监控之cpu篇,Linux性能监控之CPU篇(2)

    正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列.CPU使用率和上下文切换.以下是一些对于CPU很普遍的性能要求: 1.对于每一个CPU来说运行队列不要超 ...

  7. 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具

    jre的bin目录下的工具,都非常小.它都是tools.jar下面的代码的一层封装而已.tools.jar不是java标准,是Hotspot实现的. 名称 作用 jps JVM Process Sta ...

  8. Java虚拟机:性能监控与故障处理工具

    概述: 给一个系统定位问题的时候,知识.经验是关键基础,数据是依据.工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照文件(threaddump/javacore文 ...

  9. java对redis性能监控编码_Redis状态与性能监控

    Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...

最新文章

  1. 一个Solidity源文件的布局
  2. Informatica:当好大数据的清道夫
  3. Linux服务器负载均衡LB
  4. 初学者css常见问题_5分钟内学习CSS-初学者教程
  5. 微软推中文Live地图搜索服务与Office集成
  6. 智能语音技术新发展与发展趋势
  7. hdc mfc 画扇形图_canvas画扇形、饼图
  8. psql json操作符合函数
  9. 进击的小程序:品牌自营GMV同比增长210%,这些行业增速最快……
  10. 《程序设计技术基础》第1-5章例程
  11. FB正在大规模重构React Native,预计今年发布
  12. Etcd分布式存储系统
  13. php 安装swoole扩展
  14. Solaris 11中的变化
  15. Java中的getBytes()方法详解
  16. 来着QQ邮箱的垃圾网页分析,能力有限,没什么实际的进展
  17. 关于证明PAC可学习
  18. 数值积分公式及龙贝格(Romberg)算法实现matlab
  19. Echarts字体和线条颜色设置操作笔记
  20. 【纯干货】标题里的大学问,月薪10000元以上的运营,是这样写宝贝标题的

热门文章

  1. 三星电视618钜惠火热进行中,6月2日总裁直播惊喜“价”到
  2. unity发射弓箭轨迹的实现
  3. 一点关于应届毕业生找工作的建议。
  4. ORACLE DataGuard环境搭建详细步骤(新方法)
  5. Https环境将key秘钥和crt格式证书转成cer证书
  6. 物理机安装 CentOS 8.3
  7. 工程师小哥魔术揭秘“三仙归洞”,把我都看蒙了!
  8. 内网穿透软件对比——cpolar : 网云穿(下)
  9. java 隐藏父类方法,java 子类继承父类成员变量的隐藏、实现方法的重写
  10. js中数组的entries方法