11

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

有没有办法监控java应用程序的内存使用情况?我尝试使用jconsoledocker 的进程 ID,但它告诉我Invalidate process id

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

有什么好的方法可以实现这一目标吗?

谢谢

4

6 回答 6

10

要连接到在运行的 docker 容器中运行的 java 进程boot2dockervisualvm您可以尝试以下操作:

使用以下选项启动您的 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>.

没有它应该不会有太大的不同boot2docker

于 2015-09-11T12:37:03.913 回答
3

To monitor docker containers I recommend Google's cAdvisor project. That way you have a general solution to monitor docker containers. Just run your app, whatever that is, in a docker container, and check things like cpu and memory usage. Here you have an http API as well as a web ui.

于 2014-10-12T11:38:24.263 回答
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 一起使用,但它是一种监视内存使用情况的方法。

于 2014-07-17T06:57:49.027 回答
0

上面提到的 cAdvisor 对监控容器内运行的 Tomcat 没有帮助。您可能想看看 SPM Client docker 容器,它就是这样做的!它具有用于监视在 Docker 中运行的许多不同应用程序的代理 - Elasticsearch、Solr、Tomcat、MySQL 等:https ://github.com/sematext/docker-spm-client

于 2016-08-05T05:09:11.507 回答
0

对于 Docker 中应用程序的内存使用监控,您还可以在 Docker 容器中启动一个ejstatdmvn -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.

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

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

于 2016-11-02T15:20:04.110 回答
0

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

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

于 2015-12-02T08:28:55.577 回答