如何解决Docker和Containerd拉取不了镜像的问题?_docker无法拉取镜像
由于hub docker禁止国内下载,对此,使用以下镜像加速器来解决此问题
什么是镜像加速器?
镜像加速器是一种代理服务,用于缓存公共镜像仓库(如 Docker Hub、Google Container Registry 等)中的镜像。其核心作用是:
- 加速镜像拉取:通过就近部署的服务器缓存镜像,减少跨国网络延迟。
- 降低上游压力:减少直接访问原始仓库的请求量,提升整体稳定性。
- 支持企业定制:可自建加速器,结合内网优化或安全策略
建议配置多个加速器
-
避免单点故障:如果某个加速器失效,Docker 会自动尝试下一个2。
-
提高成功率:不同加速器可能同步不同的镜像,多个地址可提高拉取成功率
### 解决Docker拉取不了镜像的问题 ###
docker.m.daocloud.io
是(DaoCloud国内知名容器服务提供商)提供的稳定加速器,推荐使用
sudo tee /etc/docker/daemon.json <<EOF{ \"registry-mirrors\": [ \"https://docker.m.daocloud.io\", \"https://docker.actima.top\", \"https://docker.1panel.live\" ]}EOFsystemctl restart dockerdocker pull nginx
镜像加速器的工作原理
当你在 Docker 中配置了镜像加速器,Docker 的拉取流程如下:
- 优先尝试第一个加速器拉取。
- 若第一个加速器无法访问(如网络错误、超时),则尝试第二个加速器。
- 若第二个加速器也无法访问,则尝试第三个加速器。
- 如果所有加速器均无法访问,最终回退到 Docker Hub进行拉取。
镜像加速器缓存机制:
- 如果加速器中有缓存该镜像,直接返回。
- 如果加速器中没有缓存,加速器会从上游源(如 Docker Hub)拉取镜像,并缓存一份在加速器中,后续请求可以直接使用缓存。
- 回退机制:如果镜像加速器无法访问或拉取失败,Docker 会回退到 Docker Hub进行拉取
### 解决Containerd拉取不了镜像的问题 ###
以下的所有修改均在/etc/containerd/config.toml目录文件下配置执行
### 配置docker.io仓库地址使用镜像加速 ###
vim /etc/containerd/config.toml... # 配置代理镜像站加速 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors] [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"] endpoint = [\"https://docker.m.daocloud.io\"]...systemctl restart containerd
镜像加速器的响应:以拉取 docker.io/nginx:latest
为例:
- 匹配镜像主机名:
Containerd 发现配置了docker.io
的mirrors
,使用对应的endpoint
。 - 向镜像加速器发起请求:
直接请求https://docker.m.daocloud.io/v2/nginx/manifests/latest
。 - 镜像加速器的响应:
- 成功:返回镜像数据。
- 失败(如 404 或网络错误):Containerd 不会尝试 Docker Hub,拉取直接失败。
镜像加速器的缓存逻辑
当 docker.m.daocloud.io本地无缓存时
,它会自动从 Docker Hub 拉取并缓存,再返回镜像数据
### 配置ghch.io仓库地址使用镜像加速 ###
# 配置镜像加速 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors] # ghcr镜像加速 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"ghcr.io\"] endpoint = [\"https://docker.m.daocloud.io\"]
### 配置多个加速地址方式 ###
中括号里面以逗号分隔多个加速地址,如下docker hub镜像加速
# 配置镜像加速 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors] # ghcr镜像加速 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"ghcr.io\"] endpoint = [\"https://docker.m.daocloud.io\"] # docker hub镜像加速 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"docker.io\"] endpoint = [\"https://docker.m.daocloud.io\", \"https://docker.mirrors.ustc.edu.cn\", \"https://registry.docker-cn.com\"]
### 配置Containerd使用私有镜像仓库 ###
不存在要使用的私有Image Registry时,本步骤可省略。
当要请求registry.tt.com镜像地址的时候,会去我们的私有镜像仓库拉取地址,https://registry.tt.com
[plugins.\"io.containerd.grpc.v1.cri\".registry][plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors] [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"registry.tt.com\"] endpoint = [\"https://registry.tt.com\"]
### 配置私有镜像仓库跳过tls验证 ###
若私有Image Registry能正常进行tls认证,则本步骤可省略
[plugins.\"io.containerd.grpc.v1.cri\".registry.configs] [plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"registry.tt.com\".tls] insecure_skip_verify = true
### 配置拉取K8S镜像使用阿里云镜像地址拉取 ###
[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors] # 当请求registry.k8s.io,会去https://registry.aliyuncs.com/google_containers拉取镜像 [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"registry.k8s.io\"] endpoint = [\"https://registry.aliyuncs.com/google_containers\"]
在以上的配置示例中,通过 endpoint
指定了阿里云镜像仓库地址(含命名空间),这与镜像加速器(Registry Mirror)的工作机制存在本质区别。以下是具体分析:
行为解释:
-
镜像地址重定向
- 当尝试拉取
registry.k8s.io/pause:3.6
时,Containerd 会将其重定向到https://registry.aliyuncs.com/google_containers/pause:3.6
。 - 本质是硬编码路径映射,而非代理镜像加速。
- 当尝试拉取
-
缓存功能缺失
- 阿里云镜像仓库
registry.aliyuncs.com/google_containers
没有自动缓存能力,镜像必须已存在于该仓库中才能拉取成功。 - 若该仓库中不存在
pause:3.6
,则拉取直接失败,不会回退到原始仓库registry.k8s.io
或 Docker Hub。 - google_containers 系早期社区爱好者自行创建的个人仓库,因其仓库公开 且 传播较广,可能导致了相当一部分误判为阿里云提供的公开社区镜像同步仓库。若该仓库未维护相关镜像:直接拉取失败,且无自动缓存或回退机制。
- 阿里云镜像仓库
镜像加速器与镜像仓库的区别
https://.mirror.aliyuncs.com
https://registry.aliyuncs.com/
nginx:latest
)registry.aliyuncs.com/ns/nginx