04 - 镜像存储机制

04 - 镜像存储机制

1. OverlayFS 存储原理

OverlayFS 结构分为三个层: LowerDir、Upperdir、MergedDir

  • LowerDir (只读层) 只读的 image layer,其实就是 rootfs, 在使用 Dockfile 构建镜像的时候, Image Layer 可以分很多层,所以对应的 lowerdir 会很多(源镜像)。

  • UpperDir (读写层) upperdir 则是在 lowerdir 之上的一层, 为读写层。容器在启动的时候会创建, 所有对容器的修改, 都是在这层。 比如容器启动写入的日志文件,或者是应用程序写入的临时文件。

  • MergedDir (合并层) merged 目录是容器的挂载点,在用户视角能够看到的所有文件,都是从这层展示的。

  • WorkDir (工作目录) workdir 是 OverlayFS 内部用于处理写入操作的临时目录。

OverlayFS 演示:

# 创建需要的目录和文件
cd /tmp/
mkdir upper lower merged work
echo "I'm from lower" > lower/in_lower.txt 
echo "I'm from upper" > upper/in_upper.txt# `in_both` is in both directories
echo "I'm from lower" > lower/in_both.txt 
echo "I'm from upper" > upper/in_both.txt # 挂载 overlay 文件系统 
mount -t overlay overlay \-o lowerdir=/tmp/lower,upperdir=/tmp/upper,workdir=/tmp/work \/tmp/merged

查看文件合并后的效果:

[root@docker tmp]# cd /tmp/merged/
[root@docker merged]# cat in_lower.txt 
I'm from lower
[root@docker merged]# cat in_upper.txt
I'm from upper
# upper 层会覆盖 lower 层的文件 
[root@docker merged]# cat in_both.txt 
I'm from upper

创建一个新文件

[root@docker tmp]# echo 'new file' > merged/new_file
[root@docker tmp]# ls -l */new_file
-rw-r--r-- 1 root root 9 Oct 10 16:10 merged/new_file
-rw-r--r-- 1 root root 9 Oct 10 16:10 upper/new_file

删除一个文件

# 删除 merged 层的文件  in_both.txt
[root@docker tmp]# rm merged/in_both.txt# 在 merged 层找不到文件  in_both.txt
[root@docker tmp]# ls -l merged/in_both.txt lower/in_both.txt upper/in_both.txt
ls: cannot access merged/in_both.txt: No such file or directory
-rw-r--r-- 1 root root   15 Oct 10 16:01 lower/in_both.txt
c--------- 1 root root 0, 0 Oct 10 16:12 upper/in_both.txt# 在 upper 层还可以看到 in_both.txt, 但文件类型是 c (character )
[root@docker tmp]# ls -l upper/in_both.txt 
c--------- 1 root root 0, 0 Oct 10 16:12 upper/in_both.txt

2. 分析镜像存储结构

下载一个 redis6 的镜像

[root@docker ~]# docker pull redis:6
6: Pulling from library/redis
a2abf6c4d29d: Pull complete 
c7a4e4382001: Pull complete 
4044b9ba67c9: Pull complete 
c8388a79482f: Pull complete 
413c8bb60be2: Pull complete 
1abfd3011519: Pull complete 
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:6
docker.io/library/redis:6

使用docker inspect命令查看镜像存储结构

        "GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/7e4326877b790c7c20ae410c45ed2fee3c4846abccb3fd9e9078db644ae94f21/diff:/var/lib/docker/overlay2/0ea57f86b6e450766574019a4d8169c672aa688ebcd7e72155866c8d03b28d81/diff:/var/lib/docker/overlay2/63eec74fddbf61d5a5463c4efc705fda3db1d7ed15574207b4a4c6c6d1da7caa/diff:/var/lib/docker/overlay2/dfe479f8f8050b8ca5739f6c9fecaeba2acd281ec35d76af42e74497ff50423a/diff:/var/lib/docker/overlay2/e9001743d00736bb1f52cd6ffb4ab997d8a1fa396a49f15d13ad68bfffe94d17/diff","MergedDir": "/var/lib/docker/overlay2/e3d66951da5b2e15f35b7341a3d2b518d6932574eae7e9adcf41b18f7c7f7707/merged","UpperDir": "/var/lib/docker/overlay2/e3d66951da5b2e15f35b7341a3d2b518d6932574eae7e9adcf41b18f7c7f7707/diff","WorkDir": "/var/lib/docker/overlay2/e3d66951da5b2e15f35b7341a3d2b518d6932574eae7e9adcf41b18f7c7f7707/work"},"Name": "overlay2"},

Docker 镜像在磁盘上解压后的目录:

[root@docker ~]# ll /var/lib/docker/overlay2/
total 28
drwx--x--- 4 root root 4096 Oct 10 17:30 0ea57f86b6e450766574019a4d8169c672aa688ebcd7e72155866c8d03b28d81
drwx--x--- 4 root root 4096 Oct 10 17:30 63eec74fddbf61d5a5463c4efc705fda3db1d7ed15574207b4a4c6c6d1da7caa
drwx--x--- 4 root root 4096 Oct 10 17:30 7e4326877b790c7c20ae410c45ed2fee3c4846abccb3fd9e9078db644ae94f21
drwx--x--- 4 root root 4096 Oct 10 17:30 dfe479f8f8050b8ca5739f6c9fecaeba2acd281ec35d76af42e74497ff50423a
drwx--x--- 4 root root 4096 Oct 10 17:30 e3d66951da5b2e15f35b7341a3d2b518d6932574eae7e9adcf41b18f7c7f7707
drwx--x--- 3 root root 4096 Oct 10 17:30 e9001743d00736bb1f52cd6ffb4ab997d8a1fa396a49f15d13ad68bfffe94d17
drwx------ 2 root root 4096 Oct 10 17:30 l

3. 运行中容器的存储结构

启动 redis:6 镜像

[root@docker ~]# docker run -d --name redis6 redis:6 

使用 docker inspect 命令查看容器详情

[root@docker ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
94b7bf4eb2d4   redis:6   "docker-entrypoint.s…"   39 seconds ago   Up 38 seconds   6379/tcp   redis6
[root@docker ~]# 
[root@docker ~]# docker inspect redis6
..."GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/b2b5ec5141bc9e6f4732904c681adf5d26903367f5f2d0935c94f0cb91084189-init/diff:/var/lib/docker/overlay2/e3d66951da5b2e15f35b7341a3d2b518d6932574eae7e9adcf41b18f7c7f7707/diff:/var/lib/docker/overlay2/7e4326877b790c7c20ae410c45ed2fee3c4846abccb3fd9e9078db644ae94f21/diff:/var/lib/docker/overlay2/0ea57f86b6e450766574019a4d8169c672aa688ebcd7e72155866c8d03b28d81/diff:/var/lib/docker/overlay2/63eec74fddbf61d5a5463c4efc705fda3db1d7ed15574207b4a4c6c6d1da7caa/diff:/var/lib/docker/overlay2/dfe479f8f8050b8ca5739f6c9fecaeba2acd281ec35d76af42e74497ff50423a/diff:/var/lib/docker/overlay2/e9001743d00736bb1f52cd6ffb4ab997d8a1fa396a49f15d13ad68bfffe94d17/diff","MergedDir": "/var/lib/docker/overlay2/b2b5ec5141bc9e6f4732904c681adf5d26903367f5f2d0935c94f0cb91084189/merged","UpperDir": "/var/lib/docker/overlay2/b2b5ec5141bc9e6f4732904c681adf5d26903367f5f2d0935c94f0cb91084189/diff","WorkDir": "/var/lib/docker/overlay2/b2b5ec5141bc9e6f4732904c681adf5d26903367f5f2d0935c94f0cb91084189/work"},"Name": "overlay2"},
...

向容器运行时的 UpperDir 层写入文件 upper.txt

[root@docker ~]# touch /var/lib/docker/overlay2/b2b5ec5141bc9e6f4732904c681adf5d26903367f5f2d0935c94f0cb91084189/diff/upper.txt

附录:

删除主机上的所有镜像 和 容器,先删容器再删镜像

# 删除所有容器
docker rm $(docker ps -aq) --force
# or
docker rm $(docker ps -a | awk '{print $1}' | grep -v "CONTAINER") --force # 删除所有镜像 
docker rmi $(docker image ls -q)

ocker rm $(docker ps -aq) --force

or

docker rm $(docker ps -a | awk ‘{print $1}’ | grep -v “CONTAINER”) --force

删除所有镜像

docker rmi $(docker image ls -q)


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

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

相关文章

Element UI 组件库详解【Vue】

文章目录 一、引言二、安装并使用1. 安装2. 使用 三、常见组件说明1. 基础组件2. 布局组件3. 布局容器4. 选择框组件5. 输入框组件6. 下拉框组件7. 日期选择器8. 上传组件9. 表单组件10. 警告组件11. 提示组件12. 表格组件 一、引言 官方网站,element.eleme.cn El…

通过socket设置版本更新提示

1.项目使用的是git所以使用git仓库的短哈希作为版本更新标识,将该字符写入public文件,此处需要注意后端访问静态资源的路径。 在vue.config.js文件中写入 function excuteVersion() {const fs require(fs)const { execSync } require(child_process)…

相机触发模式

参考自:相机触发模式_硬触发和软触发的区别-CSDN博客 一、图像采集模式分类 相机的图像采集模式分为内触发模式与外触发模式。其中内触发模式包含连续采集、单帧采集两种形式;外触发模式包含软件外触发、硬件外触发。本文以海康相机的软件平台作介绍&a…

脚手架vue-cli,webpack模板

先安装node.js,它是服务器端,用于给页面提供服务。前端学习不需要会node.js,只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具,作用是进行包管理,npm是node.js的包管理器。 接着安装脚手架&#xff…

Stable Diffusion核心网络结构——CLIP Text Encoder

🌺系列文章推荐🌺 扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新&…

ggplot2 分面图等添加注释文字,相加哪里加哪里: 自定义函数 AddText()

如果分面图上还想再添加文字,只能使用底层的grid包了。 函数定义 # Add text to ggplot2 figures # # param label text you want to put on figure # param x position x, left is 0, right 1 # param y position y, bottom is 0, up 1 # param color text color…

ubuntu中使用ffmpeg和nginx推流rtmp视频

最近在测试ffmpeg推流rtmp视频,单独安装ffmpeg是无法完成推流的,需要一个流媒体服务器,常用nginx,可以直接在ubuntu虚拟机里面测试一下。 测试过程不涉及编译ffmpeg和nginx,仅使用基本功能: 1 安装ffmpeg …

解决upload上传之后,再上传没有效果

解决upload上传之后,再上传没有效果 注释:这是第二次上传,两次网络请求都是第一次上传的,这次上传没有网络请求 原因:在我的代码里我限制了上传数量为1,然后上传成功后,上传列表没有清空&#…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中,加油站作为重要的能源供应点,面临着安全监管与风险管理的双重挑战。为应对这些问题,安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

第 24 章 -Golang 性能优化

在Go语言中进行性能优化是一个多方面的过程,它涉及到代码编写、编译器优化、运行时系统调优以及对应用程序的深入理解。以下是针对Golang性能优化的一些关键点,包括性能分析工具、内存管理和并发优化等方面的内容,并附带一些简单的案例源代码…

reactflow 中 useStoreApi 模块作用

1. 状态管理与访问核心功能 它提供了一种方式来访问和操作内部存储(store),这个存储包含了与 ReactFlow 应用相关的各种状态,如节点(Nodes)状态、边(Edges)状态、视口(V…

基于web的音乐网站(Java+SpringBoot+Mysql)

目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性能分析 3.2.1 系统安全性 3.2.2 数据完整性 …

中间件--laravel进阶篇

laravel版本11.31,这中间件只有3种,分别是全局中间件,路由中间件,控制器中间件。相比thinkphp8,少了一个应用中间件。 一、创建中间件 laravel创建中间件可以使用命令的方式创建,非常方便。比如php artisan make:middleware EnsureTokenIsValid。EnsureTokenIsValid是中间…

vue使用List.forEach遍历集合元素

需要遍历集合对其每个元素进行操作时,可以使用forEach方法 1.语法:集合.forEach ( 定义每一项 > 定义每一项都要进行的逻辑 ) 2、使用场景: //例如需要给每个员工的工资数量加1000this.personList.forEach(item>item.salary100…

杰发科技AC7840——EEP中RAM的配置

sample和手册中示例代码的sram区地址定义不一样 这个在RAM中使用没有限制,根据这个表格留下足够空间即可 比如需要4096字节的eep空间,可以把RAM的地址改成E000,即E000-EFFF,共4096bytes即可。

实验室管理平台:Spring Boot技术构建

3系统分析 3.1可行性分析 通过对本实验室管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本实验室管理系统采用SSM框架,JAVA作为开发语言&a…

ThinkPHP8使用workerman

应用场景说明:通过建立通信,不同用户进行消息推送或数据更新,因为本身需要作为服务端进行主动消息推送,因此使用Gateway方式,如果不需要的可以不采用这种形式,以下内容仅为参考,具体业务场景&am…

【USB】CC检测

CC信号有两根线,CC1和CC2,大部分USB线(不带芯片的线缆)里面只有一根CC线,DFP可根据两根CC线上的电压,判断是否已经插入设备。通过判断哪根CC线上有下拉电阻来判断方向,下图的说明已经非常清晰。…

「一」HarmonyOS端云一体化概要

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 「目录」 「一」HarmonyOS端云一体化概要 「二」体验HarmonyOS端云一…

二进制之和

问题描述 小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法&…