Właściwie chciałem rozwiązania działającego na kontenery JEE, specjalnie dla Glassfish, ale po tym, jak spróbowałem wielu kombinacji ustawień i nie udało mi się, zmniejszyłem konfigurację do najprostszy możliwy przypadek.Jak dołączyć VisualVM do prostego procesu Java działającego w kontenerze Docker?
Oto mój demon Hello World uruchomiony w kontenerze Docker. Chcę do niego dołączyć jconsole
lub VisulaVM
. Wszystko jest na tej samej maszynie.
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"]
budynku: docker build -t hello-world-daemon .
bieganie: docker run -it --rm --name hwd hello-world-daemon
Pytania:
- co JVM parametry powinny być dodawane do
CMD
z linii poleceń? - jakie porty powinny być wyeksponowane i opublikowane?
- jaki tryb sieci powinien używać kontener Docker?
Nie pokazuję tutaj moich nieudanych prób, aby prawidłowe odpowiedzi nie były stronnicze. To powinien być dość powszechny problem, ale nie mogłem znaleźć działającego rozwiązania.
Aktualizacja. Pracował rozwiązanie
Ten Dockerfile działa
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
w połączeniu z poleceniem run doker
docker run -it --rm --name hwd -p 9010:9010 hello-world-daemon
VisualVM
łączy poprzez prawy przycisk myszy szczeblu lokalnym> Dodaj JMX Connection, a następnie wprowadzając localhost:9010
, lub poprzez dodanie zdalnego hosta.
JConsole
łączy się poprzez wybór zdalnego procesu z localhost:9010
.
Podczas definiowania połączenia jako zdalnego można użyć dowolnego interfejsu wymienionego pod numerem ifconfig
. Na przykład działa interfejs docker0
z adresem 172.17.0.1
. Adres kontenera 172.17.0.2
również działa.
Nope .. VisualVM: 'Nie można połączyć się z localhost: 9010 przy użyciu usługi: JMX: RMI: /// JNDI/RMI: // localhost: 9010/jmxrmi'. Jconsole: 'Połączenie nie powiodło się: błąd podczas ustanawiania połączenia JRMP; Zagnieżdżony wyjątek to: java.net.SocketException: zerowanie połączenia ' – nolexa
dlaczego dwa razy wystawiasz ten sam port? – nolexa
Połącz się z localhostem, do interfejsu sieciowego. – eg04lt3r