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

  1. ss -tlnp | grep :PORT — was läuft auf dem Host?
  2. docker ps — welche Container sind aktiv?
  3. Host-Dienst stoppen oder Host-Port im Compose ändern
  4. Gestoppte Container mit docker rm sauber entfernen