VisualVM+jstatd 远程查看docker中的springboot程序
环境准备
本文基于以下环境编写
- docker中的服务使用docker-compose启动
- docker中的服务基于openjdk8镜像启动
- 本机装有jdk,且jdk的bin目录下存在VisualVM
- 防火墙端口已开放
文件处理
jstatd.all.policy
grant codebase "file:/usr/local/openjdk-8/lib/tools.jar" {
permission java.security.AllPermission;
};
此文件暂存于远程机器宿主机中,在compose中进行挂载即可
我这里保存为 /home/docker/config/jvm/jstatd.all.policy
docker-compose.yml
使用command命令启动服务
映射policy文件到容器中,我这里放在jdk中
nohup后台启动jstatd进程,避免命令阻塞真正的应用启动
version: "3"
services:
service_name:
container_name: container_name
image: openjdk:8
network_mode: "host"
volumes:
- /home/docker/config/jvm/jstatd.all.policy:/usr/local/openjdk-8/bin/jstatd.all.policy
command:
- sh
- -c
- |
nohup jstatd -J-Djava.security.policy=/usr/local/openjdk-8/bin/jstatd.all.policy -J-Djava.rmi.server.hostname=ip -J-Djava.rmi.server.logCalls=true &
java -Xms256m -Xmx256m -Dlogging.path=/workspace/logs -Dnamespace=pro -Dspring.profiles.active=pro -Dfile.encoding=utf-8 -jar /workspace/jar/demo-1.0.jar
jstatd 相关内容
nohup后台启动jstatd进程,避免命令阻塞真正的应用启动
-J-Djava.security.policy=刚刚创建的,挂载进容器的安全策略文件
-J-Djava.rmi.server.logCalls=是否打印日志,默认false
J-Djava.rmi.server.hostname=宿主机IP
-p 端口,不用等号,默认-p 1099
jstatd启动会使用两个端口,所以docker容器需要映射端口,但jstatd一个端口是1099,可以在启动是自定义,另一个端口为随机端口,不好做映射,所以这里的docker-compose.yml使用host网络模式
随机端口固定方式参考
服务启动
可以考虑先直接启动jstatd,查看日志,确定能在本机远程连上jstatd后,再切回后台启动,再启动真实服务,监控真实服务的数据
修改compose文件的command命令为
command:
- sh
- -c
- |
jstatd -J-Djava.security.policy=/usr/local/openjdk-8/bin/jstatd.all.policy -J-Djava.rmi.server.hostname=ip -J-Djava.rmi.server.logCalls=true
启动docker容器后,查看日志内容为:
端口开放
1099或你指定的jstatd端口需要开放防火墙
尝试连接
在本机尝试连接jstatd
启动VisualVM,点击远程,新建远程,输入你的远程主机IP,再右键主机IP,新建jstatd,尝试连接
可以看到连接请求已经到了jstatd,但是本机没有内容
这是因为jstatd的随机端口的防火墙还没开放
在宿主机中查看另一个端口号
netstat -lpnt | grep jstatd
我这里为45150,再去开放这个端口
可以发现,VisualVM成功脸上了服务器
这时我们再去后台启动jstatd,然后正常启动我们的应用
就可以在VisualVM中看到我们启动的服务进程
双击该应用,就可以查看到该进程的运行情况了
VisualVM GC插件
VisualVM提供了GC监控插件,可以装上查看GC情况,方便调优
总结
本文只介绍如何远程连接docker中的服务
具体如何使用VisualVM查看参数,如何进行调优
会在后续文章中解决。