V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ggsl
V2EX  ›  Java

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

  •  
  •   ggsl · 2022-02-22 15:23:57 +08:00 · 1451 次点击
    这是一个创建于 1037 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了一个 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 的端口写成一样的就可以,请教大佬,我这个应该怎么修改?感谢

    5 条回复    2022-02-23 14:54:09 +08:00
    senninha
        1
    senninha  
       2022-02-22 17:35:24 +08:00
    xuanbg
        2
    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
        3
    xuanbg  
       2022-02-23 09:01:20 +08:00
    在容器内部,localhost 指的是容器本身而非宿主机,容器内部要访问宿主机就需要使用宿主机的 IP 地址。要想用 localhost 访问宿主机,加上--network host 参数,告诉容器网络是桥接模式就行了。
    ggsl
        4
    ggsl  
    OP
       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
        5
    ggsl  
    OP
       2022-02-23 14:54:09 +08:00
    @xuanbg 感谢回复,线上环境可能不会使用桥接模式,用其他方式解决了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:23 · PVG 22:23 · LAX 06:23 · JFK 09:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.