開發者
容器無法連到 Mac 上的 localhost
每個容器都有自己的網路堆疊。在容器內,localhost 是容器本身,而不是 Mac。
症狀
- 容器內的 App 連線到
localhost:5432或類似的連接埠時出現「connection refused」。 - 同一個 URL 在 Mac 上的 Safari 或「終端機」中可以正常使用。
- 開發容器連不到 Mac 上的模型伺服器或 API。
可能原因
- localhost 指向容器。容器會在自己的網路堆疊中尋找服務,但那裡沒有任何程式在監聽。
- 主機位址會改變。Docker 說明文件指出主機的 IP 位址會變動,因此另外提供一個代表主機的特殊名稱。
- Mac 上的防火牆。macOS 防火牆或其他防火牆 App 可能會阻擋連到該服務的傳入連線。
如何檢查
確認服務在 Mac 上可以正常運作。將 8000 換成你的連接埠。
curl http://localhost:8000查看 Mac 上的服務監聽哪個位址。
lsof -nP -iTCP:8000 -sTCP:LISTEN輸出
*:8000代表所有位址。127.0.0.1:8000代表只有回送(loopback)位址。如果映像檔內含 wget,可從容器內測試主機名稱。
docker exec my-container wget -qO- http://host.docker.internal:8000
如何修正
在容器內,使用
host.docker.internal而非localhost。Docker Desktop 和 OrbStack 都支援這個名稱。在 App 的設定中填入這個位址,例如透過環境變數。
docker run -e API_URL=http://host.docker.internal:8000 my-image使用 OrbStack 時,也可以改用主機網路模式。這樣在容器內就能透過
localhost連到 Mac 上的服務。docker run --net host my-image如果仍然無法連線,請檢查 macOS 防火牆設定。請參閱「macOS 防火牆阻擋傳入連線」。
使用 Kilobat
Kilobat 的檢查是在 Mac 上執行,而不是在容器內。加上
--context container即可取得要在容器內執行的指令。kilobat why http://localhost:8000 --context container如果是雲端託管的服務要呼叫你的 Mac,請使用
--context provider。Kilobat 會指出 localhost 是私有位址,該服務連不到。kilobat why http://localhost:8000 --context provider
常見問題
host.docker.internal 在 Linux 上也能用嗎?
本頁只涵蓋 Mac。在 Docker Desktop for Mac 和 OrbStack 上,這個名稱會解析為主機。
為什麼 Safari 連得到服務,容器卻不行?
Safari 在 Mac 上執行,所以 localhost 就是 Mac。容器則有自己的 localhost。
資料來源
- Docker Docs:Explore networking how-tos on Docker Desktop
- OrbStack Docs:Container networking
- OrbStack 說明文件:Host networking
- lsof(8),macOS 27.2 內建的 man 頁面
資料來源檢查日期:2026年10月29日。man 頁面為 macOS 內建版本;在終端機中用 man <name> 開啟。