gpt4 book ai didi

java - 在 GCE 上的 Docker 中将 VisualVM 或 JConsole 附加到 Java

转载 作者:行者123 更新时间:2023-12-02 18:15:38 25 4
gpt4 key购买 nike

我正在尝试在远程 Java-in-Docker 进程上进行一些 CPU 采样。

我已经在这里查看了相关问题,并尝试了一切,但无济于事,所以我在这里发布了我的设置。

我有一个 Java 进程 (openjdk-8) 在 Google Compute Engine (GCE) 实例上的 Docker 容器中运行。 GCE 实例和容器都运行 Debian-9。我想将 VisualVM 或 JConsole 附加到我的 Java 进程。

我能够在本地运行我的 docker 容器并使用 localhost:9010 连接到 visualvm 和 jconsole。

我在 VM 启动脚本中使用以下命令启动容器:

docker run -d -p 9010:9010 <my container>

Dockerfile 还具有:
EXPOSE 9010

由 Dockerfile CMD 启动的 Java 进程具有以下相关参数:
"-Dcom.sun.management.jmxremote", \
"-Dcom.sun.management.jmxremote.port=9010", \
"-Dcom.sun.management.jmxremote.rmi.port=9010", \
"-Dcom.sun.management.jmxremote.local.only=false", \
"-Dcom.sun.management.jmxremote.authenticate=false", \
"-Dcom.sun.management.jmxremote.ssl=false", \

我使用以下命令在我的 gcloud 防火墙中打开了端口 9010:
gcloud compute firewall-rules create jmx-port --allow=tcp:9010,udp:9010

我已经用 netcat 验证了该端口是打开的,我可以与它建立 TCP 连接。

我从同一个 Docker 容器打开了其他端口,客户端成功连接到这些端口。它们以相同的方式暴露并映射到主机端口(-p port:port),并以相同的方式在防火墙中打开。

我正在传递 GCE 实例的外部 IP 地址。例如,如果我这样做:
gcloud compute instances list

它告诉我:
NAME            ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
my-server-b23j us-central1-d n1-standard-1 10.240.0.2 108.357.213.99 RUNNING

然后我将使用这个论点:
108.357.213.99:9010

作为远程 jmx 连接主机:端口对。

VisualVM 和 JConsole 都告诉我它们无法连接到远程 JMX 服务。在这两种情况下,我都拒绝安全连接,然后他们说:
Cannot connect to 108.357.213.99:9010 using
service:jmx:rmi:////jndi/rmi://108.357.213.99:9010/jmxrmi

无奈之下,我添加了一个防火墙规则,在所有端口 0-65535 上启用 TCP/UDP 连接,但这并没有什么区别——它们仍然无法连接。

我已经读过 JMX-RMI 打开匿名端口,并且您可以(至少部分?)通过指定以下两个来禁用此行为:
"-Dcom.sun.management.jmxremote.port=9010", \
"-Dcom.sun.management.jmxremote.rmi.port=9010", \

但是,在我的情况下,它不起作用。

我已阅读 here您需要指定 rmi 服务器主机名:
-Djava.rmi.server.hostname='192.168.99.100'

但是我的服务器 IP 是短暂的——它是在我创建实例时由 Google Compute Engine 分配的,因此我无法将它与其余的 Java args 硬连接到 Dockerfile 中。

我是否必须获得一个静态 IP 地址才能完成这项工作?

最佳答案

一种可能的解决方案是通过 ssh 进入您的 GCE 框和端口转发端口 9010。这可以从本地控制台完成:

gcloud compute ssh name-of-your-gce-engine -- -L 9010:localhost:9010

然后在 jconsolejvisualvm您连接到 localhost:9010 .这里使用 localhost 意味着 jconsole/jvisualvm将连接到您的本地机器,此连接通过 ssh 隧道连接到您的 GCE 引擎,然后连接到 -L 中定义的主机和端口。参数,即 localhost:9010 ,但从 GCE 引擎的角度来看。这意味着您将最终完成您的申请。

在启动程序之前,您仍然需要设置 rmi 服务器名称,但是您必须使用
-Djava.rmi.server.hostname='localhost'

这样 RMI 就会告诉 jconsole/jvisualvm使用 localhost,然后这将解析为您的本地隧道端点。当然,您仍然需要这些:
"-Dcom.sun.management.jmxremote", \
"-Dcom.sun.management.jmxremote.port=9010", \
"-Dcom.sun.management.jmxremote.rmi.port=9010", \
"-Dcom.sun.management.jmxremote.local.only=false", \
"-Dcom.sun.management.jmxremote.authenticate=false", \
"-Dcom.sun.management.jmxremote.ssl=false", \

关于java - 在 GCE 上的 Docker 中将 VisualVM 或 JConsole 附加到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45448881/

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