gpt4 book ai didi

java - 如何从外部访问 docker 中的 JMX 接口(interface)?

转载 作者:IT老高 更新时间:2023-10-28 12:37:35 30 4
gpt4 key购买 nike

我正在尝试远程监控在 docker 中运行的 JVM。配置如下:

  • 机器 1:在 ubuntu 机器上的 docker 中运行 JVM(在我的情况下,运行 kafka); native IP为10.0.1.201;在 docker 中运行的应用程序位于 172.17.0.85。

  • 机器 2:运行 JMX 监控

请注意,当我从机器 2 运行 JMX 监控时,它会失败并出现以下错误版本(注意:当我运行 jconsole、jvisualvm、jmxtrans 和 node-jmx/npm:jmx 时会出现相同的错误):

对于每个 JMX 监控工具,失败时的堆栈跟踪如下所示:

java.rmi.ConnectException: Connection refused to host: 172.17.0.85; nested exception is
java.net.ConnectException: Operation timed out
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
(followed by a large stack trace)

现在有趣的部分是,当我在运行 docker 的同一台机器(上面的机器 1)上运行相同的工具(jconsole、jvisualvm、jmxtrans 和 node-jmx/npm:jmx)时,JMX 监控工作正常。

我认为这表明我的 JMX 端口处于 Activity 状态并且工作正常,但是当我远程执行 JMX 监控(从机器 2)时,JMX 工具似乎无法识别内部 docker IP (172.17.0.85)

以下是 JMX 监控工作的机器 1 上的相关(我认为)网络配置元素(注意 docker ip,172.17.42.1):

docker0   Link encap:Ethernet  HWaddr ...
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr:... Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6787941 errors:0 dropped:0 overruns:0 frame:0
TX packets:4875190 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1907319636 (1.9 GB) TX bytes:639691630 (639.6 MB)

wlan0 Link encap:Ethernet HWaddr ...
inet addr:10.0.1.201 Bcast:10.0.1.255 Mask:255.255.255.0
inet6 addr:... Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4054252 errors:0 dropped:66 overruns:0 frame:0
TX packets:2447230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2421399498 (2.4 GB) TX bytes:1672522315 (1.6 GB)

这是我收到 JMX 错误的远程机器(机器 2)上的相关网络配置元素:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=1<PERFORMNUD>

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether ....
inet6 ....%en1 prefixlen 64 scopeid 0x5
inet 10.0.1.203 netmask 0xffffff00 broadcast 10.0.1.255
nd6 options=1<PERFORMNUD>
media: autoselect
status: active

最佳答案

为了完整起见,以下解决方案有效。 JVM 应使用特定参数运行,以启用远程 docker JMX 监控,如下所示:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=<PORT>
-Dcom.sun.management.jmxremote.rmi.port=<PORT>
-Djava.rmi.server.hostname=<IP>

where:

<IP> is the IP address of the host that where you executed 'docker run'
<PORT> is the port that must be published from docker where the JVM's JMX port is configured (docker run --publish 7203:7203, for example where PORT is 7203). Both `port` and `rmi.port` can be the same.

完成此操作后,您应该能够从本地或远程计算机执行 JMX 监控(jmxtrans、node-jmx、jconsole 等)。

感谢 @Chris-Heald让这成为一个非常快速和简单的解决方案!

关于java - 如何从外部访问 docker 中的 JMX 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257968/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com