Docker 客户端是如何拉取镜像的?

简介: Docker客户端拉取镜像的过程遵循Docker Registry HTTP API V2规范,主要分为解析镜像名、鉴权、获取Manifest、拉取Layers及本地合并五个步骤。它与Docker Hub、Harbor等仓库通信,确保镜像正确下载和构建。

Docker 客户端拉取镜像的过程可以分为几个主要阶段,它遵循 Docker Registry HTTP API V2 的规范来与镜像仓库(如 Docker Hub、Harbor、私有 Registry)进行通信。

✅ Docker 拉取镜像 的五个步骤:

步骤 描述
1. 解析镜像名 解析镜像名确定 Registry、仓库、Tag
2. 鉴权 鉴权获取 token(如需)
3. 获取 Manifest 获取 Manifest 读取镜像层次结构
4. 拉取 Layers 拉取 Layers 下载每一层 blob
5. 本地合并 本地合并解压层并构建本地镜像



Docker 拉取镜像流程详细解析

🧭 一、基本概念

  • 镜像命名格式[registry]/[namespace]/[repository]:[tag]
  • • 示例:docker.io/library/nginx:latest
  • 镜像组成:由多个层(layer)组成,每一层是一个只读的 tar blob 文件。

📥 二、拉取镜像的完整流程

1️⃣ 解析镜像地址

Docker 客户端会分析输入的镜像名,拆解为:

  • • Registry(默认为 docker.io
  • • Repository(如 nginx
  • • Tag(如 latest
  • • 若未指定 registry,默认使用 Docker Hub

2️⃣ 获取认证信息(可选)

  • • 针对私有仓库或已登录账号场景,Docker 客户端会尝试使用凭证(token 或 basic auth)进行身份认证

3️⃣ 请求镜像的 Manifest(清单)

Docker 客户端通过以下 HTTP 请求获取 manifest:

GET https://<registry>/v2/<repository>/manifests/<tag>
Accept: application/vnd.docker.distribution.manifest.v2+json
Authorization: Bearer <token>
  • • Manifest 描述镜像包含的层(layer)、对应的 digest、大小等元数据

4️⃣ 仓库响应 Manifest

仓库返回 JSON 格式的 manifest(精简示例):

{
  "schemaVersion":2,
"mediaType":"application/vnd.docker.distribution.manifest.v2+json",
"layers":[
    {
      "mediaType":"application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size":2816979,
      "digest":"sha256:abc123..."
    },
    ...
]
}

5️⃣ 客户端检查本地已有层

Docker 会比对 digest(sha256)与本地缓存,跳过已存在的层,仅下载缺失层

6️⃣ 并发下载镜像层(Blob)

每个镜像层通过以下 URL 请求拉取:

GET https://<registry>/v2/<repository>/blobs/<digest>
Authorization: Bearer <token>
  • • 此步骤通常并发执行以提升拉取速度

7️⃣ 解压和合并镜像层

  • • 拉取的 layer 为压缩的 tar 文件,Docker 会解压并按顺序叠加,构建最终文件系统

8️⃣ 生成本地镜像

  • • Docker 根据 manifest 内容生成本地镜像元数据(config、history、layer 关系)
  • • 镜像保存至本地镜像缓存,可通过 docker images 查看

🔒 安全补充:Registry 鉴权机制

  1. 1. 首次请求时,Registry 返回 401 Unauthorized,并附带认证 URL
  2. 2. Docker 客户端访问认证服务器(如 Docker Hub Token Server)获取 token
  3. 3. 后续请求附带 Authorization: Bearer

🧪 示例:拉取 nginx 镜像时的 HTTP 请求顺序

  1. 1. GET /v2/ → 检查 API 支持情况
  2. 2. GET /v2/library/nginx/manifests/latest
  3. 3. GET /v2/library/nginx/blobs/
  4. 4. GET /v2/library/nginx/blobs/
  5. 5. ...
  6. 6. 解压并组合成完整镜像

✅ 总结

步骤 描述
1. 解析镜像名确定 Registry、仓库、Tag
2. 鉴权获取 token(如需)
3. 获取 Manifest 读取镜像层次结构
4. 拉取 Layers 下载每一层 blob
5. 本地合并解压层并构建本地镜像


目录
相关文章
|
17天前
|
自然语言处理 数据可视化 Python
如何用通义灵码实现文本分析:以《红楼梦》人物出场统计为例
我们将分析一部红楼梦中关键角色出场次数前10位有哪些,并生成一个饼图。
252 24
|
13天前
|
数据采集 JSON API
Excel数据治理新思路:引入智能体实现自动纠错【Python+Agent】
本文介绍如何利用智能体与Python代码批量处理Excel中的脏数据,解决人工录入导致的格式混乱、逻辑错误等问题。通过构建具备数据校验、异常标记及自动修正功能的系统,将数小时的人工核查任务缩短至分钟级,大幅提升数据一致性和办公效率。
|
6天前
|
Linux 编译器 开发工具
在CentOS环境下升级GCC编译器的指南
总结:本文提供了一种方法来升级CentOS的GCC编译器,通过使用CentOS的软件集合和开发者工具集工具,可以比较平滑地进行升级。在整个过程中无需从源代码编译,这样既省去了复杂的编译过程,也避免了可能出现的与系统库不兼容的风险。请注意,使用第三方仓库可能会带来系统稳定性和安全性上的潜在影响。所有操作都应谨慎进行,并确保有相应的数据备份。
80 19
|
20天前
|
自然语言处理 监控 PyTorch
nanoVLM: 简洁、轻量的纯 PyTorch 视觉-语言模型训练代码库
nanoVLM 是一个基于 PyTorch 的轻量级工具包,专为训练视觉语言模型(VLM)设计。它结构简洁、易于理解,适合初学者快速上手。支持在免费 Colab Notebook 上训练,结合视觉 Transformer 与语言模型,实现图像理解和文本生成。项目受 nanoGPT 启发,注重代码可读性与实现效率。
74 15
|
18天前
|
机器学习/深度学习 人工智能 分布式计算
Post-Training on PAI (1):一文览尽开源强化学习框架在PAI平台的应用
Post-Training(即模型后训练)作为大模型落地的重要一环,能显著优化模型性能,适配特定领域需求。相比于 Pre-Training(即模型预训练),Post-Training 阶段对计算资源和数据资源需求更小,更易迭代,因此备受推崇。近期,我们将体系化地分享基于阿里云人工智能平台 PAI 在强化学习、模型蒸馏、数据预处理、SFT等方向的技术实践,旨在清晰地展现 PAI 在 Post-Training 各个环节的产品能力和使用方法,欢迎大家随时交流探讨。
kde
|
9天前
|
JSON Linux 数据格式
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
5657 14
|
26天前
|
人工智能 边缘计算 Serverless
震惊!CDN都进化到可以用MCP写游戏了吗?
《2048》是一款风靡全球的数字益智小游戏,玩家通过移动和合并相同数字完成2048即为通关。传统开发需数小时甚至数月,而使用ESA MCP Server只需1分钟“0代码”即可实现网页全球部署。ESA MCP Server是开源的Model Context Protocol服务实现,连接AI模型与边缘安全加速服务。结合阿里云边缘函数(ER),支持秒级全球节点部署,降低延迟,提升响应速度。环境搭建简单,仅需配置API密钥与插件,向AI提出需求即可快速生成并部署应用。
88 10
|
29天前
|
缓存 搜索推荐 应用服务中间件
301重定向核心技术解析
本文详细解析了301重定向技术原理及其应用。首先阐述HTTP 301状态码定义与特性,包括浏览器缓存规则和搜索引擎权重转移机制;接着介绍主流实现方案,如Nginx、Apache服务器配置及程序化实现(Flask示例);同时探讨SEO关键影响,强调权重传递条件与常见陷阱;最后给出性能优化建议,帮助减少重定向链长度并提升实施效果。
58 17