Eigentlich wollte ich eine Lösung für JEE-Container, speziell für Glassfish, aber nachdem ich viele Kombinationen von Einstellungen ausprobiert hatte und keinen Erfolg hatte, reduzierte ich das Setup auf den einfachsten Fall.
Hier ist mein Hello World-Daemon, der in einem Docker-Container gestartet wurde. Ich möchte anhängen jconsoleoder VisulaVMdaran. Alles ist auf derselben Maschine.
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"]
Gebäude: docker build -t hello-world-daemon .
Laufen: docker run -it --rm --name hwd hello-world-daemon
Fragen:
- Welche JVM-Parameter sollten zur
CMDBefehlszeile hinzugefügt werden? - Welche Ports sollten verfügbar gemacht und veröffentlicht werden?
- Welchen Netzwerkmodus sollte der Docker-Container verwenden?
Ich zeige meine fehlgeschlagenen Versuche hier nicht, damit die richtigen Antworten nicht verzerrt werden. Dies sollte ein ziemlich häufiges Problem sein, aber ich konnte keine funktionierende Lösung finden.
Aktualisieren. Gearbeitete Lösung
Diese Docker-Datei funktioniert
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
in Kombination mit dem Docker-Befehl run
docker run -it --rm --name hwd -p 9010:9010 hello-world-daemon
VisualVMDie Verbindung wird hergestellt, indem Sie mit der rechten Maustaste auf Lokal-> JMX-Verbindunglocalhost:9010 hinzufügen klicken und dann eingeben oder einen Remote-Host hinzufügen.
JConsoleverbindet sich über die Auswahl eines Remote-Prozesses mit localhost:9010.
Wenn Sie die Verbindung als remote definieren, kann jede von aufgeführte Schnittstelle ifconfigverwendet werden. Zum Beispiel funktioniert die docker0Schnittstelle mit der Adresse 172.17.0.1. Die Adresse des Containers 172.17.0.2funktioniert auch.

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