我在Docker容器中的tomcat上运行java web应用程序。
有没有办法监控java应用程序的内存使用情况?我尝试将jconsole
与docker的进程ID一起使用,但它告诉我Invalidate process id
我也在tomcat中启用JMX,但不知道如何绑定它。我可以使用本地的visualvm
绑定主机,但无法找到绑定到主机内部的docker的方法。
有没有什么好方法可以实现这个目标?
由于
答案 0 :(得分:7)
要连接到在boot2docker
中使用visualvm
运行的docker容器中运行的java进程,您可以尝试以下操作:
使用以下选项启动您的java进程:
java -Dcom.sun.management.jmxremote.port=<port> \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.rmi.port=<port> \
-Djava.rmi.server.hostname=<boot2docker_ip> \
<Main>
您需要使用--expose <port> -p <port>:<port>
运行图片。
然后使用visualvm
在<boot2docker_ip>:<port>
中添加“添加JMX连接”。
没有boot2docker
,它应该没什么不同。
答案 1 :(得分:3)
要监控它的使用情况,您需要获得它的真实进程ID。如果您直接在容器中运行tomcat,那么它应该是:
DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)`
如果您使用的是Phusion的baseimage,那么您的java进程将成为该进程的子进程。要查看层次结构,请使用:
pstree $DOCKER_ROOT_PROC
完成后,您可以使用
编写脚本ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC
在您的脚本中以递归方式查找要监视的java进程(当然,使用一些正则表达式筛选)。最后你可以使用它来获取你的java应用程序的内存使用量,以千字节为单位:
ps -o vsz -p $JAVAPROCESS
我不知道这是否可以与jconsole一起使用,但它是监视内存使用情况的一种方式。
答案 2 :(得分:3)
要监控泊坞容器,我建议Google's cAdvisor
project。这样,您就可以使用通用的解决方案来监控docker容器。只需运行你的应用程序,无论是什么,在docker容器中,并检查cpu和内存使用情况。这里有一个http API以及一个web ui。
答案 3 :(得分:0)
我尝试了Pierre's answer(also answered here),但没办法。
最后,我可以使用SSH tunnel连接。
答案 4 :(得分:0)
答案 5 :(得分:0)
对于Docker中应用程序的内存使用情况监控,您还可以在Docker容器内启动ejstatd(在启动主容器进程之前从ejstatd文件夹调用mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" &
),公开这些3使用docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage
到Docker主机的端口。
然后,您将能够使用JVisualVM连接到此特殊jstatd守护程序,例如,添加“远程主机”,将Docker主机名指定为“主机名”并添加“自定义jstatd连接”(在“高级设置”中) )通过将“2222”设置为“端口”。
免责声明:我是这个开源工具的作者。