当前位置: 首页 > article >正文

docker仓库的工作原理

仓库中的三个角色
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)动作原理

  1. 用户认证:在拉取私有仓库中的镜像之前,通常需要通过docker login命令进行用户认证,提供正确的用户名和密码或访问令牌。

  2. 请求镜像:用户通过docker pull命令指定要拉取的镜像名称和标签(tag),Docker客户端将这一请求发送给Docker守护进程(Docker Daemon)。

  3. 解析镜像地址:Docker守护进程首先会查询Docker Hub或配置的私有仓库,以找到镜像的完整地址。对于私有仓库,可能还需要配置registry的URL。

  4. 下载镜像层:镜像是由多个层(layer)组成的,每个层都是文件系统的快照。Docker守护进程会从远程仓库中逐个下载这些镜像层。在下载过程中,如果本地已经存在某个层,Docker会复用这一层,以减少下载的数据量。

  5. 解压并保存镜像:下载完成后,Docker守护进程会将镜像层解压,并保存到本地Docker的存储目录中(通常是/var/lib/docker/下的某个子目录)。

  6. 创建镜像元数据:最后,Docker守护进程会创建镜像的元数据,包括镜像的ID、标签、大小等信息,并将其保存在本地Docker的数据库中。

Docker仓库推送(push)动作原理

  1. 用户认证:在推送镜像之前,同样需要通过docker login命令进行用户认证,确保只有授权的用户才能将镜像推送到远程仓库。

  2. 标记镜像:使用docker tag命令为本地镜像添加一个远程仓库的URL和标签(如果镜像尚未标记)。这个标签指定了镜像将被推送到哪个仓库以及在该仓库中的名称和版本。

  3. 推送镜像:通过docker push命令发起推送请求,Docker客户端将这一请求发送给Docker守护进程。守护进程随后将本地的镜像层打包成一个或多个tar文件,并通过网络传输到远程仓库。

  4. 上传镜像层:在上传过程中,Docker守护进程会逐个上传镜像层。如果远程仓库中已存在某个层,Docker会跳过该层的上传,以节省时间和带宽。

  5. 保存镜像:远程仓库在接收到所有镜像层后,会将其解压并保存在仓库中。同时,仓库还会更新镜像的元数据,包括镜像的ID、标签、大小等信息。

  6. 验证和可用性:一旦镜像被推送到远程仓库,其他用户就可以通过docker pull命令拉取并使用这个镜像了。远程仓库还会确保镜像的完整性和可用性,以便用户能够随时访问。

总结来说,Docker仓库的拉取和推送动作是通过Docker客户端与Docker守护进程的交互来实现的。这些动作涉及到用户认证、镜像层的下载/上传、解压/打包以及元数据的创建/更新等多个步骤。


http://www.kler.cn/a/284343.html

相关文章:

  • 第 13 章 -Go 语言 接口
  • 基于node一键发布到服务器的js脚本
  • 火车车厢重排问题,C++详解
  • 当你想要conda安装遇到UnavailableInvalidChannel: HTTP 404 NOT FOUND for channel的问题
  • [Linux] Linux信号捕捉
  • 深度学习——优化算法、激活函数、归一化、正则化
  • Apache CloudStack Official Document 翻译节选(十)
  • 零基础转行学网络安全怎么样?
  • sheng的学习笔记-AI-基于分歧的方法
  • 高性价比百元学生党蓝牙耳机怎么选?2024四款年度耳机推荐揭秘!
  • redis作为缓存,mysql的数据如何与redis同步
  • 力扣52-最大子序和(java详细题解)
  • AI产品经理系列:如何应对AI时代?
  • 设置 Nginx、MySQL 日志轮询
  • Java-树形图工具类TreeUtil
  • 网通产品硬件设计工程师:百兆超薄网络隔离变压器您知道的有多少呢?
  • 【PyCharm激活码】2024年最新pycharm专业版激活码+安装教程!
  • 【Android】使用 ADB 查看 Android 设备的 CPU 使用率
  • 项目技巧二
  • R语言股价跳跃点识别:隐马尔可夫hmm和 GARCH-Jump对sp500金融时间序列分析
  • “添加”业务功能开发
  • Qt 杨帆起航
  • 【分布式定时任务】XXL-JOB_2.4.1部署与实战
  • 解决Element-ui中Table表格里的show-overflow-tooltip不兼容safari浏览器问题
  • vue-admin-template pan版使用方法
  • 【秋招笔试】8.24阿里控股秋招(研发岗)-三语言题解