visualVm 通过jmx连接docker中Springboot项目
背景:有时候我们可以通过jdk中的java VisualVM来了解我们的程序运行情况,及时发现性能差的程序,以此来帮助我们更好的优化项目。
本文主要是在docker 部署方式下的Springboot 如何通过 VisualVM 通过jmx来连接监控线上的程序运行。
1. docker 项目 部署都有Dockerfile,修改文件配置启动 jvm,主要增加JAVA_OPTS 配置,
-Dcom.sun.management.jmxremote \ 开启jmx远程连接
-Dcom.sun.management.jmxremote.rmi.port=11890 \映射 宿主机端口
-Dcom.sun.management.jmxremote.port=11890 \ docker 容器端口
-Dcom.sun.management.jmxremote.ssl=false \ 是否采用ssl协议
-Dcom.sun.management.jmxremote.authenticate=false \ 是否通过账户密码
-Djava.rmi.server.hostname=192.168.199.111 "
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENV JAVA_OPTS="\
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.rmi.port=11890 \
-Dcom.sun.management.jmxremote.port=11890 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=192.168.199.111 "
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
RUN echo "Asia/Shanghai" > /etc/timezone;
2.配置启动sh
docker run 是开放 11890端口 ,主要 就是启动容器时开放11890端口
docker run -d -p 8890:8890 -p 11890:11890--name <CONTAINER_NAME> <IMAGE_NAME>
3.打开visualVm 打开远程 通过jmx 访问11890端口
--题外拓展话:如果 同个应用(用到同一个dockerfile) 多部署多节点情况
两个应用:zddts-sms 用同一个dockerfile 打包 我们希望能监听11890 和11891
环境变量建议在sh docker run 是配置
#新增端口监控环境配置
docker run -d -p $port2:$port2 -p $port3:$port3 -v /home/zddts/zddts_log/$name:/zddts_log -e server_port=$port2 -e "JAVA_OPTS=
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.rmi.port=$port3 \
-Dcom.sun.management.jmxremote.port=$port3 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=192.168.199.111" --name $name$port2 $imagesid2
dockerfile 配置
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ARG JAVA_OPTS
RUN echo ${JAVA_OPTS}
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
RUN echo "Asia/Shanghai" > /etc/timezone;
达到效果: