实际上,我想要一个适用于JEE容器的解决方案,特别是针对Glassfish,但在尝试了许多设置组合并未成功后,我将设置简化为了最简单的情况。
这里是我的Hello World守护程序在Docker容器中启动。我想连接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;
}
}
}
}
Dockerfile
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
问题:
CMD
命令行应该添加哪些 JVM 参数?- 哪些端口应该被暴露和发布?
- 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
可以通过选择Remote process并输入localhost:9010
来连接。在将连接定义为远程连接时,可以使用
ifconfig
列出的任何接口。例如,具有地址172.17.0.1
的docker0
接口可用。容器的地址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
。 - nolexaMain
类名之后。所有-D
选项都被java
静默忽略了。 - nolexa-jar foo.jar
后的任何参数都会被发送到主类中的主函数(在 JAR 清单中定义为Main-Class
);基本上,-jar
之前的参数是针对 JVM 的,而-jar
之后的参数是针对正在运行的程序的。 - kbolino