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 jconsole
oder VisulaVM
daran. 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
CMD
Befehlszeile 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
VisualVM
Die 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.
JConsole
verbindet sich über die Auswahl eines Remote-Prozesses mit localhost:9010
.
Wenn Sie die Verbindung als remote definieren, kann jede von aufgeführte Schnittstelle ifconfig
verwendet werden. Zum Beispiel funktioniert die docker0
Schnittstelle mit der Adresse 172.17.0.1
. Die Adresse des Containers 172.17.0.2
funktioniert 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