Docker-Unterstützung
Docker-Unterstützung
Abschnitt betitelt „Docker-Unterstützung“GalataJ unterstützt das Profilieren von Java-Anwendungen, die in Docker-Containern laufen, mit automatischer Erkennung und Registrierung.
Übersicht
Abschnitt betitelt „Übersicht“Docker-Container mit dem Agent registrieren sich automatisch beim Controller mittels Push-basierter Erkennung. Keine manuelle Konfiguration erforderlich!
Einrichtung
Abschnitt betitelt „Einrichtung“1. Agent in Dockerfile konfigurieren
Abschnitt betitelt „1. Agent in Dockerfile konfigurieren“Fügen Sie den Agent zu Ihrem Dockerfile hinzu:
# Agent JAR kopierenCOPY dist/agent/agent-core-1.0.0-SNAPSHOT.jar /agent/agent.jar
# Java-Agent konfigurierenENV JAVA_TOOL_OPTIONS="-javaagent:/agent/agent.jar=package=com.myapp"
# Optional: Projektname zur Identifikation setzenENV GALATAJ_PROJECT=my-service
# Optional: Controller-Host setzen (falls nicht localhost)ENV GALATAJ_CONTROLLER_HOST=host.docker.internalENV GALATAJ_CONTROLLER_PORT=98762. Docker-Image erstellen
Abschnitt betitelt „2. Docker-Image erstellen“docker build -t my-java-app .3. Controller starten
Abschnitt betitelt „3. Controller starten“Stellen Sie sicher, dass der Controller läuft:
galataj controller startWichtig: Wenn der Controller auf dem Host läuft und der Container sich verbinden muss:
- Verwenden Sie
host.docker.internal(Docker Desktop) oder - Verwenden Sie die IP-Adresse des Hosts oder
- Führen Sie den Controller in einem gemeinsamen Netzwerk aus
4. Container ausführen
Abschnitt betitelt „4. Container ausführen“docker run -d \ --name my-service \ -p 8080:8080 \ my-java-appDer Agent macht automatisch:
- Erkennt Docker-Umgebung
- Registriert sich beim Controller
- Beginnt, Metriken zu senden
Erkennung
Abschnitt betitelt „Erkennung“Docker-JVMs anzeigen
Abschnitt betitelt „Docker-JVMs anzeigen“galataj jvmsAusgabe:
Found 2 JVM(s):
1. my-service ID: def456 Environment: docker App: my-service Container: abc123def456Docker-spezifische Felder
Abschnitt betitelt „Docker-spezifische Felder“Docker-JVMs zeigen:
- Environment:
docker(anstelle vonlocal) - Container ID: Docker-Container-Kennung
- App Name: Aus der
GALATAJ_PROJECTUmgebungsvariable - PID: Nicht verfügbar (null für Docker)
Anhängen
Abschnitt betitelt „Anhängen“An Docker-JVM anhängen
Abschnitt betitelt „An Docker-JVM anhängen“Mit JVM-ID:
galataj attach --jvm-id def456Hinweis: Docker-JVMs verwenden Push-basierte Erkennung, sie sind also bereits registriert. Der Attach-Befehl bestätigt die Verbindung.
Umgebungserkennung
Abschnitt betitelt „Umgebungserkennung“Der Agent erkennt automatisch die Docker-Umgebung durch Prüfung von:
- Existenz der Datei
/.dockerenv /proc/self/cgroupenthält “docker”DOCKER_HOSTUmgebungsvariable- Container-ID aus Hostname oder cgroup
Registrierungsablauf
Abschnitt betitelt „Registrierungsablauf“Wenn ein Docker-Container startet:
- Agent startet mit Java-Anwendung
- Erkennt Docker-Umgebung
- Registriert sich beim Controller via HTTP POST:
POST http://controller:9877/api/v1/jvms/register
- Sendet Heartbeat alle 30 Sekunden
- Sendet Metriken via TCP auf Port 9876
Registrierungs-Payload
Abschnitt betitelt „Registrierungs-Payload“{ "jvmId": "uuid-generated", "environment": "docker", "containerId": "order-service", "appName": "order-service", "labels": { "project": "order-service" }}Heartbeat
Abschnitt betitelt „Heartbeat“Docker-Agents senden periodische Heartbeats:
- Intervall: Alle 30 Sekunden
- Endpunkt:
POST /api/v1/jvms/{jvmId}/heartbeat - Zweck: Registrierung aktiv halten,
lastSeenAtaktualisieren
Der Controller entfernt veraltete JVMs nach 60 Sekunden ohne Heartbeat.
Controller-Netzwerkkonfiguration
Abschnitt betitelt „Controller-Netzwerkkonfiguration“Docker Desktop (Mac/Windows)
Abschnitt betitelt „Docker Desktop (Mac/Windows)“Verwenden Sie host.docker.internal:
ENV GALATAJ_CONTROLLER_HOST=host.docker.internalENV GALATAJ_CONTROLLER_PORT=9876Verwenden Sie die Host-IP oder ein gemeinsames Netzwerk:
Option 1: Host-IP
ENV GALATAJ_CONTROLLER_HOST=172.17.0.1Option 2: Gemeinsames Netzwerk
# Netzwerk erstellendocker network create profiler-net
# Controller im Netzwerk ausführendocker run -d --network profiler-net --name controller ...
# App im selben Netzwerk ausführendocker run -d --network profiler-net ...Docker Compose
Abschnitt betitelt „Docker Compose“version: '3.8'services: controller: # Controller-Service (falls containerisiert)
app: build: . environment: - JAVA_TOOL_OPTIONS=-javaagent:/agent/agent.jar=package=com.myapp - GALATAJ_PROJECT=my-service - GALATAJ_CONTROLLER_HOST=controller - GALATAJ_CONTROLLER_PORT=9876 networks: - profiler-net
networks: profiler-net: driver: bridgeKubernetes
Abschnitt betitelt „Kubernetes“GalataJ funktioniert auch in Kubernetes:
- Agent-JAR einbinden als ConfigMap oder Volume
- JAVA_TOOL_OPTIONS setzen im Deployment
- Controller-Host konfigurieren zu Service-Name oder IP
- Agents registrieren sich automatisch
Beispiel-Deployment:
apiVersion: apps/v1kind: Deploymentmetadata: name: my-appspec: template: spec: containers: - name: app env: - name: JAVA_TOOL_OPTIONS value: "-javaagent:/agent/agent.jar=package=com.myapp" - name: GALATAJ_CONTROLLER_HOST value: "profiler-controller.default.svc.cluster.local" volumeMounts: - name: agent mountPath: /agent volumes: - name: agent configMap: name: profiler-agentFehlerbehebung
Abschnitt betitelt „Fehlerbehebung“Container erscheint nicht
Abschnitt betitelt „Container erscheint nicht“Problem: Docker-JVM nicht in der jvms-Liste
Lösung:
- Prüfen Sie, ob Agent konfiguriert ist:
echo $JAVA_TOOL_OPTIONS - Verifizieren Sie, dass Controller vom Container erreichbar ist
- Controller-Logs prüfen:
logs/profiler-controller.log - Netzwerkkonnektivität verifizieren
Verbindung abgelehnt
Abschnitt betitelt „Verbindung abgelehnt“Problem: Agent kann sich nicht mit Controller verbinden
Lösung:
- Controller-Host/Port-Konfiguration prüfen
- Netzwerkkonnektivität verifizieren:
ping controller-host - HTTP-Endpunkt testen:
curl http://controller:9877/api/v1/status - Firewall-Regeln prüfen
Veraltete JVMs
Abschnitt betitelt „Veraltete JVMs“Problem: Alte Container noch in der Liste
Lösung:
- Controller entfernt automatisch nach 60 Sekunden ohne Heartbeat
- Oder manuell entfernen:
galataj detach --jvm-id <id>
Best Practices
Abschnitt betitelt „Best Practices“- Projektnamen verwenden: Setzen Sie
GALATAJ_PROJECTfür einfache Identifikation - Gemeinsame Netzwerke: Verwenden Sie Docker-Netzwerke für bessere Isolation
- Ressourcenlimits: Setzen Sie angemessene Speicher-/CPU-Limits
- Health-Checks: Überwachen Sie die Agent-Registrierung in Logs
- Labels: Verwenden Sie Labels zum Filtern und Organisieren
Nächste Schritte
Abschnitt betitelt „Nächste Schritte“- Erfahren Sie mehr über die IntelliJ-Integration
- Erkunden Sie CLI-Befehle