
写了一个 jmx 监控的小 demo ,代码如下
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName hellOname= new ObjectName("jmxBean:name=hello"); mbs.registerMBean(new Hello(), helloName); try { LocateRegistry.creteRegistry(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 的端口写成一样的就可以,请教大佬,我这个应该怎么修改?感谢
1 senninha 2022-02-22 17:35:24 +08:00 hostname 的问题,试试改成 0.0.0.0 看看? https://stackoverflow.com/questions/31257968/how-to-access-jmx-interface-in-docker-from-outside |
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 |
3 xuanbg 2022-02-23 09:01:20 +08:00 在容器内部,localhost 指的是容器本身而非宿主机,容器内部要访问宿主机就需要使用宿主机的 IP 地址。要想用 localhost 访问宿主机,加上--network host 参数,告诉容器网络是桥接模式就行了。 |
4 ggsl OP @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 感谢回复 |