仓库中的三个角色
index docker 索引服务,负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
registry docker 仓库,是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过 Index
Auth service 的 Token 的方式进行认证
Registry Client Docker 充当 registry 客户端来维护推送和拉取,以及客户端的授权。
pull 原理
镜像拉取分为以下几步:
1.docker 客户端向 index 发送镜像拉去请求并完成与 index 的认证
2.index 发送认证 token 和镜像位置给 dockerclient
3.dockerclient 携带 token 和根据 index 指引的镜像位置取连接 registry
4.Registry 会根据 client 持有的 token 跟 index 核实身份合法性
5.index 确认此 token 合法性
6.Registry 会根据 client 的请求传递镜像到客户端。
镜像上传的步骤:
1.client 向 index 发送上传请求并完成用户认证
2.index 会发方 token 给 client 来证明 client 的合法性
3.client 携带 index 提供的 token 连接 Registry
4.Registry 向 index 合适 token 的合法性
5.index 证实 token 的合法性
6.Registry 开始接收客户端上传过来的镜像
Docker仓库的拉取(pull)和推送(push)动作是Docker生态系统中非常重要的功能,它们分别用于从远程仓库获取镜像、将本地镜像上传到远程仓库。
Docker仓库拉取(pull)动作原理
-
用户认证 :在拉取私有仓库中的镜像之前,通常需要通过
docker login
命令进行用户认证,提供正确的用户名和密码或访问令牌。 -
请求镜像 :用户通过
docker pull
命令指定要拉取的镜像名称和标签(tag),Docker客户端将这一请求发送给Docker守护进程(Docker Daemon)。 -
解析镜像地址:Docker守护进程首先会查询Docker Hub或配置的私有仓库,以找到镜像的完整地址。对于私有仓库,可能还需要配置registry的URL。
-
下载镜像层:镜像是由多个层(layer)组成的,每个层都是文件系统的快照。Docker守护进程会从远程仓库中逐个下载这些镜像层。在下载过程中,如果本地已经存在某个层,Docker会复用这一层,以减少下载的数据量。
-
解压并保存镜像 :下载完成后,Docker守护进程会将镜像层解压,并保存到本地Docker的存储目录中(通常是
/var/lib/docker/
下的某个子目录)。 -
创建镜像元数据:最后,Docker守护进程会创建镜像的元数据,包括镜像的ID、标签、大小等信息,并将其保存在本地Docker的数据库中。
Docker仓库推送(push)动作原理
-
用户认证 :在推送镜像之前,同样需要通过
docker login
命令进行用户认证,确保只有授权的用户才能将镜像推送到远程仓库。 -
标记镜像 :使用
docker tag
命令为本地镜像添加一个远程仓库的URL和标签(如果镜像尚未标记)。这个标签指定了镜像将被推送到哪个仓库以及在该仓库中的名称和版本。 -
推送镜像 :通过
docker push
命令发起推送请求,Docker客户端将这一请求发送给Docker守护进程。守护进程随后将本地的镜像层打包成一个或多个tar文件,并通过网络传输到远程仓库。 -
上传镜像层:在上传过程中,Docker守护进程会逐个上传镜像层。如果远程仓库中已存在某个层,Docker会跳过该层的上传,以节省时间和带宽。
-
保存镜像:远程仓库在接收到所有镜像层后,会将其解压并保存在仓库中。同时,仓库还会更新镜像的元数据,包括镜像的ID、标签、大小等信息。
-
验证和可用性 :一旦镜像被推送到远程仓库,其他用户就可以通过
docker pull
命令拉取并使用这个镜像了。远程仓库还会确保镜像的完整性和可用性,以便用户能够随时访问。
总结来说,Docker仓库的拉取和推送动作是通过Docker客户端与Docker守护进程的交互来实现的。这些动作涉及到用户认证、镜像层的下载/上传、解压/打包以及元数据的创建/更新等多个步骤。