请教 jmx 在 docker 容器内映射端口的问题

2022-02-22 15:23:57 +08:00
 ggsl

写了一个 jmx 监控的小 demo ,代码如下

    MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
    ObjectName helloName = new ObjectName("jmxBean:name=hello");
    mbs.registerMBean(new Hello(), helloName);
    try {
        LocateRegistry.createRegistry(9999);

        JMXServiceURL url = new JMXServiceURL
                ("service:jmx:rmi://localhost:9999/jndi/rmi://localhost:9999/jmxrmi");

        System.out.println(url.getURLPath());
        System.out.println(url.getHost() + "  " + url.getPort());

        JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
        System.out.println("begin rmi start");
        jcs.start();
        System.out.println("rmi start");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (RemoteException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    

Dockerfile:

FROM java:8
copy jmx.jar /home
EXPOSE 9999

在测试机上执行:sudo docker run -p 9999:9999 --name jmxtest -it jmxtest java -jar home/jmx.jar

发现使用 JConsole 连接不上目标机器的 9999 端口,telnet 是通的;上网看了很多资料说是 rmi 和 jmx 的端口写成一样的就可以,请教大佬,我这个应该怎么修改?感谢

1420 次点击
所在节点    Java
5 条回复
senninha
2022-02-22 17:35:24 +08:00
xuanbg
2022-02-23 08:55:27 +08:00
用 localhost 访问的话,run 命令改成:sudo docker run --network host --name jmxtest -it jmxtest java -jar home/jmx.jar
xuanbg
2022-02-23 09:01:20 +08:00
在容器内部,localhost 指的是容器本身而非宿主机,容器内部要访问宿主机就需要使用宿主机的 IP 地址。要想用 localhost 访问宿主机,加上--network host 参数,告诉容器网络是桥接模式就行了。
ggsl
2022-02-23 14:52:46 +08:00
@senninha 0.0.0.0 没有解决问题,但是照您贴出的网址内,使用 jvm 参数启动 jmx 指定 hostname 为宿主机 ip 就可以访问了;

sudo docker run -p 9999:9999 --name jmxtest -it jmxtest java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Djava.rmi.server.hostname=10.0.201.123 -jar home/jmxc.jar
感谢回复
ggsl
2022-02-23 14:54:09 +08:00
@xuanbg 感谢回复,线上环境可能不会使用桥接模式,用其他方式解决了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835674

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX