Docker镜像存储

news2024/11/27 20:29:48

前言

在之前的文章中有说过容器目录的隔离机制. 今天来分析一下镜像的文件系统.

Docker 已经用了很久了, 也知道镜像存储的时候是分层存储的(从docker pull时分层下载就能看出), 但是具体是如何将多层进行聚合并生成最终展示的文件, 这个过程从未深究过. 既然不知道, 又难掩好奇, 就抽时间康康它具体是怎么做的吧

OverlayFS

OverlayFS就是这样一个联合挂载的文件系统, 可以看看wiki上的介绍, 也可以看看内核文档中的介绍.

它的作用简单来说就是: 将多个目录的文件内容融合为一个目录.

OverlayFS中, 文件目录分为四类:

  1. lowerdir: 只读目录, 可以有多个, 相同文件上层会覆盖下层.
  2. upperdir: 读写层. 只有一个, 对文件的增删改记录在这里
  3. mergedir: 在此目录中展示合并后的文件内容
  4. workdir: 文件系统的临时目录, 在创建后被清空. 这一层是文件系统使用的, 具体作用在后面说明. (todo https://blog.csdn.net/luckyapple1028/article/details/78075358)

实战

在官方文档中提到, 可以使用mount命令来挂载OverlayFS. 我们来测试一下

创建挂载相关的目录及文件:

mkdir lower1 lower2 upper merged work
# lower文件被上层覆盖
echo "lower1" > lower1/lower_change.txt 
echo "lower2" > lower2/lower_change.txt 
# lower文件在各层添加
echo "lower1" > lower1/lower1.txt 
echo "lower2" > lower2/lower2.txt 
# lower文件被upper覆盖
echo "lower2" > lower2/upper.txt 
echo "upper" > upper/upper.txt 
# 文件挂载
mount -t overlay overlay -o lowerdir=lower1:lower2,upperdir=upper,workdir=work merged
# 卸载文件系统. 卸载后 merged 目录下的所有文件均会消失
umount <dir>

image-20230604100836804

此时进入merged目录查看文件, lower2中的同名文件会被lower1覆盖. 现在, 让我们来对系统进行简单的测试, 以便于了解其原理(对merged目录操作):

  1. 创建文件: 创建的文件会同步出现在upperdir目录下
  2. 修改文件: 修改的文件, 会将修改后的文件在upperdir下写一份
  3. 删除文件: 删除文件就比较有意思了, 将lower1.txt文件删除后, 会在upperdir下创建一个whiteout文件来标识下层文件被删除. 如下图:

image-20230604101625571

当我们对挂载文件做了一系列操作之后, 可以尝试下这样的操作:

mkdir upper_new
umount merged
mount -t overlay overlay -o lowerdir=upper:lower1:lower2,upperdir=upper_new,workdir=work merged
# mount 命令可以看到当前所有的文件系统
mount 

这样我们就将对文件系统的改动记录下来了. 熟悉不熟悉? 这不就是docker save的操作么.

workdir 作用

至此, 对OverlayFS系统也有一定了解了, 但是workdir我们从来就没用到过, 它是做什么的呢? 在官方文件中有说明, 我的理解是: 这个目录是给文件系统使用的.

比如, 文件的删除操作不是一步完成的, 涉及到文件删除, upperdir创建覆盖文件等操作, 为了防止断电等异常情况, 会接住workdir来实现原子删除

不过具体的实现细节我没有深究.

镜像

好, 可以来看一下Docker的镜像存储了.

镜像信息保存在/var/lib/docker/image/overlay2/imagedb/content/sha256/<image sha256>文件中. 其中rootfs字段记录了镜像的各层信息, 下方是nginx镜像的信息. (或者用命令docker image inspect <image>查看也行)

{
		//...
    "rootfs":
    {
        "type": "layers",
        "diff_ids":
        [
            "sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3",
            "sha256:4b8862fe7056d8a3c2c0910eb38ebb8fc08785eaa1f9f53b2043bf7ca8adbafb",
            "sha256:e60266289ce4a890aaf52b93228090998e28220aef04f128704141864992dd15",
            "sha256:7daac92f43be84ad9675f94875c1a00357b975d6c58b11d17104e0a0e04da370",
            "sha256:5e099cf3f3c83c449b8c062f944ac025c9bf2dd7ec255837c53430021f5a1517",
            "sha256:4fd83434130318dede62defafcc5853d03dae8636eccfa1b9dcd385d92e3ff19"
        ]
    }
}

layer信息则保存在/var/lib/docker/image/overlay2/layerdb/sha256/<layer sha256>目录下, 此目录下保存了以下几个文件:

  • cache-id: 文件的索引. 当前层的具体数据保存在/var/lib/docker/overlay2/<cache-id>目录下
  • diff: 就是上面的diff ids
  • size: 当前层大小

好, 现在我们可以到/var/lib/docker/overlay2/<cache-id>/diff目录下看到这一层的具体数据了.

/var/lib/docker/overlay2/l目录下保存了diff目录的软连接, 用于缩短路径的吧, 给文件系统传递的就是这个路径.

至此, 容器启动后是如何做的心里有数了吧. 将多个layer层作为lowerdir, 新建一个upperdir来进行容器内的文件修改. 最终整合成完成的文件目录. 再通过目录挂载替换进程的文件系统.


当然了, 文件系统也不是只有Overlay, 可以通过docker info命令查看当前使用的文件系统. 其他的比如: unionfs-fuse, mergerfs等等.

image-20230604110208409

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

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

相关文章

chatgpt赋能python:Python反向切片:介绍与例子

Python反向切片&#xff1a;介绍与例子 Python是一种高级编程语言&#xff0c;具有简单易懂的语法和高效的运行速度&#xff0c;以及丰富的标准库和第三方库。其中一项有趣的功能是Python反向切片&#xff0c;它能够用一种简单而有效的方式处理列表&#xff08;list&#xff0…

大模型有什么用,从技术上看

一、大模型有什么用 目前为止&#xff0c;大模型主要是以NLP为主&#xff0c;因为NLP抛弃了RNN序列依赖的问题&#xff0c;采用了Attention is All you need的Transformer结构&#xff0c;使得NLP能够演变出更多大模型。图像领域也不甘示弱&#xff0c;CNN大模型也开始陆续涌现…

tcpdump命令抓取网络数据包并用wireshark软件分析

1、tcpdump命令部署 1.1、源码下载 (1)下载网址&#xff1a;http://www.tcpdump.org&#xff1b; (2)下载匹配的libpcap库和tcpdump库&#xff1b; (3)编译tcpdump命令依赖libpcap库&#xff0c;所以要先编译libpcap库再编译tcpdump命令&#xff1b; 1.2、源码编译 1.2.1、编…

chatgpt赋能python:Python如何去掉空值

Python如何去掉空值 数据处理过程中经常会出现空值&#xff0c;这些空值可以影响我们对数据的分析和处理。在Python中&#xff0c;有许多方法可以去除空值。本文将介绍常见的方法并提供实例说明。 什么是空值 在Python中&#xff0c;空值通常用None或NaN表示。None是Python内…

FutureTask简介

FutureTask简介 Future接口和实现Future接口的FutureTask类&#xff0c;代表异步计算的结果。FutureTask除了实现Future接口外&#xff0c;还实现了Runnable接口。因此&#xff0c;FutureTask可以交给Executor执行&#xff0c;也可以由调用线程直接执行&#xff08;FutureTask…

华为OD机试真题 Java 实现【矩阵最大值】【2023 B卷 100分】,附详细解题思路

一、题目描述 给定一个仅包含0和1的N*N的二维矩阵&#xff0c;请计算二维矩阵的最大值。 计算规则如下&#xff1a; 1、每行元素按下标顺序组成一个二进制数&#xff08;下标越大越排在低位&#xff09;&#xff0c;二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 …

使用Windbg动态调试目标进程的一般步骤及相关要点详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上&#xff0c;或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来&#xff0c;输入g命令将该中断跳过去 3、分析实例说明 …

ModuleNotFoundError: No module named ‘transformers_modules.chatglm-6b_v1‘的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

ggplot2、RMySQL、httpuv、shiny、miniUI、devtools、recharts安装问题

目录 ggplot2下载成功&#xff01; RMySQL下载成功&#xff01; automake-1.16.tar.gz下载成功&#xff01; httpuv下载成功&#xff01; shiny下载成功&#xff01; miniUI下载成功&#xff01; devtools下载成功&#xff01; recharts下载成功&#xff01; 首先的首先…

shiro 550 反序列化rce

Apach shiro 是一款开源安全框架&#xff0c;提供身份验证&#xff0c;授权&#xff0c;会话管理等。 shiro 550 反序列化漏洞rce 通关利用它反序列化的漏洞直接执行rce 加密的用户信息序列化后储存在名为remenber -me的cooike中。攻击者可以使用shiro默认密钥伪造cooike&am…

django连接mysql一些报错解决方法

1.AttributeError: str object has no attribute ‘decode’ 2.django.db.utils.OperationalError: (2003, "Can’t connect to MySQL server on ‘localhost’ ([WinError 10] 解决方法&#xff1a;仔细核对#数据库引擎和#数据库的主机地址 DATABASES { ‘default’:…

2023PS beta 官方注册安装教程

该教程为官方注册下载教程&#xff0c;无风险。 软件介绍 Adobe Photoshop 2023版(简称PS)是一款全球流行的专业图像处理软件及照片和设计软件。Adobe Photoshop中文版是Adobe Creative Cloud 创意云桌面程序中心的图形设计软件热门产品&#xff0c;它是平面设计领域和数字图象…

读改变未来的九大算法笔记03_纠错码

1. 真正根源 1.1. 在电报和电话等通信系统中出现的 1.2. 理查德汉明创造了第一批纠错码&#xff1a;一种近乎神奇的能侦测并纠正计算机数据中错误的算法 2. 信息理论学的一部分 2.1. Information Theory 2.2. 香农通过数学展示了有可能从根本上通过一个嘈杂的、引发错误的…

每日学术速递6.1

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.LayoutGPT: Compositional Visual Planning and Generation with Large Language Models 标题&#xff1a;LayoutGPT&#xff1a;具有大型语言模型的组合视觉规划和生成 作者&…

Linux开发工具:gcc和g++

目录 一. 什么是gcc和g 二. gcc的基本使用方法 三. 库和链接 3.1 动态库和静态库 3.2 动态链接和静态链接 四. Debug和Release 五. makefile和make 六. 总结 一. 什么是gcc和g gcc&#xff1a;Linux下编译C语言程序的编译器g&#xff1a;Linux下编译C代码的编译器 由…

Apache网页的优化与安全

文章目录 Apache 网页的压缩Apache的页面缓存Apache页面隐藏版本信息Apache页面设置防盗链 Apache 网页的压缩 检查压缩模块 apachectl -t -D DUMP_MODULES | grep "deflate"安装mod_deflate 模块 如果没有安装mod_deflate 模块&#xff0c;重新编译安装 Apache 添…

嵌入式STM32中时钟系统详细分析

1. STM32的时钟源主要有&#xff1a; 内部时钟 外部时钟 锁相环倍频输出时钟 1.1 详细介绍 HSI(内部高速时钟) 它是RC振荡器&#xff0c;频率可以达到8MHZ&#xff0c;可作为系统时钟和PLL锁相环的输入。 HSE&#xff08;外部高速时钟&#xff09; 接入晶振范围是4-16MHZ…

深入理解设计原则之组件构建原则【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 组件构建原则 系列文章目录1、组件构建原则的定义和解读1、组件2、组件聚合2.1、复用/发布等同原则&#xff08;REP&#xff09;2.2 、共同闭包原则&#xff08;CCP&…

C++(6):函数

函数基础 典型的函数包括&#xff1a;返回类型、函数名字、由 0 个或多个形参组成的列表以及函数体。 通过调用运算符&#xff08;call operator&#xff09;来执行函数。 调用运算符的形式是一对圆括号&#xff0c;它作用于一个表达式&#xff0c;该表达式是函数或者指向函数…

1731_makefile编写小结1_编译同目录下的文件

全部学习汇总&#xff1a; GreyZhang/g_makefile: Learn makefile from all kinds of tutorials on the web. Happy hacking and lets find an common way so we may dont need to touch makefile code any more! (github.com) 欢迎路过的YUAN类朋友相互交流&#xff0c;以下是…