Docker部署服務(wù)端口無法訪問的排查與解決方法
引言
在使用 Docker 部署 Grafana 的過程中,我遇到了一個比較常見的問題:容器已經(jīng)啟動成功,宿主機本地能訪問 Grafana 的 3000 端口,但在局域網(wǎng)中卻無法訪問。
問題復(fù)現(xiàn)
啟動命令如下:
docker run -d \ --name=grafana \ -p 3000:3000 \ --restart always \ grafana/grafana:9.5.21
在宿主機上 訪問:
curl http://127.0.0.1:3000/login
可以正常返回 HTML 頁面。
在局域網(wǎng)其他機器瀏覽器訪問:
http://192.168.121.140:3000
卻始終打不開。
當(dāng)我使用 --network host 啟動時,外部訪問就完全正常。
初步排查
確認(rèn)容器端口映射
docker ps | grep grafana
輸出:
0.0.0.0:3000->3000/tcp
映射配置沒問題。
確認(rèn)進(jìn)程監(jiān)聽端口
ss -tulnp | grep 3000
顯示 docker-proxy 正常監(jiān)聽:

防火墻與 SELinux
- firewalld 已關(guān)閉
- SELinux 處于 Permissive 狀態(tài)
→ 并不是防護策略阻攔。
根因分析
查閱資料后發(fā)現(xiàn),問題可能出在 內(nèi)核 IP 轉(zhuǎn)發(fā)功能未開啟。
當(dāng)使用 -p 進(jìn)行端口映射時,Docker 需要依賴內(nèi)核的轉(zhuǎn)發(fā)功能(NAT 表規(guī)則)來把外部請求轉(zhuǎn)發(fā)到容器內(nèi)部。如果 net.ipv4.ip_forward 關(guān)閉,即使映射正常,也無法從外部訪問。
解決方案
檢查 IP 轉(zhuǎn)發(fā)狀態(tài)
sysctl net.ipv4.ip_forward

如果輸出是 0,說明轉(zhuǎn)發(fā)被關(guān)閉。
開啟 IP 轉(zhuǎn)發(fā)
編輯配置文件:
vi /etc/sysctl.conf
添加或修改:
net.ipv4.ip_forward=1
讓配置生效:
sysctl -p

重啟 Docker 服務(wù)
systemctl restart docker
重新啟動容器
docker restart grafana
驗證結(jié)果
此時在局域網(wǎng)其他機器上 訪問:
http://192.168.121.140:3000
Grafana 登錄頁面可以正常打開。

總結(jié)
- 使用
--network host時,容器直接占用宿主機端口,不依賴內(nèi)核轉(zhuǎn)發(fā),因此外部訪問正常。 - 使用
-p端口映射時,必須依賴內(nèi)核的 IP 轉(zhuǎn)發(fā)功能。如果未開啟,就會出現(xiàn)“本地能訪問,外部打不開”的情況。 - 最終解決方法就是:開啟 net.ipv4.ip_forward 并重啟 Docker。
到此這篇關(guān)于Docker部署服務(wù)端口無法訪問的排查與解決方法的文章就介紹到這了,更多相關(guān)Docker部署服務(wù)端口無法訪問內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker中鏡像構(gòu)建與緩存優(yōu)化實戰(zhàn)指南
在實際項目中,我們需要一套完善的鏡像構(gòu)建與緩存優(yōu)化方案,以提升構(gòu)建速度,降低帶寬與存儲成本,保證構(gòu)建穩(wěn)定性,下面我們就來看看具體實現(xiàn)方法吧2025-07-07

