如何将 VisualVM 附加到在 Docker 容器中运行的简单 Java 进程

新手上路,请多包涵

实际上,我想要一个适用于 JEE 容器的解决方案,特别是适用于 Glassfish,但在我尝试了多种设置组合但没有成功之后,我将设置简化为最简单的情况。

这是我在 Docker 容器中启动的 Hello World 守护进程。我想附加 jconsoleVisulaVM 到它。一切都在同一台机器上。

 public class Main {
  public static void main(String[] args) {
    while (true) {
      try {
        Thread.sleep(3000);
        System.out.println("Hello, World");
      } catch (InterruptedException e) {
        break;
      }
    }
  }
}

文件

FROM java:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]

建筑: docker build -t hello-world-daemon .

运行: docker run -it --rm --name hwd hello-world-daemon

问题:

  • 应将哪些 JVM 参数添加到 CMD 命令行?
  • 应该公开和发布哪些端口?
  • Docker容器应该使用什么网络模式?

我没有在这里展示我失败的尝试,这样正确的答案就不会出现偏差。这应该是一个很常见的问题,但我找不到可行的解决方案。

更新。工作解决方案

这个 Dockerfile 有效

FROM java:8
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", \
"-Dcom.sun.management.jmxremote", \
"-Dcom.sun.management.jmxremote.port=9010", \
"-Dcom.sun.management.jmxremote.local.only=false", \
"-Dcom.sun.management.jmxremote.authenticate=false", \
"-Dcom.sun.management.jmxremote.ssl=false", "Main"]
EXPOSE 9010

结合 docker run 命令

docker run -it --rm --name hwd -p 9010:9010 hello-world-daemon

VisualVM 通过右键单击 Local->Add JMX Connection ,然后输入 localhost:9010 进行连接,或者通过添加远程主机进行连接。

JConsole 通过选择 远程进程localhost:9010 连接。

将连接定义为远程时,可以使用 ifconfig 列出的任何接口。例如, docker0 地址为 172.17.0.1 的接口有效。容器的地址 172.17.0.2 也有效。

原文由 nolexa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 947
2 个回答

首先,您应该使用这些 JVM 参数运行您的应用程序:

 -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

然后你应该为 docker 公开端口:

 EXPOSE 9010

还要使用 docker run 命令指定端口绑定:

 docker run -p 9010:9010 -it --rm --name hwd hello-world-daemon

之后,您可以使用 Jconsole 连接到本地 9010 端口并管理在 Docker 中运行的应用程序。

原文由 eg04lt3r 发布,翻译遵循 CC BY-SA 3.0 许可协议

我遵循 了对类似问题的其他 SO 回复 并且它有效。

我通过添加这些 JVM 参数在容器内启动了我的 Java 进程:

 -Dcom.sun.management.jmxremote.port=<port> \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.rmi.port=<port> \
-Djava.rmi.server.hostname=$HOST_HOSTNAME

并启动 Docker 容器,指定 -e HOST_HOSTNAME=$HOSTNAME -p <port>docker run 命令。

然后,通过添加远程 JMX 连接(“文件”>“添加 JMX 连接 <dockerhostname>:<port> ”)并在“连接”输入,勾选“不需要SSL连接”。

原文由 Anthony O. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题