全网讲的最详细的Docker镜像分层存储原理

先说结论,容器镜像分层存储图示
在这里插入图片描述
欢迎关注
在这里插入图片描述

实验环境准备

当前实验docker版本24.0.7如下,当前docker版本使用overlay2机制存储镜像

Client: Docker Engine - CommunityVersion:           24.0.7API version:       1.43Go version:        go1.20.10Git commit:        afdd53bBuilt:             Thu Oct 26 09:07:41 2023OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          24.0.7API version:      1.43 (minimum version 1.12)Go version:       go1.20.10Git commit:       311b9ffBuilt:            Thu Oct 26 09:07:41 2023OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.6.25GitCommit:        d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7frunc:Version:          1.1.10GitCommit:        v1.1.10-0-g18a0cb0docker-init:Version:          0.19.0GitCommit:        de40ad0
$ sudo docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
1f7ce2fa46ab: Pull complete 
424de2a10000: Pull complete 
6d9a0131505f: Pull complete 
5728e491734b: Pull complete 
20d3235e84ad: Pull complete 
Digest: sha256:04551bc91cc03314eaab20d23609339aebe2ae694fc2e337d0afad429ec22c5a
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
# sudo docker image inspect httpd"Id": "sha256:a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949","RepoTags": ["httpd:latest"],"RepoDigests": ["httpd@sha256:04551bc91cc03314eaab20d23609339aebe2ae694fc2e337d0afad429ec22c5a"],"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/766833b310bfa8245d270ce831a9e73ab27e5e0f61525d108ef519e4868f9cfb/diff:/var/lib/docker/overlay2/76c5547a9f06e06ba12ae92f54211a9c4397bc6c002e3a81aa4a4d7903f451c2/diff:/var/lib/docker/overlay2/aab89c771d1be31e61bce7d83df529043b1b0cd4283ed1d9275a97617c114743/diff:/var/lib/docker/overlay2/32b5b0acbd61d9bbfb362d26d450e6412bfa6749677acf0694f32930e82432b2/diff","MergedDir": "/var/lib/docker/overlay2/88aaff0c6f4e196d1a79386b30b9460a2603824b6ebb9efacdfd1fd11000477f/merged","UpperDir": "/var/lib/docker/overlay2/88aaff0c6f4e196d1a79386b30b9460a2603824b6ebb9efacdfd1fd11000477f/diff","WorkDir": "/var/lib/docker/overlay2/88aaff0c6f4e196d1a79386b30b9460a2603824b6ebb9efacdfd1fd11000477f/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:92770f546e065c4942829b1f0d7d1f02c2eb1e6acf0d1bc08ef0bf6be4972839","sha256:fad7e2250d8fefbd8524054837403921b468448b6bae1ee439bb793e254b6725","sha256:27496babc700a08c0a14777dd4bb818273e8cc9f77d526fcb4554043cff291d9","sha256:28f18e7dc61c56a068f00ec92dde62cf9de21cbce0eb9a8395c6617e2fef9463","sha256:b9bf93af811f6900f445158ab648fd4868b69b770908142b897772e6bb8c2a2f"]}

overlay2文件系统

overlayfs通过三个目录来实现:lower目录、upper目录、以及work目录。三种目录合并出来的目录称为merged目录

  • lower目录:可以是多个,是处于最底层的目录,作为只读层
  • upper目录:只有一个,作为读写层
  • work目录:为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见
  • merged目录:为最后联合挂载完成给用户呈现的统一视图,也就是说merged目录里面本身并没有任何实体文件,给我们展示的只是参与联合挂载的目录里面文件而已,真正的文件还是在lower和upper中。所以,在merged目录下编辑文件,或者直接编辑lower或upper目录里面的文件都会影响到merged里面的视图展示。

docker image inspect httpd的结果中LowerDir的值是实际存储文件系统数据的目录

MergedDir,UpperDir,WorkDir也都是放在/var/lib/docker/overlay2/目录下

上面inspect命令结果中"Id": "sha256:a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949",,这一部分其实就是repository元数据,用于找到镜像image元数据/var/lib/docker/image/overlay2/imagedb/content/sha256(Id值)/

上面inspect命令结果中RootFSLayerslayer元数据,其中的每个sha256的值就是diff_id

docker镜像分层存储原理

docker镜像的元数据分为repository,image,layer三部分

由于docker镜像分层存储,所以repositoryimage没有对应的物理镜像文件,而每个layer元数据都有具体的物理镜像层文件与之对应,

并且layer元数据和镜像文件分开存储,二者基于内容寻址(即基于文件内容索引镜像和镜像层)存储机制进行关联

repository元数据

repository是某个镜像所有迭代版本的集合,它在本地的持久化信息就存储在/var/lib/docker/image/overlay2/repositories.json中,其中记录了所有repository的名字以及每个repository中所有版本镜像的名字。

这里的sh256的值和docker pull时的sha256值一样

root@ubuntu20:/var/lib/docker/image/overlay2# cat repositories.json 
{"Repositories":{"httpd":{"httpd:latest":"sha256:a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949","httpd@sha256:04551bc91cc03314eaab20d23609339aebe2ae694fc2e337d0afad429ec22c5a":"sha256:a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949"}
}}

image元数据

image元数据的本地文件位于/var/lib/docker/image/overlay2/imagedb/content/sha256/,包括以下信息:镜像架构、操作系统、镜像配置、Docker版本和镜像层信息rootfs。

其中rootfs包含该镜像所有镜像层的id,即diff_id。其中的diff_ids从上到下依次为nginx镜像底层到顶层的diff_id

镜像层的id为diff_id

# cat /var/lib/docker/image/overlay2/imagedb/content/sha256/a6ca7b52a41549f13f7de6aeac4ab6ffebd41585fbf2273f00fd6e82bb721949
.....
"rootfs":{"type":"layers","diff_ids":["sha256:92770f546e065c4942829b1f0d7d1f02c2eb1e6acf0d1bc08ef0bf6be4972839","sha256:fad7e2250d8fefbd8524054837403921b468448b6bae1ee439bb793e254b6725","sha256:27496babc700a08c0a14777dd4bb818273e8cc9f77d526fcb4554043cff291d9","sha256:28f18e7dc61c56a068f00ec92dde62cf9de21cbce0eb9a8395c6617e2fef9463","sha256:b9bf93af811f6900f445158ab648fd4868b69b770908142b897772e6bb8c2a2f"]
}

layer元数据

用户拉取了某个镜像层后,Docker会基于该镜像层的文件和image元数据生成layer元数据,

主要包括该镜像层的diff_id(diff),如果该镜像层没有父镜像层,那么该层的diff_id就是chain_id

父镜像层的chain_id(parent)

该镜像层的大小(size)、

镜像层文件的索引(cache-id)等,

这些元数据存储在 /var/lib/docker/image/overlay2/layerdb/sha256/路径下

root@ubuntu20:/var/lib/docker/image/overlay2/layerdb/sha256# tree -L 2
.   
├── 16d494768121f45ba050ad50a669400818478131cb930bb0c8b5d2f908057142
│   ├── cache-id
│   ├── diff
│   ├── parent
│   ├── size
│   └── tar-split.json.gz
├── 29b181ca372e770053cc03410789236d7a96171f1f77110741d0f3f068a29c67
│   ├── cache-id
│   ├── diff
│   ├── parent
│   ├── size
│   └── tar-split.json.gz
├── 92770f546e065c4942829b1f0d7d1f02c2eb1e6acf0d1bc08ef0bf6be4972839
│   ├── cache-id
│   ├── diff
│   ├── size
│   └── tar-split.json.gz
├── cdfabdae5172d05eb5141bb77aaa300a195570b0befd780b6e2fc7bd20ea2cd5
│   ├── cache-id
│   ├── diff
│   ├── parent
│   ├── size
│   └── tar-split.json.gz
└── e8254408730a345e2ccf863e19c850e7ee78b59dfd9e4aa265b0107dd4301be5├── cache-id├── diff├── parent├── size└── tar-split.json.gz   

cache-id是Docker随机生成的UUID,用于标识和索引具体的镜像文件;

chainIDimage元数据与layer元数据关联的索引ID,根据当前层的diffID和父镜像层的chainID得来,具体计算方法如下:

  • 如果该镜像层是最底层(没有父镜像层),该层的 diff_id 便是 chain_id。
  • 该镜像层的 chain_id 计算公式为 chainID=sha256(父层chain_id+" "+本层diff_id),也就是根据父镜像层的 chain_id 加上一个空格和当前层的 diff_id,再计算 SHA256 校验码。

镜像文件存储目录

镜像层元数据与镜像层文件分开存储,并通过cache-id(overlay2目录下的文件夹的名字)进行关联。具体的镜像层文件存储在/var/lib/docker/overlay2文件夹下

root@ubuntu20:/var/lib/docker/overlay2# tree -L 2
.
├── 32b5b0acbd61d9bbfb362d26d450e6412bfa6749677acf0694f32930e82432b2
│   ├── committed
│   ├── diff
│   └── link
├── 766833b310bfa8245d270ce831a9e73ab27e5e0f61525d108ef519e4868f9cfb
│   ├── committed
│   ├── diff
│   ├── link
│   ├── lower
│   └── work
├── 76c5547a9f06e06ba12ae92f54211a9c4397bc6c002e3a81aa4a4d7903f451c2
│   ├── committed
│   ├── diff
│   ├── link
│   ├── lower
│   └── work
├── 88aaff0c6f4e196d1a79386b30b9460a2603824b6ebb9efacdfd1fd11000477f
│   ├── diff
│   ├── link
│   ├── lower
│   └── work
├── aab89c771d1be31e61bce7d83df529043b1b0cd4283ed1d9275a97617c114743
│   ├── committed
│   ├── diff
│   ├── link
│   ├── lower
│   └── work
└── l├── J6BYBF6ADSYX4HKH65NQSXLNAD -> ../76c5547a9f06e06ba12ae92f54211a9c4397bc6c002e3a81aa4a4d7903f451c2/diff├── L2DROY4Y7V2ZGUIOFOLSARZO3T -> ../aab89c771d1be31e61bce7d83df529043b1b0cd4283ed1d9275a97617c114743/diff├── U2HWCDVI7VIS6QKAUANBZSIC4L -> ../32b5b0acbd61d9bbfb362d26d450e6412bfa6749677acf0694f32930e82432b2/diff├── V2RW2JJO2BYNGIFOMQJ74TF5C3 -> ../766833b310bfa8245d270ce831a9e73ab27e5e0f61525d108ef519e4868f9cfb/diff└── WUF77DAMALFDYBOPZYWKS7WOIG -> ../88aaff0c6f4e196d1a79386b30b9460a2603824b6ebb9efacdfd1fd11000477f/diff

子目录l记录了很多长26位的软连接,指向本地缓存目录下的diff目录。(容器运行时会用到,具体参见文章开头的链接)

其他7个子目录是镜像层的目录,代表Nginx镜像共有7个镜像层,每个镜像层目录都由一串UUID命名,这个UUID即layer元数据部分介绍的cache-id,用于将镜像元数据和镜像文件关联起来。

其中diff目录保存了镜像层的实际内容;

link保存了当前镜像层的短ID,与 l目录互为引用;

lower目录保存了当前镜像层的所有父镜像层的短ID集合,用于挂载时直接读取;

work目录为overlay2驱动的写时复制目录。

镜像索引关系

repositories.json文件存储了repository元数据,其中包括imageID

imageID可以索引到image元数据,其中包括该镜像每层的 ID,即 diff_id

根据当前层diff_id和父镜像层的chainID可以计算出当前层的chainID,就可以索引到当前层的layer元数据;

当前层的layer元数据文件夹下包括cacheID,从而索引到存储在/var/lib/docker/overlay2路径下的镜像文件存储数据。

/var/lib/docker//overlay2/	# 存放实际的镜像或容器文件/image/overlay2/distribution/imagedb/		# image元数据content/sha256/	# image元数据metadata/	layerdb/		# layer元数据mounts/	# 运行的容器的挂载元数据sha256/	# layer元数据repositories.json	# repository元数据

在这里插入图片描述

容器启动

⼀个容器完整的层应由三个部分组成

  • 镜像层:也称为rootfs,提供容器启动的⽂件系统。镜像层属于roLayer
  • init层:⽤于修改容器中⼀些⽂件如/etc/hostname,/etc/hosts,/etc/resolv.conf等。init层属于mountedLayer
  • 容器层:使⽤联合挂载统⼀给⽤⼾提供的可读写⽬录。容器层属于mountedLayer

启动容器时会在/var/lib/docker/image/overlay2/layerdb/mounts/下创建container_id文件夹,其中包括

  • mount-id:存储在/var/lib/docker/overlay2/(镜像文件存储目录)的⽬录名称。(容器层,联合挂载⽽来,mount到docker/overlay2/⽬录下)
  • init-id:initID是在mountID后加了⼀个-init,同时initID就是存储 在/var/lib/docker/overlay2/的⽬录名称。
  • parent:容器所基于的镜像的最上层的chain_id。

多架构下的镜像信息

可以使用 docker manifest inspect $image 命令来查看,manifest为docker的体验特性,在Linux系统下开启

最好的方式为开启docker daemon的特性,修改 /etc/docker/daemon.json 文件

{"experimental": true
}

配置镜像加速时配置阿里镜像地址也是通过这个文件来做的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Three.js 研究:2、如何让动画线性运动

1、默认的动画含有加速度并非线性的 制作好的动画很明显是非线性的,这是一个运动环,为了让环运行线性进行如下设置。 2、设置动画成为线性动画

【vue3】嵌套的 effect 与 effect 栈

在 Vue 3 的响应式系统中,effect 是一个非常重要的概念。effect 是一个函数,它接受一个执行副作用(side effect)的函数作为参数,并返回一个可以停止这个副作用的函数。当响应式数据发生变化时,Vue 3 会自动…

Vue从入门到实战Day07

一、vuex概述 目标:明确vuex是什么,应用场景,优势 1. 是什么: vuex是一个vue的状态管理工具,状态就是数据。 大白话:vuex是一个插件,可以帮助我们管理vue通用的数据(多组件共享的…

解锁数据关联之道:SQL 表连接详解

文章目录 概述表关系横向连接内连接 inner join左连接 left join右连接 right join全连接 full join交叉连接 cross join 纵向合并UNION ALLUNION 概述 在数据处理、数据分析中常会用到表连接。表连接的作用是将多个表中的数据关联起来,以便在查询过程中获取更全面…

嵌入式0基础开始学习 ⅠC语言(8)结构体

0.问题引入 C语言是允许程序员定义自己的组合类型 构造类型 》 数组 结构体 枚举 共用体/联合体 …

Vxetable 递归多级表头

在对vxetable 进行二次封装的时候&#xff0c;多级表头也是需要考虑进去的&#xff0c;所以需要封装一个递归列组件进行多级表头的一个渲染。 // my-table.vue <vxe-tableref"xTable":key"currentKey":data"pageData?.list || []"show-head…

Flutter 中的 MergeableMaterial 小部件:全面指南

Flutter 中的 MergeableMaterial 小部件&#xff1a;全面指南 Flutter 提供了丰富的 Material Design 组件&#xff0c;用于构建具有丰富交互和视觉效果的用户界面。MergeableMaterial 是 Flutter 中一个特殊的组件&#xff0c;它允许多个 Material widget&#xff08;如按钮、…

2024-5-25

今日安排&#xff1a; 前面的状态不太好&#xff0c;后面一定要好好调整 重新开始审计 nf_tables 源码&#xff0c;并在审计的过程中复现历史漏洞【 && iptables 相关学习】♥♥♥♥♥复现 CTF 相关题目♥♥♥♥学习 winpwn♥♥♥♥mount 的使用&#xff0c;学习 nam…

js 根据日期获取星期几

js 根据日期获取星期几 方法一&#xff1a;使用Date对象中的getDay()方法 function getWeekday(dateStr) {const weekDays [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六];const date new Date(dateStr);const weekday date.getDay();return weekDays[weekday…

MySQL造数据占用临时表空间

在数据库性能测试和开发过程中&#xff0c;常常需要生成大量的测试数据以模拟真实环境。在MySQL中&#xff0c;造数据的过程可能会占用大量的临时表空间&#xff0c;这可能会影响数据库的性能和稳定性。本文将深入探讨MySQL造数据时临时表空间的使用情况&#xff0c;并通过多个…

GolangFoundation

GolangFoundation 一. Hello World1.1 SDK1.2 环境1.3 hello world1.4 语法规则二. 变量2.1 变量声明与定义一. Hello World 1.1 SDK https://golang.google.cn/dl/下载最新版1.2 环境 GoGOROOT D:\Dev\

家政项目day2 需求分析(模拟入职后熟悉业务流程)

目录 1 项目主体介绍1.1 项目背景1.2 运营模式1.3 项目业务流程 2 运营端需求2.1 服务类型管理2.2 服务项目&#xff08;服务&#xff09;管理2.3 区域管理2.4 区域服务管理2.5 相关数据库表的管理2.6 设计工程结构2.7 测试接口&#xff08;接口断点查看业务代码&#xff09; 1…

【机器学习与大模型】开源大模型和闭源大模型:技术发展与社会责任的平衡点

目录 &#x1f4a1;引言✈️✈️一&#xff0c;开源大模型的优势与劣势✈️✈️1.1 优势&#xff1a;✈️✈️1.2 挑战和劣势&#xff1a; &#x1f680;&#x1f680;2. 闭源大模型的优势与劣势&#x1f680;&#x1f680;2.1 优势&#xff1a;&#x1f680;&#x1f680;2.2 …

所有笔记总结目录

算法篇&#xff08;C&#xff09; 算法链接基础知识基础算法总结-CSDN博客数据结构数据结构总结-CSDN博客搜索与图论搜索与图论总结-CSDN博客数学知识数学知识总结-CSDN博客动态规划动态规划总结&#xff08;闫氏Dp分析法&#xff09;-CSDN博客贪心贪心算法总结-CSDN博客 基础…

动态计算rem

前言: 最近导师布置了一些作业&#xff0c;其中有一个就是动态计算rem&#xff0c;我想到了两个版本&#xff0c;一种是不添加防抖&#xff0c;当视口发生变化时&#xff0c;就立即进行计算rem&#xff0c;还是一种就是使用防抖&#xff0c;当视口连续100毫秒没有发生变化时计…

【pyspark速成专家】7_SparkSQL编程1

目录 一&#xff0c;RDD&#xff0c;DataFrame和DataSet对比 二&#xff0c;创建DataFrame 本节将介绍SparkSQL编程基本概念和基本用法。 不同于RDD编程的命令式编程范式&#xff0c;SparkSQL编程是一种声明式编程范式&#xff0c;我们可以通过SQL语句或者调用DataFrame的相…

YoloV8改进策略:蒸馏改进|MimicLoss|使用蒸馏模型实现YoloV8无损涨点|特征蒸馏

摘要 在本文中&#xff0c;我们成功应用蒸馏策略以实现YoloV8小模型的无损性能提升。我们采用了MimicLoss作为蒸馏方法的核心&#xff0c;通过对比在线和离线两种蒸馏方式&#xff0c;我们发现离线蒸馏在效果上更为出色。因此&#xff0c;为了方便广大读者和研究者应用&#x…

amis 联动效果触发的几种方式

联动效果实现主要俩种方式: 1.表达式实现联动,基于组件内或数据链的变量变化的联动 比如&#xff1a; "source": "/amis/api/mock2/options/level2?name${name} " (必须是这种字符串拼接形式,在data数据映射中表达式不会触发联动) 所有初始化接口链…

【c++基础】分书问题

说明 已知有n本书&#xff08;从1&#xff5e;n编号&#xff09;和n个人&#xff08;从1&#xff5e;n编号&#xff09;&#xff0c;每个人都有一个自己喜爱的书的列表&#xff0c;现在请你编写一个程序&#xff0c;设计一种分书方案&#xff0c;使得每个人都能获得一本书&…

AI专业面经

AI专业面经&#xff08;部分&#xff09; 一、数学部分&#xff1a; 1.1 代数&#xff08;Algebra&#xff09;和分析&#xff08;Analysis&#xff09;&#xff1a;复习基本的代数和微积分概念&#xff0c;如线性代数、微分、积分等。 1.1.1 Algebra 1.1.1.1 基础知识 Rea…