🧪 场景

你执行 docker pull nginx:latest 时,Docker 是怎么一步步“下载镜像”的?
我们来把这个过程分解为实际步骤,同时继续用“汉堡 🍔”比喻帮助理解每一层。

✅ 第 1 步:解析镜像名

你输入的命令:
docker pull nginx:latest

Docker 其实会自动转换为:
registry-1.docker.io/library/nginx:latest

这个地址指的是:

  1. 官方 Docker Hub(registry-1.docker.io
  2. 官方镜像库(library)
  3. 镜像名:nginx
  4. 标签:latest

✅ 第 2 步:联系 Docker Hub

Docker 客户端向 Docker Hub 发出请求:
GET /v2/library/nginx/manifests/latest

这一步是拿到清单(manifest),这个清单里记录了:

  1. 这个镜像由哪些层组成
  2. 每一层的校验和(sha256)
  3. 每层的大小
  4. 支持的平台(比如 amd64、arm64)

📦 比喻:这就像餐厅菜单告诉你:这个汉堡由 5 层组成,分别是面包、生菜、牛肉、奶酪、酱料。

✅ 第 3 步:依次下载每一层(layer)

Docker 开始一个个去下载镜像层(也叫“blob”),请求长这样:
GET /v2/library/nginx/blobs/sha256:xxxxxxxxx

  • 每一层都是一个压缩包(通常是 tar.gz 文件),里面包含一部分文件系统的变更(新增/修改/删除文件)。

💡 这些“层”可以是:
层编号内容类比
Layer 1 Ubuntu OS 的基础文件系统 汉堡面包底
Layer 2 安装了一些库 加了生菜
Layer 3 加入了 Nginx 服务器 加了牛肉
Layer 4 默认配置文件等 加了酱
Layer 5 启动命令 插了一根旗子(告诉吃法)

✅ 第 4 步:校验层的完整性

  • 每层下载后,Docker 会对文件做 SHA256 校验,确保没有被篡改、损坏。

✅ 第 5 步:将层缓存到本地

层保存到你的本地磁盘:
Linux 路径通常是 /var/lib/docker/overlay2/(默认)

  • 每一层是增量的,可复用(比如多个镜像用的是同一个 ubuntu 基础层)

🧠 你下过 nginx 后再下 redis,可能会发现部分层都已经存在,不需要重新下载。

✅ 第 6 步:镜像构建完成,可以运行了

所有层都下载完之后,Docker 会将它们组合起来,做出一个“可以运行的汉堡”。
你可以用这个命令运行容器:
docker run -d nginx

  • 此时容器运行的文件系统,其实是多个只读层 + 一个可写层叠加起来的视图。

🧭 下载时你看到的输出,其实就是每一层:
比如执行时会看到这样的输出:
docker pull nginx:latest
latest: Pulling from library/nginx
ab5ef0e58194: Pull complete ← 第1层
9d6b7f3f1b66: Pull complete ← 第2层
e379e8d9f7cd: Pull complete ← 第3层

Digest: sha256:xxx…
每一条 Pull complete 就是一层成功下载并校验完成了。

✅ 小结一句话:

Docker 下载镜像时,不是一次性拿一个“压缩包”,而是像“叠汉堡”一样,一个个去下载构成镜像的文件系统层(layers),最后组合成可运行的镜像。