從輸出能明確核心問題:服務器 DNS 解析異常——能 ping 通 jd.com 説明有外網鏈路,但無法解析 hub-mirror.c.163.com 這類鏡像源域名,導致 Docker 拉取鏡像超時。
分步解決 DNS 解析問題
步驟1:臨時配置可靠公共 DNS(立即生效)
# 備份原有resolv.conf
cp /etc/resolv.conf /etc/resolv.conf.bak
# 寫入阿里雲/谷歌公共DNS(優先用阿里雲,國內更穩定)
cat > /etc/resolv.conf << EOF
nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 8.8.8.8
EOF
步驟2:驗證 DNS 解析是否恢復
# 測試鏡像源域名解析
nslookup hub-mirror.c.163.com
nslookup registry.cn-hangzhou.aliyuncs.com
# 測試curl鏡像源
curl -I https://hub-mirror.c.163.com/v2/
- 正常情況:
nslookup會返回鏡像源的 IP 地址;curl返回HTTP/1.1 200 OK或401 Unauthorized(後者也算解析成功)。
步驟3:重啓 Docker 並重新拉取鏡像
systemctl restart docker
# 嘗試拉取nginx鏡像
docker pull nginx
步驟4:永久配置 DNS(避免重啓失效)
如果是 CentOS 7 系統,修改網卡配置文件永久生效:
# 編輯網卡配置(以eth0為例,根據實際網卡名修改)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 添加或修改以下兩行
DNS1=223.5.5.5
DNS2=223.6.6.6
# 重啓網絡服務
systemctl restart network
問題根源説明
- 為什麼能 ping jd.com 但解析不了鏡像源? 服務器原有 DNS 可能是內網 DNS,僅配置了
jd.com等常用域名的解析記錄,未同步 Docker 鏡像源的域名解析,導致小眾域名解析失敗。 - 公共 DNS 優勢 阿里雲
223.5.5.5/223.6.6.6、谷歌8.8.8.8是全球通用 DNS,包含絕大多數公網域名的解析記錄,能解決域名解析失敗問題。
兜底方案(若 DNS 仍無法修復)
如果修改 DNS 後還是無法解析,直接用離線鏡像導入的方法,步驟如下:
- 在能上網的機器拉取鏡像並導出:
docker save nginx > nginx.tar - 將
nginx.tar傳到目標服務器:rz或scp - 在目標服務器導入:
docker load < nginx.tar
你可以先執行步驟1-3測試DNS修復效果,看看能否正常拉取鏡像。