我认为问题可能在于
java.rmi.server.hostname财产的价值。这必须是JMX客户端用于连接到JVM的主机名或IP地址。在第一种情况下,您直接使用来连接到容器
172.17.0.2:1099,此设置需要设置为
172.17.0.2。在后一种情况下,您通过docker机器访问容器
192.168.99.100:1099,则需要将设置设置为
192.168.99.100。
在研究非常相似的问题(同时被删除)的过程中,我偶然发现了一个博客条目(同时也被删除了)。尽管它已经很老了,但它让我知道了JMX连接的工作原理:
- JMX注册表侦听
<com.sun.management.jmxremote.port>
容器的端口 - 如果使用JConsole连接到注册表,则注册表将向客户端提供JMX服务URL。
- 客户端使用此URL来获取JMX对象
服务URL如下所示
service:jmx:rmi:///jndi/rmi://<java.rmi.server.hostname>:<com.sun.management.jmxremote.rmi.port>/jmxrmi。那是你的情况
service:jmx:rmi:///jndi/rmi://172.17.0.2:1099/jmxrmi。由于只能从docker机器内部访问此地址,因此无法从远程连接。在我的问题中,我涉及RMI端口方面的相同问题…
似乎没有针对此问题的开箱即用的解决方案。但是一个可以同时提供JMX端口和容器的环境变量启动外部主机名(或IP),如建议在这里。这些可以在JMX配置中使用:
docker run -p 1099:1099 -e "JMX_HOST=192.168.99.100" -e "JMX_PORT=1099" company/tomcat:8.0.30
和
CATALINA_OPTS="... -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=$JMX_PORT -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=$JMX_HOST"
不太好,但是应该可以…



