实际上,我想要一个适用于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
也可以。
Cannot connect to localhost:9010 using service:jmx:rmi:///jndi/rmi://localhost:9010/jmxrmi
。Jconsole:Connection failed: error during JRMP connection establishment; nested exception is: java.net.SocketException: Connection reset