Docker拉取鏡像部分成功部分失敗的解決方案
問(wèn)題背景
部署 Zitadel
時(shí),使用官方提供的 getting-started-with-zitadel.sh
腳本,腳本會(huì)拉取多個(gè) Docker 鏡像,比如:
ghcr.io/zitadel/zitadel
docker.io/library/caddy
netbirdio/**
等
問(wèn)題表現(xiàn)
在執(zhí)行過(guò)程中,有些鏡像可以拉取成功,有些會(huì)報(bào)如下錯(cuò)誤:
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)
觀(guān)察結(jié)果是:
鏡像 | 是否拉取成功 |
---|---|
ghcr.io/zitadel/zitadel | ? 成功 |
docker.io/library/caddy | ? 成功 |
netbirdio/management / netbirdio/signal | ? 超時(shí)失敗 |
同時(shí),我們很早就配置了一些 Docker Hub 鏡像加速器(如阿里云,騰訊云,DaoCloud 等),這也是為什么有些鏡像能順利拉取,有些卻不能的原因之一。
因?yàn)殓R像加速器僅能加速“Docker Hub 官方鏡像”,如 library/nginx 或 docker.io/library/caddy,而像 netbirdio/* 這種非官方項(xiàng)目的鏡像并不在加速器白名單內(nèi),因此仍然會(huì)拉取失敗。
初步排查
網(wǎng)絡(luò)本身沒(méi)有問(wèn)題
ping registry-1.docker.io
正常curl https://registry-1.docker.io/v2/
正常docker login
也沒(méi)有任何異常
但 Docker 拉取仍舊失敗
通過(guò)多次測(cè)試發(fā)現(xiàn),Docker 有些鏡像拉得飛快,有些鏡像卡死或超時(shí),尤其是 docker.io/netbirdio
相關(guān)的鏡像。
這時(shí)開(kāi)始懷疑:
可能和代理有關(guān)
解決思路:配置 Docker 的守護(hù)進(jìn)程代理
平時(shí)我們習(xí)慣配置終端代理,例如:
export http_proxy=http://127.0.0.1:7890 export https_proxy=http://127.0.0.1:7890
但實(shí)際上:
Docker 守護(hù)進(jìn)程(dockerd)是獨(dú)立運(yùn)行的,它不會(huì)繼承當(dāng)前 shell 的代理環(huán)境變量!
解決方案:配置 Docker 的 systemd 代理
- 創(chuàng)建代理配置目錄(如不存在):
sudo mkdir -p /etc/systemd/system/docker.service.d
- 創(chuàng)建代理配置文件:
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
- 寫(xiě)入以下內(nèi)容(根據(jù)你實(shí)際代理修改):
[Service] Environment="HTTP_PROXY=http://127.0.0.1:7890" Environment="HTTPS_PROXY=http://127.0.0.1:7890" Environment="NO_PROXY=localhost,127.0.0.1,.corp"
- 應(yīng)用配置并重啟 Docker:
sudo systemctl daemon-reexec sudo systemctl daemon-reload sudo systemctl restart docker
- 驗(yàn)證代理是否生效:
sudo systemctl show --property=Environment docker
輸出應(yīng)該包含你剛才設(shè)置的代理環(huán)境變量。
最終結(jié)果
重啟 Docker 后再次運(yùn)行部署腳本:
- 所有鏡像(包括 netbirdio)都能成功拉取
- 部署流程順利走完
總結(jié)
問(wèn)題 | 結(jié)論 |
---|---|
Docker 部分鏡像拉取失敗 | 是由于 Docker 守護(hù)進(jìn)程未配置代理,而不是網(wǎng)絡(luò)本身問(wèn)題 |
解決方案 | 配置 systemd 層面的 http-proxy.conf ,讓 dockerd 使用代理 |
驗(yàn)證方式 | systemctl show --property=Environment docker 查看生效狀態(tài) |
經(jīng)驗(yàn)教訓(xùn)
- Docker CLI 和 Docker 守護(hù)進(jìn)程環(huán)境是 兩套東西,網(wǎng)絡(luò)設(shè)置互不影響
- 如果你使用代理加速訪(fǎng)問(wèn) Docker Hub,務(wù)必同步設(shè)置到 系統(tǒng)服務(wù)級(jí)別
- 部署復(fù)雜服務(wù)時(shí),像 Zitadel 這類(lèi)一鍵腳本可能集成很多鏡像,盡早配置好代理 可避免不必要的卡頓
- 配置鏡像加速器雖然有用,但僅限于部分鏡像。像
netbirdio
、ghcr.io
上的鏡像,加速器是無(wú)法覆蓋的,因此守護(hù)進(jìn)程代理是更通用的做法 - Docker 官方解決文檔
以上就是Docker拉取鏡像部分成功部分失敗的解決方案的詳細(xì)內(nèi)容,更多關(guān)于Docker拉取鏡像部分成功部分失敗的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker部署nginx及nginx.conf文件配置方式
這篇文章主要介紹了docker部署nginx及nginx.conf文件配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Docker中優(yōu)化Mysql運(yùn)行內(nèi)存的操作
這篇文章主要介紹了Docker當(dāng)中優(yōu)化Mysql運(yùn)行內(nèi)存的操作,經(jīng)過(guò)一番操作可以?xún)?yōu)化為只占用100mb內(nèi)存,具體優(yōu)化方法及技巧跟隨小編一起看看吧2022-01-01利用docker搭建php7和nginx運(yùn)行環(huán)境全過(guò)程(官方鏡像)
docker提供了在服務(wù)端分布式的部署應(yīng)用,這樣的好處是方便維護(hù)和升級(jí)。下面這篇文章主要給大家介紹了利用docker搭建php7和nginx運(yùn)行環(huán)境的相關(guān)資料,搭建過(guò)程中運(yùn)用的是官方鏡像,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-05-05docker中運(yùn)行PostgreSQL容器的簡(jiǎn)單步驟
這篇文章主要給大家介紹了關(guān)于docker中運(yùn)行PostgreSQL容器的簡(jiǎn)單步驟,隨著docker的廣泛應(yīng)用,為了提供便利的管理,PostgreSQL數(shù)據(jù)庫(kù)也支持docker的安裝方式,需要的朋友可以參考下2023-08-08Docker將鏡像文件發(fā)布到阿里云的詳細(xì)過(guò)程
這篇文章主要介紹了Docker將鏡像文件發(fā)布到阿里云的操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05