Docker 内 Tomcat 上的 JMX 和调试

JMX and Debugging on Tomcat inside Docker

我正在尝试设置 IntelliJ 以连接到 Tomcat 实例 运行ning 在 Docker 容器中。我希望能够使用远程调试并使用 JMX 进行远程部署。

我可以使用环境变量启用远程调试

JPDA_ADDRESS=8000
JPDA_TRANSPORT=dt_socket

并通过 catalina.sh jpda run 启动 Tomcat,因此远程调试没有问题。

我也可以用

CATALINA_OPTS='-agentlib:jdwp=transport=dt_socket,address=8000,suspend=n,server=y'

然后我不需要使用 catalina.sh jpda run

无论我做什么,我都无法让 JMX 工作。我确认我在 /usr/local/tomcat/lib` 中有 catalina-jmx-remote.jar

我试过将 CATALINA_OPTSJAVA_OPTS 设置为

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Djava.rmi.server.hostname=192.168.99.100
-Dcom.sun.management.jmxremote.ssl=false

我已经确认 192.168.99.100 是我 docker machine 的 IP。我已尝试使用 VisualJM 和 IntelliJ 连接到 JMX,但它不起作用。我已验证端口 1099 已打开并且可从主机使用。

Tomcat 正在接收 JMX args

20-Apr-2016 23:50:14.019 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=1099 -Djava.rmi.server.hostname=192.168.99.100 -Dcom.sun.management.jmxremote.ssl=false

为什么我不能让 JMX 工作?任何日志中都没有可用的信息,无论我尝试什么都行不通。

编辑:lsof -i :1099 什么都不显示 运行在该端口上

我运行宁Mac OS X。它是docker-machine但我相信docker使用mac 上的 virualbox,因为它本身不能 运行 容器。 我已经映射了端口。 docker ps 显示 0.0.0.0:1099->1099/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8080->8080/tcp。端口 80808000 工作,因此 1099 也应该正确映射。

当我为 jmxremote.host 和 server.hostname

使用 0.0.0.0 时,我能够连接
 HOST=0.0.0.0
    java -Xmn100M  -XX:+PrintGCDetails  -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -Xmx384M $JAVA_OPTS\
     -Dcom.sun.management.config.file=/opt/app/management.properties \
     -Djava.util.logging.config.file=/opt/app/logging.properties \
     -Dcom.sun.management.jmxremote.port=$JMX_PORT \
     -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT \
     -Dcom.sun.management.jmxremote.host=$HOST \
     -Djava.rmi.server.hostname=$HOST \
     -jar /opt/app/app.jar