VisualVM/Jconsole无法连接容器内Micronaut应用求排查方案
容器端口映射验证
确认启动容器时是否已将JMX端口(默认1099)映射到宿主机,比如是否添加了-p 1099:1099参数。用docker ps查看容器端口映射状态,确保宿主机端口与容器内JMX端口一一对应,没有映射的话宿主机无法访问容器内的1099端口。JVM参数实际生效检查
进入容器内部,执行ps aux | grep java查看应用的实际JVM启动参数,重点确认以下关键参数是否正确配置:com.sun.management.jmxremotecom.sun.management.jmxremote.port=1099com.sun.management.jmxremote.rmi.port=1099(RMI端口需与JMX端口一致,避免额外端口映射)com.sun.management.jmxremote.authenticate=false(测试阶段先关闭认证,排除权限干扰)com.sun.management.jmxremote.ssl=false(测试阶段关闭SSL)java.rmi.server.hostname(必须设置为宿主机IP或容器可被外部访问的IP,不能用localhost,否则RMI会返回容器内部IP,宿主机无法解析)
网络连通性测试
在宿主机用telnet localhost 1099或nc -zv localhost 1099测试端口是否能连通,不通则说明端口映射失败或容器内JMX服务未监听该端口。
若宿主机测试不通,进入容器执行netstat -tulpn | grep 1099,确认Java进程是否正在监听1099端口,排查JMX服务是否正常启动。连接工具操作方式修正
不要使用VisualVM/JConsole的“本地进程”选项——容器内的JVM进程不属于宿主机本地进程,需选择“远程连接”,手动输入localhost:1099(或宿主机IP:1099)。如果之前配置了JMX认证或SSL,连接时需输入对应的用户名密码,或配置好SSL证书。容器网络模式排查
若容器使用--network=host模式,无需端口映射,但要确认java.rmi.server.hostname参数设置正确,且宿主机1099端口未被其他进程占用。
若使用自定义网络,需确保宿主机与容器网络互通,没有防火墙、安全组规则拦截1099端口。宿主机端口占用检查
执行netstat -tulpn | grep 1099查看宿主机1099端口是否被其他进程占用,若被占用,要么更换JMX端口,要么停止占用该端口的进程。
内容的提问来源于stack exchange,提问作者Manish

