如何从Docker容器中运行的进程访问JMX(Java Beans)

当使用Docker运行进程时,为什么很难连接到JMX端口(使用JConsole)。

当然,我已经将JMX端口暴露给主机 ,甚至在运行Java进程时使用了Sun特定的选项 (遵循http://ptmccarthy.github.io/2014/07/24/remote-jmx-with-docker/ )。

我能够telnet到主机IP和公开的JMX端口,这表明它是可访问的。 但我找不出一种方法来使用JConsole并连接到容器中运行的JMX服务。

-Djava.rmi.server.hostname=$JMX_HOSTNAME -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT 

过去,两个港口必须有所不同。 请尝试一下。

如果那不工作:

Tomcat提供了一个额外的组件来设置所提到的第二个端口,即JMX Remote Lifecycle Listener

请看看:

http://tomcat.apache.org/tomcat-7.0-doc/extras.html

http://tomcat.apache.org/download-70.cgi

我使用这个设置与catalina-jmx-remote.jar在我的tomcat / lib目录中来通过:

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -DrmiRegistryPortPlatform=10381 -DrmiServerPortPlatform=10380 

再加上这些,但是你不需要在开发环境中使用它们。

 -Dcom.sun.management.jmxremote.password.file=/home/tomcat/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/home/tomcat/jmxremote.access -Dcom.sun.management.jmxremote.authenticate=true 

你目前有什么看起来是正确的。 至less试着让它工作,我会尝试禁用auth&ssl。 然后,一旦你得到它的工作,想想重新启用您需要的任何安全:

 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false 

事实上,你需要这两个端口是不同的。 一个端口用于RMIregistry,另一个用于远程协议。

从jconsole / visualvm指定要连接到服务器的URL时,请使用服务器端“-Dcom.sun.management.jmxremote.port”中设置的端口。