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_OPTS
和 JAVA_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
。端口 8080
和 8000
工作,因此 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
我正在尝试设置 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_OPTS
和 JAVA_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
。端口 8080
和 8000
工作,因此 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