如何在Docker中监控java应用程序的内存使用情况

我在Docker容器中的tomcat上运行java web应用程序。

有什么办法来监视Java应用程序的内存使用情况吗? 我尝试使用jconsole与泊坞窗的进程ID,但它告诉我Invalidate process id

我也在tomcat中启用JMX,但不知道如何绑定到它。 我可以从我的本地使用visualvm绑定主机,但无法find绑定到主机内的docker的方式。

有没有什么好的方法来实现这一目标?

谢谢

要连接到运行在使用boot2docker中的boot2docker容器中运行的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>运行映像。

然后使用<boot2docker_ip>:<port><boot2docker_ip>:<port> “添加JMX连接”。

没有boot2docker应该没有太大的区别。

要监视它的使用情况,你需要得到它的真实进程ID。 如果你直接在容器中运行tomcat,那么它应该是:

 DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)` 

如果您正在使用Phusion的baseimage之类的东西,那么您的java进程将是该进程的一个subprocess。 要查看层次使用:

 pstree $DOCKER_ROOT_PROC 

一旦你有了,你可以使用写脚本

 ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC 

在你的脚本中recursion地find你想要监视的java进程(当然有一些正则expression式过滤)。 最后你可以用这个来获得你的java应用程序的内存使用情况(千字节):

 ps -o vsz -p $JAVAPROCESS 

我不知道这是否可以用于jconsole,但它是一种监视内存使用情况的方法。

要监视docker集装箱,我推荐Google的cAdvisor项目 。 这样你有一个通用的解决scheme来监视docker集装箱。 只要运行你的应用程序,无论是在docker容器中,并检查CPU和内存使用情况。 这里有一个http API和一个web ui。

我试了皮埃尔的回答 ( 也在这里回答 ),但没办法。

最后我可以使用SSH隧道进行连接。

上面提到的cAdvisor将无助于监视容器内运行的Tomcat。 您可能想看看SPM客户端泊坞窗容器,这完全是! 它具有监视Docker中运行的多个不同应用程序的代理 – Elasticsearch,Solr,Tomcat,MySQL等等: https : //github.com/sematext/docker-spm-client

对于Docker中应用程序的内存使用情况监视,您还可以在Docker容器中启动ejstatd (调用mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" &从ejstatd文件夹启动你的主容器进程之前),使用docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage 3个端口暴露给Docker主机docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage

然后,您将能够使用JVisualVM连接到这个特殊的jstatd守护进程,例如添加一个指定您的Docker主机名为“主机名”的远程主机,并通过设置添加一个“Custom jstatd Connections”(在“高级设置”中) “2222”到“Port”。

免责声明:我是这个开源工具的作者。