Docker-原理之写实复制(cow)

2.2 Docker底层原理深度剖析:UnionFS、镜像层、容器层三层架构详解 Docker采用UnionFS实现镜像和容器的分层存储架构,主要由基础层(操作系统)、镜像层(只读应用文件)和容器层(可写运行时修改)组成。镜像层采用写时复制机制,多个容器可共享同一镜像层,容器层则保存临时修改。Overlay2是推荐的存储驱动,通过分层结构优化存储空间。镜像构建时应减少层数并使用多阶段构建优化性能。定期清理未使用的镜像和容器层可有效管理存储空间。理解这一分层架构是掌握Docker核心机制的关键。 阅读详情

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile

Docker镜像

Docker仓库

Docker原理(本小节属于)

Docker网络&存储&日志

Docker-Compose

Docker番外篇

基于我们对联合文件的理解,我们来讲解写实复制(cow),其实在讲kvm-外部快照的时候也提到了这个技术。

当 Docker 第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层之上。比如,如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。由此,该文件的只读版本依然存在于只读层,只是被读写层的该文件副本所隐藏。该机制则被称之为写时复制(Copy on write)。下面就是几种文件操作的具体流程。

添加文件

在容器中创建文件时,新文件被添加到可读写层中。

容器里面创建新目录

[root@localhost ~]# docker exec -it df3 bash
[root@df36a78f937e /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@df36a78f937e /]# mkdir -p eee

UpperDir同步存在

这2个文件的inode都是一样的(本质上他们就是一个文件),有兴趣可以下去对比下。

图片

读取文件

在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。如果这个文件存在于下面的只读层中,Docker直接从该只读层读取文件内容,不涉及任何复制操作。这是因为读操作不会改变文件内容,所以可以安全地与其它容器共享。

修改文件

在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。举例来说,就是如果编辑一个已经存在的文件,当保存以后,UpperDir里面就会出现同路径下的的同名文件,以后的读写操作的就是这个文件。

但是这个实际显示和理解的逻辑出现了一点误差,比如我在容器里面查看一个文件,那么这个时候我看到应该是LowerDir的内容,他的inode是固定的不会变的,可以在LowerDir层和MergeDir层看到他的inode都是一样的,可以确认是一个文件。当我对这个文件进行修改以后,UpperDir层出现文件以后,他有新的inode,到这里都是没问题的。但是这个时候在去看MergeDir的inode还是没有变化,按照联合文件系统来解释,MergeDir=LowerDir+UpperDir,当文件冲突的时候以UpperDir为准,从内容来看是没问题的,但是inode这个时候应该是MergeDir和UpperDir一样才对,但是实际是MergeDir层的inode并没有发生改变。

删除文件

在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作,原始文件不会被删除,此为白障(whiteout)这个白障我们通过例子来讲解。​​​​​​​

#我们进入容器删除了3个文件
[root@e8bd94fb3082 bin]# pwd    
/bin
[root@e8bd94fb3082 bin]# ll |grep kill
-rwxr-xr-x 1 root root   33608 Sep 30  2020 kill
-rwxr-xr-x 1 root root   28336 Sep 30  2020 pkill
-rwxr-xr-x 1 root root   24184 Sep 30  2020 skill
[root@e8bd94fb3082 bin]# rm -rf kill skill pkill
[root@e8bd94fb3082 bin]# ll |grep kill
[root@e8bd94fb3082 bin]# 

#UpperDir,这里就显示了3个特殊的文件,就是我们删除的3个文件
root@localhost bin]# docker inspect e8bd |grep -i UpperDir
                "UpperDir": "/var/lib/docker/overlay2/5b817c1abadb32403449f9123c13c2d8b0f95ee9f402444e23e344b466b1b4ca/diff",
[root@localhost bin]# cd /var/lib/docker/overlay2/5b817c1abadb32403449f9123c13c2d8b0f95ee9f402444e23e344b466b1b4ca/diff
[root@localhost diff]# ls
usr
[root@localhost diff]# cd usr/bin/
[root@localhost bin]# ll
total 0
c--------- 1 root root 0, 0 Dec  5 09:57 kill
c--------- 1 root root 0, 0 Dec  5 09:57 pkill
c--------- 1 root root 0, 0 Dec  5 09:57 skill

​​​​​​​

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

从零搭建UVM验证环境:新手入门实践指南 在数字芯片验证领域,SystemVerilog和UVM(Universal Verification Methodology)是构建高效验证环境的核心技术。其原理基于面向对象编程和事务级建模,通过组件化架构实现验证的复用性和自动化。这一方法学的技术价值在于显著提升验证效率与质量,广泛应用于处理器、通信芯片等复杂设计的验证场景。本文聚焦于UVM验证环境的搭建实践,通过一个加法器实例,详细解析了uvm_driver、uvm_monitor、uvm_sequence等关键组件的协同工作机制,并提供了基于Quest 阅读详情

相关推荐

新手必看:如何用PhaGCN2和vConTACT2搞定宏病毒组注释(附避坑指南)

本文为宏病毒组研究新手提供了使用PhaGCN2和vConTACT2进行病毒注释的完整实战指南。内容涵盖从Conda环境配置、软件安装、参数解析到结果解读的全流程,并重点分享了整合双工具进行交叉验证的策略与常见报错解决方案,旨在帮助研究者高效、准确地完成病毒分类注释工作。

j2k3l4的博客 797

Docker理解

文章目录Docker什么是DockerDocker基本架构Docker元素镜像容器DockerfileDockerfile命令从Dockfile命令看镜像分层修改时复制策略 copy-on-write (CoW)Copying makes containers efficient参考链接 Docker 什么是Docker Docker is an open platform for developing, shipping, and running applications. Docker enables

qq_15490613的博客 808

云计算虚拟化实验(一)——虚拟机软件VMware的安装以及虚拟机系统的安装(Windows7+CentOS7)

主要内容: 1、虚拟机软件的安装(以VMware为例) 2、虚拟机系统的安装(Window7 + CentOS7) 3、虚拟主机网络互访 4、不同局域网内的虚拟主机互访(软路由——海蜘蛛) 0 ——首先介绍一下什么是虚拟化? 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在

gg_asd的博客 1万+

docker_存储卷

docker存储卷 文章目录docker存储卷1 COW机制2 什么是存储卷3 使用存储卷的好处4 为什么要用存储卷5 存储卷管理方式6 存储卷的分类7 容器数据管理8 在容器中使用数据卷9 数据卷容器10 利用数据卷容器迁移数据 1 COW机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的...

959 1053

通信算法之249: DJI波形物理层

D-J-I的Lightbridge波形、Ocusync1波形、Ocusync2波形、Ocusync3波形,

leegang12的专栏 1440

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景,在 Windows Presentation Foundation(WPF)开发中,依赖项属性是一个核心且强大的特性,它为构建灵活、可扩展的用户界面提供了关键支持。理解并熟练运用依赖项属性,对于开发高效、健壮的 WPF 应用程序至关重要。本文将深入探讨 WPF 依赖项属性,通过丰富的代码示例和对关键概念的详细解释,帮助读者全面掌握这一重要特性及其应用场景。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

docker镜像所使用到的COW写时复制技术是什么

如果有进程要对数据进行写操作,系统会检测到这个行为,将数据复制一份出来,给这个进程进行写操作。:系统将需要修改的部分复制到一个新的内存区域,并将修改进程指向这个新的副本。这样,原始资源保持不变,其他进程仍然可以访问未被修改的原始资源。copy on write 简单来说,所有的读操作都是指向一份内存地址,共享这些数据,节省内存空间。:当其中一个进程尝试修改共享资源时,系统检测到这个写操作,并采取措施防止修改影响到其他进程。:修改进程现在指向新的副本,而其他进程仍然指向原始资源。

2401_84019227的博客 564

AUTOSAR OS详细介绍及配置说明(更新版20240115)

AUTOSAR OS扩展了OSEK/VDX标准中的操作系统,所以本文结合OSEK/VDX的标准来介绍AUTOSAR OS,并借助Vector Configurator讲解AUTOSAR OS的配置。源于德语,英文意思是:“车载电子设备的开发系统和接口”,它是一个标准,用来产生嵌入式操作系统的规范,通讯协议栈,和汽车网络管理协议,也产生其他相关的规范。OSEK被设计来提供整车的各种电子控制单元的软件标准架构。

酒无忧的博客 1422

docker存储卷

一.cow机制 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中该文件的副本所隐藏,这就是“写时复制(COW)”机制 对于这种方式来说,我们去访问一个文件,修改和删除等一类的操作,其效率会非常的低,因为隔着很多层镜像。而要想绕过这种限制,我们可以通过使用存储卷的机制来实现 二.什么是存储卷 存..

qq_58328312的博客 637

NXOpenC#-通用NX对象操作Tag,Handle,TaggedObject介绍

NXOpenC#-通用NX对象操作Tag,Handle,TaggedObject介绍

阿飞2018 1184

OpenClaw 超级 AI 实战专栏【实战案例】(五)邮件收发 + 日历日程 + 文件管理一站式搞定

OpenClaw 实现办公自动化核心是模块解耦:邮件收发、文件管理、日历日程各自封装,便于维护和扩展;开发中需重点解决编码兼容、权限配置、时间格式、重复处理四大类坑点,核心思路是 “提前校验 + 异常兜底 + 统一格式”;敏感信息(邮箱密码、API Token)务必通过.env管理,避免硬编码泄露。

qq_36130719的博客 742

Docker---存储---COW写时复制

转载于:https://www.cnblogs.com/li-tian-jun/p/10984477.html

weixin_30407613的博客 1283

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 2(step by step)

数字逻辑第二章习题和详细步骤 2-1 ~ 2-78

weixin_62651190的博客 2308

Docker采用CoW策略到底是干什么的?底层原理是什么?

Docker 的 CoW 策略就像给一本书中的某一页拍照,然后在照片上做笔记,而不是直接在书上写字。这样做可以保证书本身不变,同时也能轻松记录下我们需要的信息。对于 Docker 来说,这意味着每个容器都有自己独立的工作空间,可以在不影响其他容器的情况下自由修改文件。

长风破浪会有时的博客 369

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Docker基础】Docker核心概念:联合文件系统(Union FS)的写时复制(CoW)详解

当需要修改某个文件时,联合文件系统会先复制该文件到新的层(通常是容器层),然后在新的层上进行修改,而不是直接修改原文件,好处是镜像层可以保持不变,便于镜像的共享和分发,同时,由于复制操作是在真正需要修改时才进行的,因此减少了不必要的复制开销,提高了文件修改的效率。是一种将多个文件系统或目录挂载到同一个挂载点的技术,通过这种技术,用户访问联合挂载点时,看到的是各个文件系统或目录内容的合并结果,而无需关心这些内容实际存储在哪些文件系统或目录中,这种合并是透明的,用户就像在访问一个普通的文件系统一样。

IT成长日记的博客 872

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux与代码优化:COW如何用“偷懒”提升效率(转载)

在 Linux 的进程管理领域,写时复制(Copy - on - Write,简称 COW)机制是一项极为精妙的设计,它巧妙地解决了传统进程复制方式中的诸多弊端,极大地提升了系统性能与资源利用率。要理解 COW 的重要性,我们得先从传统进程创建方式 ——fork 的 “痛点” 说起。

u011743621的博客 2054

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Docker】Docker的五种存储驱动原理及其应用场景

一、原理说明 Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享同一个image。但由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动。就如Docker官网上说...

qq_34018840的博客 6309

Docker镜像分层与写时复制原理详解

Docker 通过镜像分层、联合文件系统和写时复制机制实现高效运行。镜像由多个不可变的只读层组成,容器启动时会在镜像层上添加可写层,通过联合文件系统合并呈现统一视图。写时复制确保容器修改文件时才会从镜像层复制到可写层,避免不必要的资源消耗。这种设计带来三大优势:分层实现镜像共享和快速构建,联合文件系统提供完整运行视图,写时复制保证资源高效利用和容器隔离性。典型案例包括多应用共享基础镜像、快速迭代开发以及容器间数据隔离,充分体现了 Docker 轻量高效的特点。

漫谈网络 1450

Docker镜像原理

下面的这张图片非常好的展示了组装的过程,每一个镜像层都是建立在另一个镜像层之上的,同时所有的镜像层都是只读的,只有每个容器最顶层的容器层才可以被用户直接读写,所有的容器都建立在一些底层服务(Kernel)上,包括命名空间、控制组、rootfs 等等,这种容器的组装方式提供了非常大的灵活性,只读的镜像层通过共享也能够减少磁盘的占用。这些 branches 或者是read-only 或者是 read-write 的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。

wk200411的博客 657

docker实现原理总结

前言 虚拟化核心需要解决的问题:资源隔离与资源限制 虚拟机硬件虚拟化技术, 通过一个 hypervisor 层实现对资源的彻底隔离。 容器则是操作系统级别的虚拟化,利用的是内核的 Cgroup 和 Namespace 特性,此功能完全通过软件实现。 Namespace 资源隔离 命名空间是全局资源的一种抽象,将资源放到不同的命名空间中,各个命名空间中的资源是相互隔离的。 通俗来讲,就是docker在启动一个容器的时候,会调用Linux Kernel Namespace的接口,来创建一块虚拟空间,创建的.

batman 2298

【Linux】写时复制(CopyOnWrite)技术深度解析:从原理到实战应用

本文深度解析Linux系统中的写时复制(CopyOnWrite)技术原理与实战应用。从fork()进程创建的内存共享机制出发,剖析内核如何通过缺页异常和引用计数实现延迟复制,并探讨其在Docker容器、Java并发容器及大数据系统等场景中的广泛应用与性能优化价值。

blockchain9miner的博客 574

Docker 存储原理精要

Docker镜像分层与存储机制解析:采用UnionFS技术将镜像层(只读)与容器层(读写)叠加,通过写时复制(CoW)实现高效共享。主流驱动overlay2通过分层目录结构管理数据,支持快速容器启动和磁盘优化。数据持久化推荐Volume方式,并可通过prune命令回收空间。性能关键点包括首次写入延迟、驱动选择(如overlay2适合小文件随机写)和存储优化技巧。面试常考点涉及分层原理、CoW机制及存储驱动比较(如overlay2支持更多层)。

2301_79840250的博客 548

Docker架构&&虚拟化原理

Docker简介 Docker是一个开源的容器引擎,它有助于更快地交付应用。 Docker可将应用程序和 基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。 Docker的优点如下: 1、简化程序 Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进

程序员路同学 493

Docker存储卷

文章目录1. COW机制2. 存储卷2.1 存储卷的作用2.2 存储卷的原理2.3 存储卷的分类3. 容器数据管理3.1 使用数据卷3.2 数据卷容器3.3 利用数据卷容器迁移数据 1. COW机制 COW技术原理(Copy On Write,写时复制) 针对随时变化的数据进行备份 Ø 直接映射原始盘的数据内容 Ø 当原始盘的旧数据有修改时,在修改之前自动将旧数据存入前端盘 Ø 对前端盘的修改不回写到原始盘 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添

欲川 603

Docker 镜像原理

Docker 镜像原理

2302_80190394的博客 970

Docker实战一 Docker安装卸载以及部署微服务

Docker 的安装卸载 docker容器内部安装vim、ping、ifconfig等指令 docker构建javaweb镜像 docker将自己的镜像发布到远程官方的镜像仓库里 docker容器与宿主机挂载目录

东风麦芽糖 1万+
上一篇: Docker-原理之联合文件系统(UnionFs)
下一篇: Docker-网络&跨主机通信
dessler
博客等级 码龄20年 3057粉丝 434原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值