1. 镜像拉取的过程
1. 执行命令 docker pull image:tag
2. dockerd守护进程解析 docker 客户端参数由镜像名 + tag构成向 registry 请求Manifest 文件,
首先一个镜像可能会存在多个架构,故镜像仓库会保存一份 manifest lists, 根据宿主机的请求获得对应架构的manifest
3. 根据manifest中存放的imageId判断本地是否已经存放的对应的镜像,若有,则不在拉取。
对应的目录是 /var/lib/docker/image/overlay2/imagedb/content/sha256
4. 如没有则向仓库发起请求获取image config
5.从仓库获取对应的Image Config,并存放在上述目录/var/lib/docker/image/overlay2/imagedb/content/sha256
6. 根据image config中的diff_id, 查找 /var/lib/docker/overlay2 是否有对应的镜像层数据, 如有,则不在拉取
7. 如没有,根据manifest config 中镜像层的digestId 拉取镜像
8. 获取得到压缩后的镜像层
9. 解压镜像,对镜像层镜像进行sha256的哈希获取对应的值,和 image config 中的diff_id 镜像对比,一致则拉取成功,不一致则拉取失败
2. 镜像推送的过程
1 执行docker push image 发送请求给仓库registry
2. registry返回校验的token给docker-daemon
3. rigistry检查本次要上传的镜像层在仓库中是否已经存在?
4. 若存在,则docker daemon不再上传重复的镜像层,
5. 若不存在,则上传未存在的镜像。
6 发送上传结束的请求给registry
7. 上传manifest-config文件给rigistry
8. 检验镜像层文件和manifest-config文件的hash是否一致。