Dockerfile配置APM监控实现Java容器的性能监控
通過Dockerfile可以用來構建容器鏡像,我們一般也是通過這種方式來構建一個Tomcat應用服務容器,如果要實現(xiàn)對容器中的Tomcat服務(或是其他Java應用)進行APM(應用性能管理)監(jiān)控,就需要我們在容器中放置javaagent并做相關配置,而在已生成的容器中修改配置不符合容器管理的規(guī)范,所以我們建議在發(fā)布鏡像時就將javaagent植入,這樣在生成容器時就可以通過環(huán)境變量參數(shù)來決定是否開啟監(jiān)控。
(請持續(xù)關注smooth的博客:https://blog.csdn.net/smooth00,另外有關容器的文章還可以關注:《搭建Jmeter容器集群平臺》、《以容器部署Ganglia并監(jiān)控Hadoop集群》、《Rancher及Docker快速上手指南(一)》、《Rancher及Docker快速上手指南(二)》、《Rancher及Docker快速上手指南(三)》、《Jenkins自動化部署容器》)
以下是以Zoho Applications Manager當中的應用性能管理產品為例(像聽云、OneAPM等應用性能管理也屬于同類產品,原理一樣,以下配置的關鍵是將監(jiān)控代理javaagent的jar包和相關配置文件通過Dockerfile寫入到鏡像中,并通過環(huán)境變量更改配置項):
1、修改catalina.sh
一般APM監(jiān)控,都是在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
這是監(jiān)控代理的配置文件,其他產品也有類似的配置文件,主要是對以下幾個參數(shù)進行標準化設置
application.name=@APM_NAME@ #這是應用名,這個名稱是用來替換的
apm.host=@127.0.0.1@ #這是APM監(jiān)控平臺的IP,也是用來替換的
apm.port=@9090@ #這是APM監(jiān)控平臺的端口,也是用來替換的
3、準備好要部署tomcat的文件或要替換的配置文件
比如:jdk-8u171-linux-x64.tar.gz、apache-tomcat-8.5.32.tar.gz、tomcat-users.xml、server.xml,這些文件都是要確保可以在真實機器上安裝部署和使用的。
然后準備要發(fā)布到tomcat上的應用war包或者文件,我的環(huán)境是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 環(huán)境變量? 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#定義要發(fā)布的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監(jiān)控代理目錄apminsight COPY apminsight $WORK_PATH/apminsight #復制文件catalina.sh COPY? ./catalina.sh $WORK_PATH/bin/ #復制tomcat啟動文件(文件里也包含apminsight監(jiān)控代理的配置替換命令) COPY startTomcat.sh /usr/local/#給可執(zhí)行文件賦權限,并配置東八區(qū)時區(qū) 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一般只能執(zhí)行一個進程命令(多個CMD命令也是最后一個覆蓋前面的),所以把APM監(jiān)控代理的配置文件修改命令和tomcat啟動命令全放到startTomcat.sh中,通過一個CMD命令調用。
#!/bin/bash#用sed將環(huán)境變量替換成apminsight.conf中的參數(shù) 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不方便),其實這么實現(xiàn)是很有必要的,比如你在Dockerfile用FROM繼承了一個基礎鏡像,每個基礎鏡像肯定都有自己的一套進程邏輯和CMD啟動命令,如果不設計成覆蓋的模式,那么我們對原有容器鏡像的任何配置和修改,以及追加新進程,都要顧及太多原有進程的影響,這不利于鏡像的繼承或嵌套。
6、構建鏡像
將以上所有文件都傳到一個目錄下,比如/home/rfzf-tomcat,然后我們進入這個目錄,執(zhí)行以下命令build成鏡像:
docker build -t docker-tomcat:1.0 .
7、調用鏡像生成容器
建議將tomcat的logs通過卷的方式持續(xù)化日志文件,在宿主機上建立目錄/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
這樣就可以生成容器,而且通過環(huán)境變量(-e)將APM的HOST、端口等替換(在啟動tomcat前被替換)了,而且通過APM_IS_OPEN=true,在catalina.sh中也會調用apminsight-javaagent.jar監(jiān)控代理文件。
以下是運行的容器監(jiān)視圖:
通過Tomcat的業(yè)務窗體訪問,在APM監(jiān)控平臺就能看到應用服務的監(jiān)控數(shù)據(jù):
? ? ? ?總結:對于性能監(jiān)控來說,容器和虛擬機下操作其實沒有太大差別,唯一的差別是容器是一種封裝的應用,既然是封裝,我們的監(jiān)控服務也應該一起封裝進去,而不是等容器部署完了,才開始考慮監(jiān)控的配置和開啟,一是不方便操作,二是不符合容器的管理要求(容器是即用即生成,不用即消亡,不適合在容器里做過多配置化操作)。
總結
以上是生活随笔為你收集整理的Dockerfile配置APM监控实现Java容器的性能监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面试题及答案,javaSE阶段
- 下一篇: <Linux>计算机体系结构和操作系统