Debugging einer Java Anwendung in einem entfernten Docker Container

Nehmen wir folgendes Szenario an: auf einem Linux Server läuft ein Docker-Container mit einer Java-Anwendung. Es kommt zu Problemen mit dem Container-Netzwerk und Dateizugriffen aus dem entfernten Container heraus, die man lokal nicht nachvollziehen kann. Die Idee ist per Remote Debugging aus der IDE heraus die Serveranwendung zu analysieren. Folgende Schritte sind notwendig:

  1. Debugging beim Start der Java Anwendung aktivieren und Remote Debug Port im Docker Container veröffentlichen
  2. Beim Start des Containers den Port zum Docker Host durchschleifen
  3. Remote Debug Port per SSH zum Client tunneln
  4. Remote Debugging in der IDE aktivieren

Docker File

Das Container Image wird von einem Alpine Linux mit vorinstalliertem OpenJDK 8 abgeleitet. Dann wird sowohl der Port der Java Webanwendung als auch der Debug-Port freigegeben und der Inhalt des Maven target Ordners im Container unter einem Arbeitsverzeichnis abgelegt. Beim Starten des demo.war muss dann noch das Remote Debugging aktiviert werden.

FROM openjdk:8-jre-alpine
EXPOSE 8080 
EXPOSE 50505 # Debug Port veröffentlichen
WORKDIR /tmp/java
COPY target .
CMD java ${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,address=50505,suspend=n,server=y -jar /temp/java/demo.war

Starten des entfernten Containers

Zunächst muss aus dem Docker File das Image erzeugt werden:

docker build -t demo_debug .

Anschließend kann der Container gestartet werden, dabei wird der Debug-Port nach außen gegeben.

docker run -p 50505:50505 -p 8000:8080 --name demo_debug demo_debug:latest

SSH-Tunnel

Im nächsten Schritt muss noch ein SSH-Tunnel aufgebaut werden, wobei sowohl der Remote-Debugging-Port 50505 als auch der Port der Java Webanwendung auf den Client-Rechner weitergeleitet wird.

ssh -L 50505:localhost:50505 -L 8000:localhost:8000 user@docker-host-you-name-it.com

Konfiguration IDE

In der Entwicklungsumgebung muss zu guter Letzt eine Remote Debugging Session gestartet werden. Bei IntelliJ erstellt man über “Run Configurations” eine neue Remote Konfiguration und verweist sie auf den Port 50505, siehe auch hier.

IntelliJ Debug Konfiguration

Das Vorgehen in Eclipse ist sehr ähnlich, man muss in den Debug-Konfigurationen einen Remote-Eintrag hinzufügen. Dann können in der IDE Breakpoints gesetzt und die Anwendung entsprechend analysiert werden.

Eclipse Debug Konfiguration

Short URL for this post: https://wp.me/p4nxik-3bG
This entry was posted in Java Runtimes - VM, Appserver & Cloud and tagged , , . Bookmark the permalink.

Leave a Reply