如何从docker容器中运行的进程访问JMX(JavaBeans)

如何从docker容器中运行的进程访问JMX(JavaBeans),java,docker,jmx,Java,Docker,Jmx,当进程使用Docker运行时,为什么连接到JMX端口(使用JConsole)如此困难 当然,我已经将JMX端口公开给主机,甚至在运行Java进程时使用了特定于Sun的选项(按照中的说明) 我能够远程登录到主机ip和公开的JMX端口,这表明它是可访问的。但我无法找到一种使用JConsole并连接到容器中运行的JMX服务的方法 -Djava.rmi.server.hostname=$JMX_HOSTNAME -Dcom.sun.management.jmxremote.port=$JMX_PORT

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

当然,我已经将JMX端口公开给主机,甚至在运行Java进程时使用了特定于Sun的选项(按照中的说明)

我能够远程登录到主机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远程生命周期侦听器

请看一看:

我正在tomcat/lib目录中的catalina-jmx-remote.jar中使用此设置以通过:

-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

在过去,这两个港口必须是不同的。请先试试这个

如果这不起作用:

Tomcat提供了另一个组件来设置上面提到的第二个端口,JMX远程生命周期侦听器

请看一看:

我正在tomcat/lib目录中的catalina-jmx-remote.jar中使用此设置以通过:

-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

实际上,您需要这两个端口不同。一个端口用于RMI注册表,另一个端口用于远程处理协议


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

实际上,您需要这两个端口不同。一个端口用于RMI注册表,另一个端口用于远程处理协议


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

您当前拥有的端口看起来是正确的。至少要尝试让它工作起来,我会尝试禁用auth&ssl。然后,一旦它工作起来,考虑重新启用您需要的任何安全性:

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

您当前拥有的看起来是正确的。至少要尝试让它工作起来,我会尝试禁用auth&ssl。然后,一旦它工作起来,考虑重新启用您需要的任何安全性:

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


嘿,克里斯蒂安,我只是想说,我不是在用Tomcat。。它是运行少量托管bean的核心Java应用程序。这些设置仍然适用吗?这些设置是特定于tomcat的,对不起。嘿,Christian只是想说,我没有使用tomcat。。它是运行少量托管bean的核心Java应用程序。这些设置仍然适用吗?抱歉,这些设置是特定于tomcat的。不,这两个端口可以是相同的,如果在防火墙后面,它们可以是相同的(应该是默认行为)。不,这不是默认行为。当您不指定rmiport时,它是从瞬态范围中随机选择的。正如我所说的-一个端口用于RMI注册表,第二个端口用于实际的远程处理有线协议。我真的看不出这两个服务如何共享同一个端口。是的,我意识到这不是默认行为,我在发表一篇社论评论,我认为这应该是默认行为。这里有一些细节给你不,这两个端口可以是相同的,如果在防火墙后面,它们是相同的更好(应为默认行为)。不,这不是默认行为。当您不指定rmiport时,它是从瞬态范围中随机选择的。正如我所说的-一个端口用于RMI注册表,另一个用于实际的远程处理有线协议。我真的看不出这两个服务如何共享同一端口。是的,我意识到这不是默认行为,我正在做一篇社论评论,我认为这应该是默认行为。这里有一些细节,我假设JMX_主机名是外部可见的主机名?另外,你至少使用了jre/jdk 7+,对吗?@jtahlborn是的。我使用的是jdk 8,是的,JMX_主机名是外部可见的。这是一个简单的应用程序,具有良好的描述,我假设JMX_主机名E是外部可见的主机名?另外,您至少使用了jre/jdk 7+,对吗?@jtahlborn是的。我使用的是jdk 8,是的,JMX_主机名是外部可见的这里有一个很好的应用程序描述@Sohail-啊,我在您的问题中没有看到这些细节。@Sohail-啊,我在您的问题中没有看到这些细节。