首页 > 其他分享 >什么是docker的写时复制(CoW)?有什么作用?

什么是docker的写时复制(CoW)?有什么作用?

时间:2022-08-22 11:49:20浏览次数:64  
标签:文件 CoW 容器 复制 镜像 docker 拷贝


问题一个问题:docker CoW你知道是什么吗?

 

1、什么是CoW?

 

CoW = Copy-On-Write

 

也就是,你经常会听到的一个词,叫做:写时复制。

 

那么,到底什么是写时复制,究竟有什么样的作用呢?

 

2、CoW有什么作用?

 

下面的部分,咱们就逐一进行揭晓:

 

首先,写时复制策略,是一种共享、拷贝文件的方法,用以最大化的提高效率。我们都知道,镜像是以多层的的方式存在的,如果有一个文件,在镜像的较低层中已经存在了,当其他的层需要读取这个文件的时候,就只是使用这个已经存在的文件。

 

是不是,听着有点懵,没关系,我们接着看:当第一次,另外的一个层需要修改这个文件的时候(构建镜像和运行容器的场景),在较低层中的文件被拷贝到这个需要的层,然后进行修改。简单来说,就是需要修改哪个文件,就拷贝哪个文件,然后进行修改,这样在构建或者运行容器,修改文件时,就最小化了拷贝的I/O的大小。同时,后面的层,无论是容器的可写层,还是镜像层的大小也将保持比较小的大小。

 

3、CoW的好处?

 

下面的部分,我们更加详细的解释,CoW策略的好处:

 

3.1、共享镜像层减少镜像的大小

 

先说第一个最大的好处:共享的好处,减少镜像的大小

 

当通过docker pull命令从镜像仓库拉取镜像,当本地没有这个镜像的时候,镜像的每一层都会被单独的拉取下来,然后存储到docker所在主机的存储目录中。

 

镜像的每一层都存储在自己的目录中,这些目录在docker宿主机的本地存储区域中(比如某个目录下,一般/var/lib/docker/<存储驱动>,当然可以修改目录的地址)。

 

假如,有2个Dockerfile,第一个创建一个镜像,名字:acme/my-base-image:1.0

 

# syntax=docker/dockerfile:1
FROM alpine
RUN apk add --no-cache bash

 

第2个镜像,基于这个镜像(from),然后,增加了一些额外的层

 

# syntax=docker/dockerfile:1
FROM acme/my-base-image:1.0
COPY . /app
RUN chmod +x /app/hello.sh
CMD /app/hello.sh

 

第2个镜像包含了第1个镜像的所有的层,然后增加了一些其他的层。

 

由于docker在构建第1个镜像的时候,已经有了所有的层,所以呢,就不需要再次的拉取这些层。简单来说,就是这2个镜像在某些层上是共用的。

 

如果通过以上的2个Dockerfile来构建镜像,可以使用dokcer images 和 docker image history 命令看到,这些共享层的加密ID是相同的。

 

并且,共享的镜像的层,在docker的存储目录中,只有一份。同时呢,即使在向镜像仓库推送、存储的时候,也仅仅是存储一份,也是共享的。共享镜像层,也减少网络贷款和存储空间的大小。

 

3.2、复制使容器更高效

我们都知道,当启动一个容器的时候,会在所有的层上面增加一个可写的容器层。容器对于文件系统的任何的修改,都存储在这个层里面。最重要的,任何容器不会修改的文件,都不会被拷贝到这个可写层中来。也就是说,可写层会尽可能的小。

 

当需要在容器中对一个已经存在文件做修改时,存储驱动会执行一个写时拷贝的动作。具体的步骤如下(针对overlay2存储驱动):

 

  • 在镜像层中搜索该文件的最新版本。整个的搜索文件的过程,先从最上层,也就是最新的层开始,然后一直到最基础的层,每次只搜搜一层(当然,前提是当前层,没有找到)。当这个文件被找到的时候,会将这个文件加载到缓存中,为后续的操作做好准备。

 

  • 将文件拷贝到容器的可写层

 

  • 所有的修改,都是在这个文件的拷贝上执行的,容器无法看到存在于底层的只读状态的文件的拷贝。也就是说,对于容器来说,不管底层的文件的,只是对需要的文件的副本进行修改。

 

记住,对于容器来说,那些需要写大量数据的容器会消耗比较大的空间。因为,当进行写的操作的时候,会消耗容器的可写层的空间。

 

注意:修改文件的元数据(比如文件的权限,所有者),同样会执行拷贝的动作,因此,也会将文件拷贝到可写层。

 

注意,注意!文件的拷贝的操作是有性能的开销的。对于大文件,多镜像层,多级的目录树来说,这样的影响会比较显著。

 

所以,简单来说,只是在可写层,对需要的文件进行拷贝,也减少了容器层的大小。

 

同时,对于容器的启动来说,仅仅是执行命令即可,减少容器的启动时间。

 

4、总结

 

我们来总结一下,CoW是什么,好处是什么?

 

CoW(Copy On Write):写时复制

 

好处:

 

  • 共享镜像层,减少镜像大小、占用存储空间大小
  • 减少容器大小
  • 减少容器的启动时间
  • 当多个容器使用相同镜像时,只需创建可写层

 

对比:

 

如果Docker每次创建一个新容器时都必须对底层映像堆栈进行完整的复制,那么容器创建时间和磁盘空间的使用将会显著增加。这类似于虚拟机的工作方式,每个虚拟机有一个或多个虚拟磁盘。

 

 

 

 

 

 

标签:文件,CoW,容器,复制,镜像,docker,拷贝
From: https://www.cnblogs.com/chuanzhang053/p/16612286.html

相关文章

  • docker 安装 xxl-job
    1、安装mysql安装步骤:https://www.cnblogs.com/leihongnu/p/16258505.html创建数据库并导入数据(xxl_job)vim tables_xxl_job.sql官网地址:https://github.com/xuxueli/x......
  • 使用 Docker 搭建 gitea 私有仓库
    一、准备材料安装环境:linux工具:docker软件:MySql、gitea二、安装Docker安装Docker:https://www.cnblogs.com/jzcn/p/15693786.html三、下载镜像使用DocKer下载Mysq......
  • 用了这款docker监控平台,再也不用记一大堆命令了,真香!
    每天进步一点点,关注我们哦,每天分享测试技术文章本文章出自【码同学软件测试】码同学公众号:自动化软件测试,领取资料可加:magetest码同学抖音号:小码哥聊软件测试 随着云......
  • docker国内镜像
    docker使用国内镜像,在设置中添加如下代码:"registry-mirrors":["https://registry.docker-cn.com"]......
  • docker-compose-运行微服务项目
    1.数据库迁移将cloud-demo涉及的相关sql导入到Linux上的mysql容器中2.阅读docker-compose.yml文件version:"3.2"services:nacos:image:nacos/nacos-server......
  • Centos7安装Docker
    0.安装DockerDocker分为CE和EE两大版本。CE即社区版(免费,支持周期7个月),EE即企业版,强调安全,付费使用,支持周期24个月。DockerCE分为stabletest和nightly......
  • 属性复制和转换
    属性复制和转换publicstatic<X>XtoBean(Objectsrc,Class<X>t){if(t==null){returnnull;}Xinstance=null;try{in......
  • 复制
    ##什么是复制复制是指分布系统中,多台机器上保持相同副本的机制.##多副本能够解决的问题?1.地理位置上的副本,能够降低延迟.高性能2.部分组件失效后,系统依然能够工......
  • Docker01--介绍与安装、镜像和容器操作、应用部署
    https://www.cnblogs.com/liuqingzheng/p/16315254.html0docker内容详细内容:http://www.liuqingzheng.top/linux/Linux系列教程/1docker介绍,跟传统虚拟机的比较2安......
  • Docker之RabbitMQ保姆级别安装
    Docker之RabbitMQ保姆级别安装:如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样)学英语网站项目:自己先保证Redis、Nginx、RabbitMQ......