5分钟!带你吐槽容器镜像中那些让人一言难尽的事情

存储 存储软件
现如今容器生态大受欢迎有许多原因,其中一个就是应用部署上的优秀体验,容器镜像的出现是这种体验能够成为现实的一个基础。

 

本文转载自微信公众号「云巅论剑」,作者Liu,Bo 。转载本文请联系云巅论剑公众号。 

容器镜像中那些让人一言难尽的事情

现如今容器生态大受欢迎有许多原因,其中一个就是应用部署上的优秀体验,容器镜像的出现是这种体验能够成为现实的一个基础。

简要回顾一下容器镜像,概括为几点:

  1. 它提供了一个应用软件运行的完整操作系统包,是不可变基础设施的一部分,其格式(https://docs.docker.com/storage/storagedriver/?spm=ata.13261165.0.0.567e1b43DoMXC0)如下图1 所示。
  2. 镜像中一个重要的概念是layer,引用docker documentation(https://docs.docker.com/storage/storagedriver/?spm=ata.13261165.0.0.567e1b43DoMXC0#images-and-layers)中的介绍,"Each layer is only a set of differences from the layer before it. The layers are stacked on top of each other."
  3. 一个容器镜像是由一个或多个layer组成的。
  4. 容器镜像是存储在registry中的,诸如 Docker Hub(https://hub.docker.com/?spm=ata.13261165.0.0.567e1b43DoMXC0)和公有云提供商的registry service。

但今天我们要一起来吐槽一下容器镜像。

1. 首次启动中大型镜像很慢

第一次运行时总是需要等上几分钟,这是因为在正式启动一个容器之前,还需要一些准备工作:

  1. 从registry下载镜像,包含了镜像的所有layers,比如上图的镜像"rust:latest"中包含6 layers,
  2. 把镜像layers一个接一个地解压到本地filesystem中,
  3. 最后用overlayfs 将这些layer组合为一个mount point作为容器的rootfs,
  4. 启动容器。

其中,当启动一个庞大的镜像时,最耗时的是第一步中的下载镜像,但因为单一layer是一个整体,对同一个layer无法并行下载,与此同时镜像size很大通常意味着包含的layer size也很大,所以大部分时间都花在了网络传输上。

2. 去重低效

如果大家关注过镜像base layer,比如上图中的CentOS 和 Ubuntu,其中的目录结构是相同的标准操作系统根分区结构,内容也是类似的,那么我们很自然地可以想到,在registry中存储的时候会将他们去重(Deduplication)吗?

对于上图这种情况,registry 现在不会做去重,原因仍是“单一layer是一个整体”,registry 的去重是基于layer的digest id的,即如果两个不同镜像使用了同一个layer,那么在registry上只存一个layer。

3. 对删除和链接的处理

先说删除,当对lower layer中的一个file做unlink时,会在upper layer 发生什么?

现在的逻辑是在upper layer添加一个特殊的white-out empty file来表示被unlink的file,以达到最终视图上的unlink效果。

“你说你一个没点,完事我们还得搭一个是不"

想象一下,如果想删掉一个password file,这个white-out 做法会带来什么后果?

再说hardlink,当对lower layer中的一个file做hardlink时,会在upper layer发生什么?当前采取了一种笨拙的做法,即把lower layer file拷贝一份到upper layer,再添加对应的hardlink。当这个file size 很大时,那么浪费的存储空间就相当可观了。

4. 安全审计不完整

再说一个安全审计上的问题,因为镜像每一个layer都有对应的digest id,在镜像下载之后可以对layer进行校验,但当把镜像layers一个接一个地解压到本地filesystem中之后呢?我们没有办法再去校验了,因为本质上解压后的filesystem目录和镜像的layers是两种不同的形态了,所以运行时的安全审计是缺失的。

成也layer,败也layer

我们回过头来看,上面的问题除了最后的安全审计,其它的原因都可以归结为“以layer为基本单位的镜像格式”。所以,虽然选择layer的设计是为了让不同的应用软件镜像能够共用同一部分基础系统,达到节省存储和节省传输的目的,但是在实践中用户们也逐渐发现了它带来的难以workaround的问题。

欲知详情,且听明天分解。。。

 

责任编辑:武晓燕 来源: 云巅论剑
相关推荐

2018-11-07 19:46:30

本地ERP

2020-05-25 09:45:47

开发技能代码

2022-08-31 08:14:46

算法key链表

2023-03-20 18:55:10

微软AI人工智能

2021-02-16 09:17:40

VimLinux编辑器

2020-09-14 11:30:26

HTTP3运维互联网

2020-11-23 16:23:59

CSS设计技术

2019-09-09 09:29:27

互联网程序员职业

2021-01-12 15:58:03

云管理

2021-01-06 05:23:15

ServiceMesh网络阿帕网

2021-06-02 09:12:04

App自动化测试测试自动化

2022-06-17 08:05:28

Grafana监控仪表盘系统

2015-11-13 10:45:48

ASP.NET开发者

2020-12-18 07:33:20

SpringSchedule组件

2016-09-12 17:28:45

云存储应用软件存储设备

2021-10-19 07:27:08

HTTP代理网络

2023-01-03 08:36:34

MySQL索引

2020-05-06 10:10:51

Python代码链式调用

2021-08-11 09:47:22

项目Django 管理

2023-02-15 08:18:58

AI工具
点赞
收藏

51CTO技术栈公众号