微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 浅析Docker镜像本地存储机制及容器启动原理

浅析Docker镜像本地存储机制及容器启动原理

时间:09-19 来源: 点击:

容器进行读文件操作有以下三种场景:

  容器层不存在: 要读取的文件在容器层中不存在,存储驱动会从镜像层逐层向下找,多个镜像层中若存在同名文件,上层的有效。

  文件只存在容器层:读取容器层文件

  容器层与镜像层同时存在:读取容器层文件

  修改文件或目录

  容器中进行文件的修改同样存在三种场景:

  第一次写文件:若待修改的文件在某个镜像层中,AUFS 会先执行 copy_up 操作将文件从只读的镜像层拷贝到可读写的容器层,然后进行修改。在文件非常大的情况下效率比较低下。

  删除文件:删除文件时,若文件在镜像层,其实是在容器层创建一个特殊的 writeout 文件,容器层访问不到,并没有实际删掉。

  目录重命名:目前 AUFS 还不支持目录重命名。

  OverlayFS

  OverlayFS 是一种类似 AUFS 的现代联合文件系统,但实现更简单,性能更优。OverlayFS 严格说来是 Linux 内核的一种文件系统,对应的 Docker 存储驱动为 Overlay 或者 Overlay2,Overlay2 需 Linux 内核 4.0 及以上,Overlay 需内核 3.18 及以上。且目前仅 Docker 社区版支持。条件许可的话,尽量使用 Overlay2,与 Overlay 相比,它的 inode 利用率更高。

  容器如何使用 Overlay/Overlay2 读写文件

  读文件存在以下三种场景:

  文件不存在容器层:若容器要读的文件不在容器层,会继续从底层的镜像层找

  文件仅在容器层:若容器要读的文件在容器层,直接读取,不用在底层的镜像层查找

  文件同时在容器层和镜像层:若容器要读的文件在容器层和镜像层中都存在,则从容器层读取

  修改文件或目录

  写文件存在以下三种场景:

  首次写文件:若要写的文件位于镜像层中,则执行 copy_up 将文件从镜像层拷贝至容器层,然后进行修改,并在容器层保存一份新的。若文件较大,效率较低。OverlayFS 工作在文件级别而不是块级别,这意味着即使对文件稍作修改且文件很大,也须将整个文件拷贝至容器层进行修改。但需注意的是,copy_up 操作仅发生在首次,后续对同一文件进行修改,操作容器层文件即可

  删除文件或目录:容器中删除文件或目录时,其实是在容器中创建了一个 writeout 文件,并没有真的删除文件,只是使其对用户不可见

  目录重命名:仅当源路径与目标路径都在容器层时,调用 rename(2) 函数才成功,否则返回 EXDEV

  远程镜像仓库如何存储镜像?

  不少人可能经常使用 Docker,那么有没有思考过镜像推送至远程镜像仓库,是如何保存的呢?Docker 客户端是如何与远程镜像仓库交互的呢?

  我们平时本地安装的 Docker 其实包含两部分:docker client 与 docker engine,docker client 与 docker engine 间通过 API 进行通信。Docker engine 提供的 API 大致有认证、容器、镜像、网络、卷、swarm 等。Docker engine 与 registry (即:远程镜像仓库)的通信也有一套完整的 API,大致包含 pull、push 镜像所涉及的认证、授权、镜像存储等相关流程,。目前常用 Registry 版本为 v2,Registry v2 拥有断点续传、并发拉取镜像多层等特点。能并发拉取多层是因为镜像的元信息与镜像层数据分开存储,当 pull 一个镜像时,先进行认证获取到 token 并授权通过,然后获取镜像的 manifest 文件,进行 signature 校验。校验完成后,依据 manifest 里的层信息并发拉取各层。其中 manifest 包含的信息有:仓库名称、tag、镜像层 digest 等。各层拉下来后,也会先在本地进行校验,校验算法采用 sha256。Push 过程则先将镜像各层并发推至 Registry,推送完成后,再将镜像的 manifest 推至 Registry。Registry 其实并不负责具体的存储工作,具体存储介质根据使用方来定,Registry 只是提供一套标准的存储驱动接口,具体存储驱动实现由使用方实现。

  目前官方 Registry 默认提供的存储驱动包括:微软 Azure、Google gcs、Amazon s3、OpenStack swift、阿里云 OSS、本地存储等。若需要使用自己的对象存储服务,则需要自行实现 registry 存储驱动。网易云目前将镜像存储在自己的对象存储服务 nos 上,故专门针对 nos 实现了一套存储驱动,另外认证服务也对接了网易云认证服务,并结合自身业务实现了一套认证、授权逻辑,并有效地限制了仓库配额。

  Registry 干的事情其实很简单,大致可分为:

  ① 读配置 ;

  ② 注册 handler ;

③ 监听。本质上 Registry 是个 HTTP 服务,启动后,监听在配置文件设定的某端口上。当 http 请求过来后,便会触发之前注册过的 Handler。Handler 包含 manifest、tag、b

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top