docker pull 镜像ai的理解
🧪 场景
你执行 docker pull nginx:latest 时,Docker 是怎么一步步“下载镜像”的?
我们来把这个过程分解为实际步骤,同时继续用“汉堡 🍔”比喻帮助理解每一层。
✅ 第 1 步:解析镜像名
你输入的命令:
docker pull nginx:latest
Docker 其实会自动转换为:
registry-1.docker.io/library/nginx:latest
这个地址指的是:
- 官方 Docker Hub(registry-1.docker.io)
- 官方镜像库(library)
- 镜像名:nginx
- 标签:latest
✅ 第 2 步:联系 Docker Hub
Docker 客户端向 Docker Hub 发出请求:
GET /v2/library/nginx/manifests/latest
这一步是拿到清单(manifest),这个清单里记录了:
- 这个镜像由哪些层组成
- 每一层的校验和(sha256)
- 每层的大小
- 支持的平台(比如 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),最后组合成可运行的镜像。