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

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

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

public class Main {

public static void main(String[] args) {

while (true) {

try {

Thread.sleep(3000);

System.out.println("Hello, World");

} catch (InterruptedException e) {

break;

}

}

}

}

Docker文件

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也可以。

回答:

首先,您应该使用以下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中运行的应用程序。

以上是 如何将VisualVM附加到在Docker容器中运行的简单Java进程 的全部内容, 来源链接: utcz.com/qa/410769.html

回到顶部