Kurze Antwort
Der Fehler "port is already allocated" bedeutet, dass ein Prozess den angeforderten Port bereits verwendet. Finden Sie den Prozess mit `netstat` oder `lsof`, stoppen Sie ihn oder ändern Sie die Portzuordnung in der Docker-Konfiguration.
So erkennen Sie das Problem
- Docker zeigt den Fehler `Bind for 0.0.0.0:8080 failed: port is already allocated`
- Der Container startet nicht, obwohl das Image korrekt ist
- `docker ps` zeigt keinen Container, der den Port verwendet, aber der Fehler bleibt
- Der Port ist auch nach einem Neustart des Docker-Dienstes belegt
Häufigste Ursachen
Ein anderer Container verwendet denselben Port
Die häufigste Ursache ist ein laufender Container, der bereits denselben Port auf dem Host zuordnet. Prüfen Sie mit `docker ps`, ob ein Container mit demselben Port existiert.
Eine lokale Anwendung hält den Port
Ein Prozess auf dem Host (z. B. ein Entwicklungsserver, eine Datenbank) kann den Port belegen. Das kann eine Anwendung sein, die Sie vergessen haben zu schließen.
Ein vorheriger Container wurde nicht ordnungsgemäß gestoppt
Wenn ein Container gewaltsam entfernt wurde oder der Docker-Prozess unsachgemäß beendet wurde, kann ein verwaister Prozess zurückbleiben, der den Port hält. Manchmal müssen Ressourcen manuell freigegeben werden.
Ein anderer Dienst auf dem Host hält denselben Port
Ein anderer Dienst auf dem Host kann den Port halten, den Docker verwenden möchte (z. B. IIS, Apache). Prüfen Sie, ob der Port bereits in Verwendung ist, bevor Sie den Container starten.
Lösung Schritt für Schritt
- 1
Prüfen Sie, welche Container den Port verwenden
Führen Sie
docker psaus, um die Liste der aktiven Container und ihre zugeordneten Ports zu sehen. Wenn Sie einen Container finden, der denselben Port verwendet, stoppen Sie ihn mitdocker stop <Name_oder_ID>. Versuchen Sie dann erneut, Ihren Container zu starten. - 2
Finden Sie den Prozess auf dem Host, der den Port hält
Unter Linux verwenden Sie
sudo lsof -i :<Port>odersudo netstat -tulpn | grep <Port>, unter macOSsudo lsof -i :<Port>. Unter Windows öffnen Sie PowerShell als Administrator und führennetstat -ano | findstr :<Port>aus. Notieren Sie die PID des Prozesses. - 3
Stoppen Sie den Prozess, der den Port belegt
Unter Linux/macOS:
kill <PID>(oderkill -9 <PID>, wenn er nicht reagiert). Unter Windows:taskkill /PID <PID> /F. Seien Sie vorsichtig: Beenden Sie keine Prozesse, die Sie nicht kennen; das Beenden von Systemprozessen kann andere Anwendungen beeinträchtigen. - 4
Ändern Sie die Portzuordnung in der Docker-Konfiguration
Wenn Sie den Port nicht freigeben können, ändern Sie die Zuordnung im
docker run-Befehl oder indocker-compose.yml. Verwenden Sie beispielsweise statt-p 8080:80die Angabe-p 8081:80. Starten Sie dann den Container erneut. - 5
Bereinigen Sie verwaiste Container und Netzwerke
Manchmal sind verwaiste Container die Ursache. Führen Sie
docker ps -aaus, um alle Container zu sehen, und entfernen Sie nicht benötigte, zuvor gestoppte Container mitdocker rm <Name_oder_ID>. Sie können auchdocker system pruneverwenden, um gestoppte Container, ungenutzte Netzwerke, hängende Images und den Cache zu entfernen. Vorsicht: Dieser Befehl löscht diese Ressourcen dauerhaft. Prüfen Sie vor der Ausführung, was Sie benötigen, und erstellen Sie eine Datensicherung. - 6
Starten Sie den Docker-Dienst neu
Wenn der Port weiterhin belegt erscheint, starten Sie Docker neu: unter Linux
sudo systemctl restart docker, unter Windows starten Sie Docker Desktop neu. Prüfen Sie anschließend, ob der Port frei ist. - 7
Prüfen Sie, ob der Port freigegeben ist
Führen Sie erneut
netstatoderlsofaus, um zu bestätigen, dass der Port nicht mehr verwendet wird. Starten Sie dann Ihren Container mitdocker runoderdocker compose up.
Wenn nichts hilft
Wenn der Port trotz aller Schritte belegt bleibt, prüfen Sie, ob ein Dienst auf dem Host den Port automatisch belegt (z. B. Antivirus, VPN oder ein anderer Docker-Container). Sie können diese Dienste vorübergehend deaktivieren. Unter Linux zeigt sudo netstat -tulpn auch IPv4- und IPv6-Verbindungen an. Prüfen Sie daher, ob der Konflikt nur bei einer der beiden besteht. In extremen Fällen ändern Sie den Port, an den der Container gebunden wird (z. B. auf 8081), und aktualisieren Sie die Anwendungskonfiguration. Wenn auch das nicht funktioniert, ziehen Sie einen Neustart des Computers in Betracht.
So beugen Sie vor
- Bereinigen Sie gelegentlich gestoppte Container mit `docker container prune`, prüfen Sie aber vorher, ob Sie sie noch benötigen.
- Verwenden Sie Docker Compose (`docker compose`) und definieren Sie eindeutige Ports für jeden Dienst.
- Prüfen Sie vor dem Start eines Containers mit `netstat` oder `lsof`, ob der Port frei ist.
- Vermeiden Sie den Start mehrerer Instanzen derselben Anwendung auf demselben Port.
Wann Sie einen Profi rufen sollten
Wenn Sie den Prozess, der den Port hält, nicht finden können oder ein tieferliegendes Problem mit dem Docker-Netzwerk vermuten, wenden Sie sich an den IT-Support. Dieser kann Systemprozesse und die Konfiguration sicher überprüfen.
Software- und Produktentwicklung · Individuelle Apps, SaaS und ein MVP in 4 bis 8 WochenHäufige Fragen
Wie finde ich heraus, welcher Prozess den Port unter Windows verwendet?
Öffnen Sie PowerShell als Administrator und führen Sie `netstat -ano | findstr :<Port>` aus. Die letzte Spalte enthält die PID. Suchen Sie dann im Task-Manager auf der Registerkarte Details nach dem Prozess mit dieser PID.
Ist die Verwendung von `docker system prune` sicher?
`docker system prune` entfernt alle gestoppten Container, ungenutzte Netzwerke, hängende Images und den Build-Cache. Die Option `-a` entfernt auch alle ungenutzten Images. Das kann Speicherplatz freigeben, aber achten Sie darauf, nichts zu löschen, was Sie benötigen. Prüfen Sie vor der Ausführung die Containerliste und den Speicherplatzverbrauch.
Warum meldet Docker einen Fehler, obwohl keine aktiven Container vorhanden sind?
Möglicherweise hat ein Prozess auf dem Host oder ein verwaister Docker-Prozess den Port belegt. Prüfen Sie mit `netstat` oder `lsof`, um die eigentliche Ursache zu finden, und verwenden Sie `docker ps -a`, um gestoppte Container auszuschließen.