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

