共计 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 鉴权机制
- 第一次请求时,Registry 返回
401 Unauthorized
,并带上认证 URL。 - Docker 客户端访问认证服务器(如 Docker Hub Token Server)获取 token。
- 后续请求附带
Authorization: Bearer <token>
。
🧪 示例:拉取 nginx 镜像时的 HTTP 请求顺序
GET /v2/
→ 检查 API 是否支持GET /v2/library/nginx/manifests/latest
GET /v2/library/nginx/blobs/<digest-1>
GET /v2/library/nginx/blobs/<digest-2>
- …
- 解压并组合成完整镜像
✅ 总结
步骤 | 描述 |
---|---|
1. 解析镜像名 | 确定 Registry、仓库、Tag |
2. 鉴权 | 获取 token(如果需要) |
3. 获取 Manifest | 读取镜像层次结构 |
4. 拉取 Layers | 下载每一层 blob |
5. 本地合并 | 解压层并构建本地镜像 |
