So sieht die Meldung aus
Error response from daemon: driver failed programming external connectivity on endpoint web: Bind for 0.0.0.0:80 failed: port is already allocatedHäufige Ursachen
- Ein anderer Container veröffentlicht denselben Host-Port, häufig nach einem Wechsel des Compose-Projekts.
- Ein Dienst auf dem Host belegt den Port, etwa nginx, Apache oder Pi-hole.
- Ein alter Container läuft noch, weil
docker compose downnie ausgeführt wurde. - Ein Container nutzt
network_mode: hostund zusätzlich ein Portmapping. - Ein
docker-proxy-Prozess eines entfernten Containers hängt noch am Port.
Prüfen
- Wer hört auf dem Port?
ss -lntp | grep ':80 ' - Welcher Container veröffentlicht ihn?
docker ps --format 'table {{.Names}}\t{{.Ports}}' | grep ':80' - Alle Ports inklusive gestoppter Container
docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' - Hängende Proxy-Prozesse
ps aux | grep -i '[d]ocker-proxy'
Lösung
- Container finden und stoppen:
docker stop NAME, danachdocker compose up -derneut starten. - Host-Dienst identifizieren und entweder stoppen oder den Container auf einen anderen Port legen, etwa
8080:80. - Bei mehreren Compose-Projekten Ports bewusst verteilen statt zweimal 80 und 443 zu mappen.
- Alte Container mit
docker compose down --remove-orphansaufräumen. docker restartlöst das nicht: der Port bleibt belegt, solange der andere Prozess läuft.
Häufige Fragen
Können zwei Container auf Port 80 laufen?
Nicht direkt. Nur einer hält den Host-Port. Davor einen Reverse Proxy setzen und intern verschiedene Ports nutzen.
Der Port ist belegt, aber docker ps ist leer.
Dann hält ein Host-Prozess den Port. ss -lntp zeigt PID und Programm.