当前位置:   article > 正文

Docker学习(二十)什么是分层存储?_docker分层

docker分层

1.简介

Docker 中的分层存储(Layered Storage) 是指 Docker 镜像的一种存储方式,它使用了一种名为 联合挂载系统(Union Mount) 的技术,其文件系统是分层的,将多个只读层叠加在一起,形成一个可读写的联合文件系统,以提供 Docker 镜像的高效存储和管理。

目前 docker 支持的联合文件系统有很多种,包括:AUFS、overlay、overlay2、DeviceMapper、VSF等。

Linux 中各发行版实现的 UnionFS 各不相同,所以 docker 在不同 linux 发版中使用的也不同。通过 docker info 命令可以查看当前系统所使用的是哪种 UnionFS:

在这里插入图片描述

常见的几种 UnionFS 的 Storage Driver 发行版如下:

  • CentOS 系统中:overlay2overlay
  • debain 系统中:aufs
  • RedHat 系统中:devicemapper

2.什么是 Union Mount?

Union Mount: 联合挂载系统,也称为 Union File System(联合文件系统),是一种文件系统叠加技术,它允许将多个只读文件系统叠加在一起,形成一个新的只读或可读写的容器文件系统。在 Linux 中,Union Mount 是通过内核的 UnionFS 或 OverlayFS 文件系统实现。

(mount 是 Linux 中的挂载命令。)

Union Mount 主要有两个作用:

  1. 可以将多个只读文件系统合并成一个只读或可读写的文件系统。 在 Docker 中,这意味着可以将多个只读的镜像层级结构叠加在一起,形成一个可读写的容器文件系统。
  2. 可以将一个文件系统作为另一个文件系统的 “补丁”,即只保留被更改的文件,并在需要时覆盖被更改的文件。这样可以减少存储空间的占用,并提高文件系统的性能。

在 Docker 中,Union Mount 技术被用于实现 Docker 镜像的分层存储和容器的文件系统。每个 Docker 镜像都由多个只读层级结构组成,这些层级结构可以使用 Union Mount 技术叠加在一起,形成一个可读写的容器文件系统。当容器中的文件被更改时,Docker 只需要在容器文件系统的顶层层级结构中进行更改,而不是在底层的只读层级结构中进行更改。这样可以保证 Docker 镜像的不可变性,并且可以更快地更新和部署容器

3.分层介绍

下面我们就以 CentOS 发行版的 overlay2 文件系统进行介绍,其实不管是什么发行版,其远离都如出一辙。

overlayer2 官方介绍: https://docs.docker.com/storage/storagedriver/overlayfs-driver/

先来看张图:

在这里插入图片描述

从上图中的右边可以看到 OverlayFS 中有三个层级结构:lowerdirupperdirmerged 层。

对应的,使用 docker inspect [container-id] 就可以看到这几个层所在的位置:

"GraphDriver": {
    "Name": "overlay2",
    "Data": {
        "LowerDir": "/var/lib/docker/overlay2/45abab78c6fd022d9ce132a0fb995f9e91bc0a807ccc73e2461fce6c9b68b250/root",
        "MergedDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/merged",
        "UpperDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/upper",
        "WorkDir": "/var/lib/docker/overlay2/dc838cbc7d903a4bfd6bd0280a6910c063f2d1f03439e917ebc773fccc377402/work"
    }
},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1)lowerdir 层(镜像层)

lowerdir 层是只读的镜像层(image layer),其中就包括 bootfsrootfs 层。

  • bootfs(boot file system) 是指 引导文件系统,主要包含:bootloader(启动引导) 和 kernel(内核)。

    bootloader 主要是引导加载 kernel,当 kernel 成功被加载到内存中,bootfs 就会被 umount(解除挂载)了。

  • rootfs(root file system) 是指 根文件系统,主要包含的就是典型 Linux 系统中的 /dev、/proc、/bin、/etc 等标准目录。

lowerdir 是可以分很多层的,除了 bootfs、rootfs 层以外,还可以通过 Dockerfile 建立很多层,构建过程如下:

在这里插入图片描述

Dockerfile 中每一个指令都会生成一个新的 image 层,如上图所示。

当 FROM 时就已经生成了 bootfs(引导文件系统)和 rootfs(根文件系统)层,也就是 kernel(内核)和 base(基础)层。

2)upperdir 层(容器层)

upperdir 层时 lowerdir 的上一层,只有这一层可读可写,其实就是 Container 层,在启动一个容器的时候会在最后的 image 层的上一层自动创建,所有对容器数据的更改都会发生在这一层

3)merged 层

merged 层就是联合挂载层,也就是给用户暴露的统一视觉,将 image 层 和 container 层结合,就如最上面的图中描述一致:同一文件,在此层会展示离它最近的层级里的文件内容,或者可以理解为,只要 container 层中有此文件,便展示 container 层中的文件内容,若 container 层中没有的,则展示 image 层中的可视文件。

在这里插入图片描述

4.工作原理

1)读:

  • 如果文件在 upperdir(container)层,直接读取文件;
  • 如果文件不在 upperdir(container)层,则从镜像层(lowerdir)读取。

2)写:

  • 首次写入: 如果 upperdir 中不存在,overlay 和 overlay2 执行 copy_up 操作,把文件从 lowerdir 层拷贝到 upperdir 层中,由于 overlayfs 是文件级别的(即使只有很少的一点修改,也会产生 copy_up 操作),后续对同一文件的再次写入操作将对已复制到 upperdir 层的文件副本进行修改,也就是常说的写时复制(copy-on-write)
  • 删除文件或目录: 当文件被删除时,在 upperdir 层创建 without 文件,lowerdir 层(镜像层)的文件时不会被删除的,因为它们是只读的,但 whiteout 文件会组织它们显示,当目录被删除时,在 upperdir 层(容器层)创建一个不透明的目录,这个和上边的 without 文件原理一样,阻止用户继续访问,image 层不会发生改变。

3)注意事项:

  • copy_up 操作只发生在文件首次写入,以后都是只修改副本;
  • overlayfs 只适用两层目录,相比于 AUFS,查找搜索都更快;
  • 容器层的文件删除只是一个“障眼法”,是靠 without 文件将其遮挡,image 层并没有删除,这也就是为什么使用 docker commit 提交的镜像会越来越大,无论在容器层怎么删除数据,images 层都不会改变。

5.扩展:docker 与 VM 的对比

带着问题学习:为什么 docker 容器启动这么快呢?

先来看一张 docker 与 VM 的对比图:

在这里插入图片描述

可以清楚地看到,VM 比 docker 多了 Hypervisor 和 Guest OS 的过程,也正是省略了这两个过程使 docker 技高一筹,问题又来了, 为什么 docker 可以省略这些过程呢。

Hypervisor: 主要作用时实现硬件资源虚拟化;因为 docker 容器上程序直接使用的都是物理机的硬件资源,所以不需要资源虚拟化的过程,也因此在 CPU、内存利用率上 docker 将会在效率上明显提高。

Guest OS: 主要作用加载操作系统内核;因为 docker 利用的是宿主机的内核,所以在启动一个容器时,不需要像 VM 一样重新加载一个操作系统内核,也因此大大节约了启动时间。

以下是官网提供的容器启动过程图:

在这里插入图片描述

整理完毕,完结撒花~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/80725
推荐阅读
  • 我们都知道,jmeter可以做接口测试,也可以用于性测试,现在企业中性测试也大多使用jmeterdocker是最近这些年流行起来的容器部署工具,可以创建一个容器,然后把项目放到容器中,就可以构建出一个独立的运行环境。用docker创建... [详细]

  • docker_面试docker面试dockerDocker是什么?是实现容器技术的一种工具是一个开源的应用容器引擎使用C/S架构模式,通过远程API来管理(我们本机是C,docker引擎是S,实际的构建过程是在docker引擎下完成的)可以... [详细]

  • 与dockersave不同,dockerexport只导出容器的文件系统,不包含镜像的元数据信息和层。与dockerload不同,dockerimport命令会将文件作为一个新的镜像导入,而不是还原已有的镜像。dockerexport导出的... [详细]

  • 我们知道使用镜像创建一个容器,该镜像必须与Docker宿主机系统架构一致,例如Linuxx86_64架构系统中只能使用Linuxx86_64的镜像创建容器例如我们在Linuxx86_64中构建一个username/test镜像CMDech... [详细]

  • `dockerexec-it`:在运行的容器中执行命令。-`dockerbuild-t:`:构建一个镜像。-`dockerpush:`:将镜像推送到远程仓库。-`dockerstart`:启动一个已停止的容器。-`dockerstop`:停... [详细]

  • Docker是一种流行的开源软件平台,可简化创建、管理、运行和分发应用程序的过程。它使用容器来打包应用程序及其依赖项。Docker主导了市场。大多数顶级云和IT公司都采用Docker来简化其应用程序开发工作流程。对具有Docker经验的申请... [详细]

  • 1.Docker和虚拟机有啥不同?答:Docker是轻量级沙盒,在其中运行只是应用,虚拟机里面还有额外系统。查看twt论坛_关于docker面试题关于docker面试题1.Docker和虚拟机有啥不同?答:Docker是轻量级沙... [详细]

  • docker快速安装mysqldocker安装mysql1、创建宿主机挂载磁盘目录mkdir-p/home/huangliang/mysql/datamkdir-p/home/huangliang/mysql/config122、创建配置文... [详细]

  • 最近阿里面试官问我Docker是做什么用,我记得之前360和美团,京东都问过,但是一直没时间看,最近有时间了,系统学习了一下Docker,在此做一下记录,方便各位看官学习交流一、Docker概述:Docker:本意是码头工人,言外之... [详细]

  • Docker是一个开源应用容器引擎,让开发者可以打包他们应用以及依赖包到一个可移植容器中,然后发布到任何流行Linux机器或Windows机器上,也可以实现虚拟化。如果要删除正在运行容器,需要先停止容器,然后再删除容器。进入容器后... [详细]

  • 如何通过docker快速构建个人博客网站docker构建个人博客网站1、项目地址https://gitee.com/hhll/blog-hangliang.git2、打包docker镜像并上传docker hub【1】注册dock... [详细]

  • Arthas是一款强大的Java诊断和调试工具,它能够在生产环境中实时诊断Java应用,提供强大的调试功能,帮助开发者和运维人员解决各种Java应用的性能问题和调试挑战。本指南将介绍如何在Docker环境中使用Arthas进行实战。​​​​... [详细]

  • 配置持续部署工具(如Kubernetes、DockerSwarm、AWSECS等),监视Docker镜像仓库中的新镜像,并将其自动部署到生产环境中。当Dockerfile中的指令没有变化时,Docker会重用之前的构建缓存,而不是重新执行该... [详细]

  • docker安装minio对象存储docker安装minioMinIO是一款高性能、分布式的对象存储系统.它是一款软件产品,可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。MinIO与传统的存储和其他的对象存储... [详细]

  • 主要记录在centos当中安装MinIO_docker链接minio看看启动是否正常docker链接minio看看启动是否正常一、查看docker环境是否正常dockersearchminIO1  如果能查出来证明docker安装的没问题,... [详细]

  • 使我们在重启docker时,自动启动相关容器。配置MinIOWeb控制台端口地址。配置MiniIOApi接口端口地址。以守护式容器在后台运行。_docker安装miniodocker安装miniodocker安装Minio搜索可安装版本do... [详细]

  • Docker安装Minio_docker安装miniodocker安装minio1、检索和拉取Minio镜像#查看本地镜像dockerimages#检索minio镜像dockersearchminio#拉取minio镜像dockerpull... [详细]

  • Docker安装Minio_docker安装miniodocker安装minio文章目录一、查看Minio镜像二、下载镜像三、创建并启动Minio容器四、查看Minio容器五、登录Minio控制台六、创建桶七、创建分组八、创建MInio用户... [详细]

  • 使用docker-compose安装2023最新minio_docker-compose最新版本docker-compose最新版本上一篇使用了比较传统的方式安装minio并添加进systemctl管理,最近比较闲,把以前的一些服务改为d... [详细]

  • 1.拉取镜像dockersearchminio;//在dockerhub中查询;dockerpullminio/minio2.创建两个目录/data/config3.启动镜像容器dockerrun--nameminio-p9000:9000... [详细]

相关标签