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

664次阅读
没有评论

共计 2014 个字符,预计需要花费 6 分钟才能阅读完成。

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

Docker 拉取镜像 的五个步骤:

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

国内拉取Docker镜像有困难,许多曾经常用的国内镜像站(包括各种云服务商和高校镜像站)已经无法使用。因此,本人开始搜索并汇总了目前可用的镜像站和镜像加速地址,并定期测试它们的可用性,公益更新这个列表:2025 Docker/DockerHub 国内镜像源/加速列表https://blog.xuanyuan.me/archives/1154

以下是完整的 Docker 拉取镜像(docker pull)的流程解析:


🧭 一、基本概念

  • 镜像命名格式[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:

php-template复制编辑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,例如(精简):

json复制编辑{
  "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 请求拉取:

php-template复制编辑GET https://<registry>/v2/<repository>/blobs/<digest>
Authorization: Bearer <token>

这一步通常是并发执行的,提高拉取速度。


7️⃣ 解压和合并镜像层

拉取到的 layer 是压缩的 tar 文件,Docker 会解压并将它们按顺序叠加,构建出最终的文件系统。


8️⃣ 生成本地镜像

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

🔒 安全补充:Registry 鉴权机制

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

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

  1. GET /v2/ → 检查 API 是否支持
  2. GET /v2/library/nginx/manifests/latest
  3. GET /v2/library/nginx/blobs/<digest-1>
  4. GET /v2/library/nginx/blobs/<digest-2>
  5. 解压并组合成完整镜像

✅ 总结

步骤 描述
1. 解析镜像名 确定 Registry、仓库、Tag
2. 鉴权 获取 token(如果需要)
3. 获取 Manifest 读取镜像层次结构
4. 拉取 Layers 下载每一层 blob
5. 本地合并 解压层并构建本地镜像
正文完
点击链接加入群聊【轩源技术交流群】:https://qm.qq.com/q/xrQ0LCYwTe
post-qrcode
 0
轩源
版权声明:本站原创文章,由 轩源 于2025-06-15发表,共计2014字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
支持作者

☝️用微信请我喝杯咖啡☕️

😛如果文章对您有用,请支持作者😛

支持作者

☝️用支付宝请我喝杯奶茶🧋

评论(没有评论)