Port already in use - den Konflikt finden und lösen
Port already in use - den Konflikt finden und lösen
Die Fehlermeldung bind: address already in use bedeutet: ein anderer Prozess belegt bereits den gewünschten Port — hier ist, wie man ihn findet und den Konflikt löst.
Was genau passiert
Wenn Docker einen Container startet und einen Host-Port binden will (z. B. 80:80), prüft das Betriebssystem, ob der Port bereits in Verwendung ist. Ist er es, schlägt der Bind fehl und der Container startet nicht.
Typische Fehlermeldung:
Error response from daemon: driver failed programming external connectivity:
Bind for 0.0.0.0:80 failed: port is already allocated
Den Verursacher identifizieren
Auf dem Host-System
# Linux
ss -tlnp | grep :80
lsof -i :80
# Ausgabe zeigt: PID, Prozessname, User
Häufige Kandidaten auf dem Host: nginx, apache2, caddy, oder ein anderer Dienst der beim Boot gestartet wird.
Laufende Container prüfen
docker ps
docker ps --format "table {{.Names}}\t{{.Ports}}"
Manchmal läuft bereits ein anderer Container mit demselben Port — oder ein Container ist zwar gestoppt, aber nicht entfernt, und Docker hat den Port intern noch nicht freigegeben.
# Alle Container anzeigen, auch gestoppte
docker ps -a
Gestoppter Container hält Port noch kurz
Docker kann einen Port noch für wenige Sekunden halten, nachdem ein Container gestoppt wurde. Kurz warten oder:
docker rm containername
Lösungen
Option 1: Kollidierenden Host-Dienst stoppen
sudo systemctl stop nginx
sudo systemctl disable nginx # dauerhaft deaktivieren
Option 2: Host-Port im Compose ändern
In docker-compose.yml ist das Format HOST_PORT:CONTAINER_PORT. Nur der linke Wert ist der Host-Port — den ändern:
ports:
- "8080:80" # statt 80:80 → jetzt auf Port 8080 erreichbar
Der Container selbst läuft intern weiter auf Port 80, was für die Anwendung transparent ist.
Option 3: Anderen Container entfernen
docker stop alterkontainer
docker rm alterkontainer
Option 4: Alle Ports eines Containers anzeigen
docker port containername
Dauerhafter Konflikt vermeiden
Dienste wie Apache oder Nginx werden unter XAMPP oft beim System-Start gestartet. Wer Docker für Webserver nutzt, sollte diese Dienste dauerhaft deaktivieren:
sudo systemctl disable apache2
sudo systemctl disable nginx
Alternativ: Docker-Container konsequent auf High-Ports (> 1024) mappen und einen Reverse Proxy (Caddy, Traefik) auf Port 80/443 laufen lassen, der intern weiterleitet. So gibt es nur einen einzigen Prozess, der Port 80 belegt.
Zusammenfassung
ss -tlnp | grep :PORT— was läuft auf dem Host?docker ps— welche Container sind aktiv?- Host-Dienst stoppen oder Host-Port im Compose ändern
- Gestoppte Container mit
docker rmsauber entfernen