性能监控之JMX监控docker中的java应用

本文详细介绍了在Docker容器环境下配置JMX的具体步骤及注意事项,解释了JMX端口映射的重要性,并给出了实际配置示例。

今天在配置docker和JMX监控的时候,看到有一个细节和非容器环境中的JMX配置不太一样。所以在这里写一下,以备其他人查阅。

一般情况下,我们配置JMX只要写上下面这些参数就可以了。

以下是无密码监控时的JMX配置参数(有密码监控的配置和常规监控无异)。

 
  1. -Dcom.sun.management.jmxremote

  2. -Dcom.sun.management.jmxremote.port=9998

  3. -Djava.rmi.server.hostname=<serverip>

  4. -Dcom.sun.management.jmxremote.ssl=false

  5. -Dcom.sun.management.jmxremote.authenticate=false

但是在docker容器中这样配置的时候,会出现这个错误。 

图片

这里就要说明一下逻辑了。为什么会这样呢? 先看docker环境的网络结构。

容器使用默认的网络模型,就是bridge模式。在这种模式下是docker run时做的DNAT规则,实现数据转发的能力。所以我们看到的网络信息是这样的:

docker中的网卡信息:

 
  1. [root@f627e4cb0dbc /]# ifconfig

  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

  3.        inet 172.18.0.3  netmask 255.255.0.0  broadcast 0.0.0.0

  4.        inet6 fe80::42:acff:fe12:3  prefixlen 64  scopeid 0x20<link>

  5.        ether 02:42:ac:12:00:03  txqueuelen 0  (Ethernet)

  6.        RX packets 366  bytes 350743 (342.5 KiB)

  7.        RX errors 0  dropped 0  overruns 0  frame 0

  8.        TX packets 358  bytes 32370 (31.6 KiB)

  9.        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker中的路由信息:

 
  1. [root@a2a7679f8642 /]# netstat -r

  2. Kernel IP routing table

  3. Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

  4. default         gateway         0.0.0.0         UG        0 0          0 eth0

  5. 172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0

  6. [root@a2a7679f8642 /]#

宿主机上的对应网卡信息:

 
  1. docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

  2.        inet 172.18.0.1  netmask 255.255.0.0  broadcast 0.0.0.0

  3.        ether 02:42:44:5a:12:8f  txqueuelen 0  (Ethernet)

  4.        RX packets 6691477  bytes 4981306199 (4.6 GiB)

  5.        RX errors 0  dropped 0  overruns 0  frame 0

  6.        TX packets 6751310  bytes 3508684363 (3.2 GiB)

  7.        TX errors 0  dropp

连接 VisualVM 到运行在 Docker 容器中的 Java 应用程序,尤其是通过 JMXJava Management Extensions)方式,是进行性能分析和监控的重要手段。为了实现这一目标,需要从多个方面配置 Java 应用Docker 容器以及 VisualVM 工具。 ### 配置 Java 应用以启用 JMX 首先,确保 Java 应用程序在启动时启用了 JMX,并且允许远程连接。可以通过以下 JVM 参数来实现: ```bash -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false ``` 上述参数表示: - 启用 JMX 远程监控; - 指定 JMX 使用的端口为 `12345`; - 禁用 SSL 和身份验证(适用于开发环境,生产环境中应启用安全机制)[^1]。 在构建 Docker 镜像或运行容器时,将这些参数添加到 Java 启动命令中,例如: ```bash java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar your-app.jar ``` ### 配置 Docker 以暴露 JMX 端口 为了让外部工具能够访问 JMX 端口,需要在运行 Docker 容器时映射该端口。使用 `-p` 参数指定端口映射,例如: ```bash docker run -d -p 12345:12345 -p 8080:8080 your-java-app ``` 这样,JMX 监控工具就可以通过宿主机的 IP 地址和 `12345` 端口访问到容器内的 Java 应用。 ### 在 VisualVM 中连接 JMX 打开 VisualVM 后,按照以下步骤操作: 1. 在左侧“本地”节点下,右键点击并选择“添加 JMX 连接”。 2. 输入宿主机的 IP 地址和 JMX 端口号(如 `192.168.1.100:12345`),然后点击“确定”。 3. 如果一切配置正确,VisualVM 将会显示该 Java 应用监控信息,包括线程、内存、类加载等。 此外,还可以通过 VisualVM 的“远程”节点来管理不同主机上的 Java 应用监控连接。 ### 获取 Java 应用的 PID 通常,在容器内部运行的 Java 应用的 PID 可以通过以下方式获取: 1. **进入容器内部**:使用 `docker exec -it <container_id> /bin/bash` 命令进入容器。 2. **查找 Java 进程**:执行 `ps aux | grep java` 命令查看 Java 进程的 PID。 如果希望在宿主机上直接获取容器内 Java 应用的 PID,可以结合 `docker inspect` 和 `grep` 命令,例如: ```bash docker inspect --format='{{.State.Pid}}' <container_id> ``` 该命令会返回容器的主进程 PID,通常是 Java 进程的 PID。 ### 总结 通过合理配置 Java 应用Docker 容器以及 VisualVM 工具,可以顺利地将 VisualVM 连接到运行在 Docker 中的 Java 应用,并通过 JMX 协议进行性能监控和问题排查。同时,获取 Java 应用的 PID 对于进一步的调试和诊断也非常有帮助。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值