Docker無法連接到Docker?Hub和鏡像加速器的問題詳解
前言
今天遇到一個比較常見的問題,雖然嘗試了很多辦法仍然沒有解決(因為通過咨詢問題出在云主機那邊,只能等那邊解決),但是總結出了涉及多個方面,包括 DNS 配置、網(wǎng)絡連通性、防火墻設置等所有步驟和測試方案。
問題描述
當我們嘗試拉取 alpine 鏡像時,收到如下錯誤信息:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
同時,使用 curl 測試直接訪問 Docker Hub 的 HTTPS 端點也失敗了:
curl -v https://registry-1.docker.io/v2/
輸出顯示 Connection refused 和 Network is unreachable 錯誤。
診斷過程
1. 檢查 DNS 配置
首先,檢查當前配置的 DNS 服務器是否能夠解析所需的域名。使用 nslookup 命令測試:
nslookup registry-1.docker.io
結果表明:當前配置的 DNS 服務器無法解析部分國內鏡像加速器的域名,但可以解析 registry-1.docker.io。
2. 更換 DNS 服務器
修改系統(tǒng)的 DNS 設置可以幫助解決由于 DNS 解析問題導致的網(wǎng)絡連接問題。在 Linux 系統(tǒng)上,你可以通過修改 /etc/resolv.conf 文件來更改 DNS 服務器地址。然而,在許多現(xiàn)代 Linux 發(fā)行版中,直接編輯 /etc/resolv.conf 可能不會生效,因為該文件可能由系統(tǒng)服務(如 NetworkManager 或 systemd-resolved)管理。
以下是幾種常見的修改 DNS 設置的方法:
方法 1:直接編輯 /etc/resolv.conf
這種方法適用于那些不使用 NetworkManager 或 systemd-resolved 的系統(tǒng)。請注意,如果你的系統(tǒng)使用這些服務,直接編輯 /etc/resolv.conf 可能會在重啟后被覆蓋。
使用文本編輯器打開
/etc/resolv.conf文件:sudo nano /etc/resolv.conf
添加或修改 DNS 服務器地址。例如,添加 Google 的公共 DNS 服務器:
nameserver 8.8.8.8 nameserver 8.8.4.4
保存并關閉文件。
方法 2:通過 NetworkManager 修改
如果系統(tǒng)使用 NetworkManager,可以通過以下步驟修改 DNS 設置:
打開終端并列出所有網(wǎng)絡接口:
nmcli device show
找到你要配置的網(wǎng)絡接口名稱(例如
eth0),然后使用以下命令設置 DNS:sudo nmcli con modify "你的連接名稱" ipv4.dns "8.8.8.8 8.8.4.4" sudo nmcli con modify "你的連接名稱" ipv4.ignore-auto-dns yes sudo nmcli con up "你的連接名稱"
其中
"你的連接名稱"是你從nmcli connection show命令輸出中找到的網(wǎng)絡連接名稱。
方法 3:通過 systemd-resolved 修改
如果系統(tǒng)使用 systemd-resolved,可以通過編輯 /etc/systemd/resolved.conf 文件來設置全局 DNS:
編輯
/etc/systemd/resolved.conf文件:sudo nano /etc/systemd/resolved.conf
找到
[Resolve]部分,并添加或修改以下行:[Resolve] DNS=8.8.8.8 8.8.4.4
保存并關閉文件。
重啟
systemd-resolved服務以應用更改:sudo systemctl restart systemd-resolved
如果你的系統(tǒng)仍然使用
/etc/resolv.conf,你可能需要將其鏈接到systemd-resolved提供的 stub 文件:sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
方法 4:對于 Docker 守護進程單獨設置 DNS
如果你想只為 Docker 容器設置 DNS 服務器,可以在 Docker 的配置文件 /etc/docker/daemon.json 中進行配置:
編輯或創(chuàng)建
/etc/docker/daemon.json文件:sudo nano /etc/docker/daemon.json
添加或修改以下內容:
{ "dns": ["8.8.8.8", "8.8.4.4"] }保存并關閉文件。
重新加載 Docker 守護進程以應用更改:
sudo systemctl daemon-reload sudo systemctl restart docker
通過以上方法之一,你應該能夠成功地修改系統(tǒng)的 DNS 設置。選擇最適合你系統(tǒng)配置的方法進行操作即可
3. 測試新的 DNS 配置
確認新的 DNS 配置是否生效,并且能夠解析所需的域名:
nslookup registry-1.docker.io
如果這些命令返回有效的 IP 地址,則說明 DNS 配置正確。使用解析出來的 IP 地址進行測試:
curl -v https://<IP_ADDRESS>:443/v2/
如果直接使用 IP 地址仍然無法連接,可能是目標服務器對某些 IP 范圍有訪問限制,或者該服務暫時不可用。
4. 再檢查網(wǎng)絡連通性
使用 telnet 或 nc 命令測試端口連通性:
telnet registry-1.docker.io 443 # 或者 nc -zv registry-1.docker.io 443
如果這些命令顯示無法連接或超時,可能是因為防火墻或其他網(wǎng)絡安全設置阻止了出站 HTTPS 請求,而不僅僅是與 Docker Hub 的連接問題。
5. 使用阿里云鏡像加速器
如果 DNS 和基本網(wǎng)絡連通性都沒有問題,但仍無法通過 Docker Hub 下載鏡像,建議直接使用阿里云的鏡像加速器來拉取鏡像:
docker pull registry.cn-hangzhou.aliyuncs.com/library/alpine:latest
6. 檢查防火墻和安全組規(guī)則
最后,確保主機上的防火墻規(guī)則以及云服務提供商的安全組設置允許出站 HTTPS 流量(端口 443)。查看主機上的 iptables 規(guī)則:
sudo iptables -L -n | grep 443
同時,登錄到云控制臺,檢查與你的實例相關聯(lián)的安全組規(guī)則,確保允許出站 HTTPS 流量。
總結
通過逐步排查 DNS 配置、網(wǎng)絡連通性和防火墻設置,可以排除一些 Docker 容器無法連接到 Docker Hub 或鏡像加速器的問題。以下是關鍵步驟:
- 檢查并更換 DNS 服務器:確保能夠解析所有必要的域名。
- 測試網(wǎng)絡連通性:確認可以建立到 Docker Hub 的 HTTPS 連接。
- 使用鏡像加速器:嘗試使用國內的鏡像加速器下載鏡像。
- 檢查防火墻和安全組規(guī)則:確保沒有阻止出站 HTTPS 請求。
到此這篇關于Docker無法連接到Docker Hub和鏡像加速器的問題詳解的文章就介紹到這了,更多相關Docker無法連接Docker Hub和鏡像加速器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Docker刪除鏡像報錯:Error response from daemon:con
刪除Docker鏡像時遇到?jīng)_突,因為鏡像正在被一個運行中的容器使用,解決方法是先停止并刪除該容器,然后再嘗試刪除鏡像,此外,還可以選擇強制刪除鏡像,但這可能會導致數(shù)據(jù)丟失2024-11-11
docker 如何搭建私有倉庫(ubuntu 14.04,Docker版本1.6.4)詳細介紹
這篇文章主要介紹了docker 如何搭建私有倉庫(ubuntu 14.04,Docker版本1.6.4)詳細介紹的相關資料,需要的朋友可以參考下2017-01-01
Dockerfile 中 VOLUME 與 docker -v 的區(qū)別說明
這篇文章主要介紹了Dockerfile 中 VOLUME 與 docker -v 的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Docker 教程之存出和載入鏡像,移除及鏡像實現(xiàn)原理
這篇文章主要介紹了Docker 教程之存出和載入鏡像,移除及鏡像實現(xiàn)原理的相關資料,需要的朋友可以參考下2016-12-12

