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