8.0 KiB
8.0 KiB
Docker-Troubleshooting und Best Practices
guideline_type: "technology" scope: "docker-troubleshooting" audience: ["developers", "devops", "ai-assistants"] last_updated: "2025-09-13" dependencies: ["docker-overview.md", "docker-architecture.md", "docker-development.md"] related_files: ["docker-compose.yml", "scripts/validate-docker-consistency.sh", "scripts/docker-versions-update.sh"] ai_context: "Troubleshooting common Docker issues, debug commands, and comprehensive best practices"
🔧 Troubleshooting
Häufige Probleme und Lösungen
🚫 Port-Konflikte
# Überprüfe, welche Ports verwendet werden
netstat -tulpn | grep :8080
lsof -i :8080
# Stoppe konfligierende Services
docker-compose down
sudo systemctl stop apache2 # Falls Apache läuft
🐌 Langsame Startup-Zeiten
# Überprüfe Container-Ressourcen
docker stats
# Health-Check Logs analysieren
docker-compose logs ping-service | grep health
# Java Startup optimieren
export JAVA_OPTS="$JAVA_OPTS -XX:TieredStopAtLevel=1 -noverify"
💾 Disk-Space Probleme
# Docker-Cleanup
docker system prune -a --volumes
docker volume prune
# Log-Rotation für Container
docker-compose logs --tail=1000 > /dev/null # Truncate logs
🌐 Service Discovery Issues
# Consul Status prüfen
curl -s http://localhost:8500/v1/health/state/any | jq
# Service Registration überprüfen
curl -s http://localhost:8500/v1/catalog/services | jq
# DNS-Resolution testen
docker-compose exec api-gateway nslookup ping-service
Debug-Kommandos
# Container introspection
docker-compose exec SERVICE_NAME sh
docker-compose exec postgres psql -U meldestelle -d meldestelle
# Live-Monitoring
docker-compose top
watch -n 1 'docker-compose ps'
# Memory und CPU-Usage
docker stats $(docker-compose ps -q)
# Detailed service logs
docker-compose logs -f --tail=50 SERVICE_NAME
🎯 AI-Assistenten: Troubleshooting-Schnellreferenz
Häufige Befehle
| Problem | Befehl | Beschreibung |
|---|---|---|
| Port belegt | netstat -tulpn | grep :<port> |
Port-Nutzung prüfen |
| Service startet nicht | docker-compose logs <service> |
Service-Logs anzeigen |
| Container hängt | docker stats |
Ressourcenverbrauch |
| DNS-Probleme | docker-compose exec <service> nslookup <target> |
DNS-Resolution testen |
| Disk voll | docker system prune -a --volumes |
Cleanup durchführen |
Debug-Workflows
Service startet nicht
docker-compose ps- Status prüfendocker-compose logs <service>- Logs analysierendocker-compose exec <service> sh- Container inspizieren- Health-Check-Endpoint testen
Performance-Probleme
docker stats- Ressourcenverbrauchdocker-compose top- Prozess-Übersicht- JVM-Parameter optimieren
- Resource-Limits anpassen
Netzwerk-Probleme
docker network ls- Netzwerke auflistendocker-compose exec <service> ping <target>- Connectivity testen- Consul Service-Discovery prüfen
- DNS-Resolution validieren
✅ Best Practices
🔐 Security Best Practices
- Non-Root Users: Alle Container laufen mit dedizierten Non-Root-Usern
- Minimal Base Images: Alpine Linux für kleinste Angriffsfläche
- Secrets Management: Externe Secret-Stores für Production
- Network Isolation: Dedizierte Docker-Networks
- Regular Updates: Automatische Security-Updates für Base Images
⚡ Performance Best Practices
- Multi-Stage Builds: Minimale Runtime-Images
- Layer Caching: Optimale COPY-Reihenfolge in Dockerfiles
- Resource Limits: Definierte Memory und CPU-Limits
- Health Checks: Proaktive Container-Health-Überwachung
- JVM Tuning: Container-aware JVM-Settings
🧹 Wartung Best Practices
- Version Pinning: Explizite Image-Versionen in Production
- Backup Strategies: Automatische Volume-Backups
- Log Rotation: Begrenzte Log-Datei-Größen
- Documentation: Aktuelle README-Dateien pro Service
- Testing: Automatisierte Container-Tests
🎯 Zentrale Verwaltung Best Practices
Single Source of Truth Prinzipien
# ✅ RICHTIG - Zentrale Version-Updates
./scripts/docker-versions-update.sh update java 22
./scripts/docker-versions-update.sh sync
# ❌ FALSCH - Manuelle Bearbeitung von Dockerfiles
vim dockerfiles/services/ping-service/Dockerfile # Version hardcoden
🤖 AI-Assistant Hinweis: Verwende immer das zentrale Versionssystem:
- Updates:
./scripts/docker-versions-update.sh update <component> <version>- Validierung:
./scripts/validate-docker-consistency.sh- Template-Updates:
./scripts/generate-compose-files.sh
Port-Verwaltung Richtlinien
-
Immer zentrale Port-Registry verwenden:
# docker/versions.toml - Port-Definitionen [service-ports] new-service = 8089 # Nächster verfügbarer Port -
Port-Konflikte vor Deployment prüfen:
./scripts/validate-docker-consistency.sh -
Port-Ranges einhalten:
- Infrastructure: 8081-8088
- Services: 8082-8099
- Monitoring: 9090-9099
- Clients: 4000-4099
Environment-Overrides Standards
-
Environment-spezifische Konfigurationen nutzen:
# Development export DOCKER_ENVIRONMENT=development # Production export DOCKER_ENVIRONMENT=production -
Konsistente Health-Check-Konfigurationen:
[environments.production] health-check-interval = "15s" health-check-timeout = "3s" health-check-retries = 3
Template-System Richtlinien
-
Compose-Files aus Templates generieren:
# Automatische Generierung bevorzugen ./scripts/generate-compose-files.sh # Manuelle Bearbeitung nur bei spezifischen Anpassungen -
Service-Kategorien korrekt zuordnen:
services/: Domain-Services (ping, members, horses)infrastructure/: Platform-Services (gateway, auth, monitoring)clients/: Frontend-Anwendungen (web-app, desktop-app)
Validierung und Konsistenz
-
Regelmäßige Konsistenz-Prüfungen:
# Bei jedem Build ./scripts/validate-docker-consistency.sh # In CI/CD Pipeline integrieren -
Build-Args Konsistenz:
# ✅ RICHTIG - Zentrale Referenz ARG GRADLE_VERSION ARG JAVA_VERSION # ❌ FALSCH - Hardcodierte Versionen ARG GRADLE_VERSION=9.0.0
IDE-Integration Best Practices
-
JSON Schema für Validierung aktivieren:
{ "yaml.schemas": { "./docker/schemas/versions-schema.json": "docker/versions.toml" } } -
Automatisierte Tasks nutzen:
- Docker: Show Versions
- Docker: Validate Consistency
- Docker: Build All Services
🚀 Entwickler-Workflow Best Practices
Neuen Service hinzufügen
# 1. Port in versions.toml reservieren
echo "new-service = 8089" >> docker/versions.toml
# 2. Template-basierten Service erstellen
./scripts/generate-compose-files.sh
# 3. Dockerfile aus Template erstellen
cp dockerfiles/templates/spring-boot-service.Dockerfile \
dockerfiles/services/new-service/Dockerfile
# 4. Build-Args und Environment synchronisieren
./scripts/docker-versions-update.sh sync
# 5. Konsistenz validieren
./scripts/validate-docker-consistency.sh
Version-Updates durchführen
# 1. Aktuelle Versionen prüfen
./scripts/docker-versions-update.sh show
# 2. Spezifische Version aktualisieren
./scripts/docker-versions-update.sh update java 22
# 3. Alle Build-Args synchronisieren
./scripts/docker-versions-update.sh sync
# 4. Services neu bauen
docker-compose build --no-cache
# 5. System-Tests durchführen
docker-compose up -d && make test
Navigation:
- Docker-Overview - Grundlagen und Philosophie
- Docker-Architecture - Container-Services und Struktur
- Docker-Development - Entwicklungsworkflow
- Docker-Production - Production-Deployment
- Docker-Monitoring - Observability