You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从外部访问虚拟机中Docker容器内的JMX接口?

Docker中SpringBoot应用JMX远程监控连接失败解决方案

排查步骤与修复方案

1. 修正JVM启动参数格式错误

你的Dockerfile中CMD的jar参数写法存在问题:

# 错误写法
CMD ["java", \
 "-Dcom.sun.management.jmxremote", \
 ...
 "-jar /app/myApp-1.0.0.jar"]

在CMD的数组格式中,每个命令参数必须是独立的字符串元素,需将"-jar /app/myApp-1.0.0.jar"拆分为两个元素:

# 正确写法
CMD ["java", \
 "-Dcom.sun.management.jmxremote", \
 "-Dcom.sun.management.jmxremote.authenticate=false", \
 "-Dcom.sun.management.jmxremote.ssl=false", \
 "-Dcom.sun.management.jmxremote.port=9010", \
 "-Dcom.sun.management.jmxremote.rmi.port=9010", \
 "-Djava.rmi.server.hostname=10.10.1.29", \
 "-jar", "/app/myApp-1.0.0.jar"]

这个错误会导致JVM无法识别jar包路径,应用可能未正常启动,直接造成JMX连接失败。

2. 验证网络与端口连通性

  • 本地测试虚拟机端口可达性:
    # 测试虚拟机连通
    ping 10.10.1.29
    # 测试9010端口是否开放
    telnet 10.10.1.29 9010
    # 或使用nc命令
    nc -zv 10.10.1.29 9010
    
  • 检查Ubuntu虚拟机防火墙:
    若启用了ufw,需开放9010端口:
    sudo ufw allow 9010/tcp
    sudo ufw reload
    
  • 确认Docker端口映射生效:
    执行docker ps,查看对应容器的PORTS列,需显示0.0.0.0:9010->9010/tcp,说明端口已正确映射到虚拟机。

3. 检查容器应用运行状态

查看容器日志,确认应用是否正常启动且JMX参数加载正确:

docker logs <你的容器名称或ID>

若日志中出现Could not find or load main class或JMX相关报错,说明启动参数或jar路径仍存在问题。

4. 简化JConsole连接方式

无需使用复杂的URL,直接在JConsole的「远程进程」输入框中填写:

10.10.1.29:9010

JConsole会自动解析JMX RMI连接,避免手动构造URL可能出现的格式错误。

5. 测试用额外配置(非生产推荐)

若上述步骤无效,可尝试在docker-compose.yml中切换为host网络模式(跳过端口映射,直接使用宿主机网络栈):

services:
  your-app:
    ...
    network_mode: host
    # 注释原ports配置,host模式下无需端口映射
    # ports:
    #   - "9010:9010"

内容的提问来源于stack exchange,提问作者Igor Pereverzev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:27:13