主機上的連接埠已經被其他程式佔用

執行指令:

docker run -d -p 8080:80 --name my-running-site your-app-name

錯誤訊息

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint my-running-site (bb1a1892c3dfbef2c9bb5ae4c4e91b3f432329958d26109e27d4ad5d6e2c4d20): Bind for 0.0.0.0:8080 failed: port is already allocated

實際上就是被 docker 占用, 但奇怪的是在 docker desktop 並沒有顯示該 image 在 running.

這個錯誤訊息代表主機上的 8080 連接埠已經被其他程式佔用了。Docker 無法將容器的 80 連接埠映射到一個正在使用中的主機連接埠,所以導致啟動失敗。

要解決這個問題,最快的方法是換一個主機連接埠來執行。你可以將指令中的 8080 改成其他數字,例如 8081 或 9000。請參考下方的修改範例:

Bash

docker run -d -p 8081:80 --name my-running-site-2 policy-app-node

如果你一定要使用 8080 連接埠,就必須先找出並停止目前正在佔用該位置的程式。在 Linux 或 macOS 系統,你可以使用以下指令查詢:

Bash

sudo lsof -i :8080

如果是 Windows 系統,則可以使用:

PowerShell

netstat -ano | findstr :8080

找出佔用的程序 ID 後將其關閉,或者如果是舊的 Docker 容器在佔用,請先執行 docker rm -f my-running-site 刪除舊容器,再重新執行原本的指令。


netstat -ano | findstr :8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14100
TCP [::]:8080 [::]:0 LISTENING 14100
TCP [::1]:8080 [::]:0 LISTENING 25212

根據你的查詢結果,目前有兩個不同的程序 ID (PID) 正在佔用 8080 連接埠,分別是 14100 和 25212。這就是為什麼你的 Docker 指令會失敗。

你可以直接在命令提示字元 (CMD) 使用 taskkill 指令來強制關閉這些佔用連接埠的程式。請依照順序執行以下指令:

DOS

taskkill /F /PID 14100
taskkill /F /PID 25212

參數 /F 代表強制執行,/PID 後面則是對應你剛才查到的編號。

執行完畢後,建議再次執行 netstat -ano | findstr :8080 確認清單已經變空。只要沒有任何回傳內容,就代表連接埠已經釋放,這時你就可以重新執行原本的 Docker 指令了。

如果你想知道這些 PID 具體是什麼軟體,可以在工作管理員的詳細資料分頁中,透過 PID 欄位找到對應的應用程式名稱。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *