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:
- Debugging beim Start der Java Anwendung aktivieren und Remote Debug Port im Docker Container veröffentlichen
- Beim Start des Containers den Port zum Docker Host durchschleifen
- Remote Debug Port per SSH zum Client tunneln
- 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.
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.