Eigentlich wollte ich eine Lösung für JEE-Container, speziell für Glassfish, aber nachdem ich viele Kombinationen von Einstellungen ausprobiert und nicht erfolgreich war, reduzierte ich das Setup auf der einfachste mögliche Fall.Wie verbinde ich VisualVM mit einem einfachen Java-Prozess in einem Docker Container
Hier ist mein Hello World-Daemon in einem Docker-Container gestartet. Ich möchte jconsole
oder VisulaVM
daran anhängen. 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 .
Running: docker run -it --rm --name hwd hello-world-daemon
Fragen:
- welche JVM Parameter sollten auf 01.231.556 hinzugefügt werdenBefehlszeile?
- Welche Ports sollten veröffentlicht und veröffentlicht werden?
- Welchen Netzwerkmodus sollte der Docker-Container verwenden?
Ich zeige meine gescheiterten Versuche hier nicht, so dass richtige Antworten nicht voreingenommen sind. Dies sollte ein ziemlich häufiges Problem sein, aber ich konnte keine funktionierende Lösung finden.
Aktualisierung. Arbeitete Lösung
Diese Dockerfile arbeitet
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 Fahrbefehl
docker run -it --rm --name hwd -p 9010:9010 hello-world-daemon
VisualVM
über rechts verbindet klicken Local-> JMX-Verbindung, hinzufügen und dann localhost:9010
Eingabe, oder durch Hinzufügen eines Remote-Hosts.
JConsole
verbindet einen Fern Prozess mit localhost:9010
über die Auswahl.
Bei der Definition der Verbindung als remote kann jede von ifconfig
aufgelistete Schnittstelle verwendet werden. Zum Beispiel funktioniert docker0
Schnittstelle mit Adresse 172.17.0.1
funktioniert. Die Adresse des Containers 172.17.0.2
funktioniert auch.
Nope .. VisualVM: 'Es kann keine Verbindung zu localhost: 9010 mit Service: JMX: rmi: /// jndi/rmi: // localhost: 9010/jmxrmi'. Jconsole: 'Verbindung fehlgeschlagen: Fehler während JRMP-Verbindungsaufbau; verschachtelte Ausnahme ist: java.net.SocketException: Connection reset' – nolexa
Warum belichten Sie denselben Port zweimal? – nolexa
Verbinden Sie sich nicht mit localhost mit Ihrer Netzwerkschnittstelle. – eg04lt3r