Docker Redis本地能Ping通但6379端口連不上的排查與解決方法
問題現(xiàn)象
環(huán)境信息:
- 宿主機 IP:
192.168.105.222(CentOS) - Redis 版本:
redis:7.4.6(Docker) - 端口映射:
0.0.0.0:6379->6379/tcp
故障表現(xiàn):
在宿主機本地使用 redis-cli 連接一切正常,但在遠程 Windows 機器上測試:
- Ping 正常(網(wǎng)絡(luò)層通暢)
- Telnet 失敗(TCP 連接拒絕/超時)
PS C:\Users\User> ping 192.168.105.222 來自 192.168.105.222 的回復(fù):字節(jié)=32 時間=1ms TTL=64 PS C:\Users\User> telnet 192.168.105.222 6379 正在連接192.168.105.222...無法打開到主機的連接。 在端口 6379: 連接失敗
排查過程
第一步:檢查 Redis 配置(排除法)
最常見的原因是 Redis 開啟了保護模式或設(shè)置了密碼。
$ docker exec redis redis-cli CONFIG GET protected-mode 1) "protected-mode" 2) "no" ? 已關(guān)閉 $ docker exec redis redis-cli CONFIG GET requirepass 1) "requirepass" 2) "" ? 無密碼
結(jié)論:Redis 配置沒有問題。
第二步:檢查 Docker 端口映射
確認 Docker 是否真的在監(jiān)聽外部端口。
$ docker ps --format "table {{.Names}}\t{{.Ports}}"
NAMES PORTS
redis 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp
$ ss -tlnp | grep 6379
LISTEN 0 1024 *:6379 *:* users:(("docker-proxy",pid=44615,fd=4))
結(jié)論:端口映射正常,docker-proxy 正在監(jiān)聽 0.0.0.0。
第三步:檢查防火墻與 iptables
$ systemctl status firewalld Active: inactive (dead) ? 防火墻已關(guān)閉 $ iptables -L -n | grep 6379 ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:6379 ? 規(guī)則存在
結(jié)論:防火墻未攔截,NAT 規(guī)則已生成。
第四步:檢查 IP Forwarding(鎖定元兇)
Docker 容器網(wǎng)絡(luò)依賴宿主機的 IP 轉(zhuǎn)發(fā) 功能。如果該功能被禁用,宿主機將無法將數(shù)據(jù)包從物理網(wǎng)卡轉(zhuǎn)發(fā)到 Docker 網(wǎng)橋。
$ sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0 ? 發(fā)現(xiàn)異常!
分析:
雖然 iptables 允許了流量,但 Linux 內(nèi)核層面的 IP 轉(zhuǎn)發(fā)開關(guān)是關(guān)閉的 (0)。這意味著當外部請求到達宿主機網(wǎng)卡后,內(nèi)核拒絕將其轉(zhuǎn)發(fā)給 Docker 容器,導(dǎo)致連接在 TCP 層直接被丟棄。
解決方案
方法一:臨時修復(fù)(立即生效,重啟失效)
sudo sysctl -w net.ipv4.ip_forward=1
方法二:永久修復(fù)(推薦,寫入配置)
編輯 /etc/sysctl.conf,添加或修改以下參數(shù):
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sudo sysctl -p
驗證結(jié)果
再次執(zhí)行檢查,確認參數(shù)已變?yōu)?1:
$ sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
此時遠程機器再次嘗試連接:
PS C:\Users\User> telnet 192.168.105.222 6379 Connected to 192.168.105.222. (連接成功!)
原理分析:為什么需要 ip_forward?
Docker 默認使用 bridge 網(wǎng)絡(luò)模式,這是一種 NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換)模式:
[遠程客戶端] -> (宿主機 IP:6379) -> [docker-proxy] -> (iptables NAT) -> [容器 IP:6379]
- 接收包:數(shù)據(jù)包到達宿主機的物理網(wǎng)卡(eth0)。
- 路由判斷:內(nèi)核發(fā)現(xiàn)目標 IP 是容器 IP(172.17.0.x),需要將包發(fā)送到 docker0 網(wǎng)橋。
- 轉(zhuǎn)發(fā)檢查:因為是從一個接口進,另一個接口出,這屬于**轉(zhuǎn)發(fā)(Forwarding)**行為。
- 如果
net.ipv4.ip_forward = 0:內(nèi)核直接丟棄包 ? - 如果
net.ipv4.ip_forward = 1:內(nèi)核允許包通過,交由 iptables 處理 ?
- 如果
總結(jié)
遇到 “本地能通,遠程不通” 的 Docker 端口問題時,除了檢查防火墻和端口映射,千萬別忽略內(nèi)核參數(shù) net.ipv4.ip_forward。
特別是有些系統(tǒng)安全加固腳本或最小化安裝的系統(tǒng),默認會關(guān)閉此參數(shù),導(dǎo)致 Docker 網(wǎng)絡(luò)功能受損。
到此這篇關(guān)于Docker Redis本地能Ping通但6379端口連不上的排查與解決方法的文章就介紹到這了,更多相關(guān)Docker Redis本地能Ping但6379端口連不上內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose管理容器network與ip問題
這篇文章主要介紹了docker-compose管理容器network與ip問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
docker+mongodb設(shè)置數(shù)據(jù)庫的賬號和密碼的實現(xiàn)步驟
本文主要介紹了docker+mongodb設(shè)置數(shù)據(jù)庫的賬號和密碼的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
docker imageid 和 digest區(qū)別解析
在Docker中,image ID和digest是兩個不同的標識符,用于唯一標識和引用Docker鏡像的不同方面,這篇文章主要介紹了docker imageid 和 digest區(qū)別,需要的朋友可以參考下2023-06-06
docker?部署?gitlab-ce?16.9.1的詳細過程
Docker是一個開源的應(yīng)用容器引擎,它允許開發(fā)者將應(yīng)用及其依賴打包到一個可移植的容器中,然后發(fā)布到任何支持Docker的Linux或Windows操作系統(tǒng)上,這篇文章主要介紹了docker?部署gitlab-ce?16.9.1的詳細過程,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-04-04
Docker中Compose與Kubernetes的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Docker中Compose與Kubernetes區(qū)別的相關(guān)資料,Docker Compose和Kubernetes(簡稱k8s)都是容器編排工具,需要的朋友可以參考下2023-08-08

