实际上,我想要一个适用于 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;
}
}
}
}
文件
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 许可协议
首先,您应该使用这些 JVM 参数运行您的应用程序:
然后你应该为 docker 公开端口:
还要使用 docker run 命令指定端口绑定:
之后,您可以使用 Jconsole 连接到本地 9010 端口并管理在 Docker 中运行的应用程序。