搜索
首页运维DockerDocker镜像原理之联合文件系统和分层理解(实例详解)

本篇文章给大家带来了关于Docker镜像原理之联合文件系统和分层理解的相关知识,其中包括联合文件系统、分层结构和分层实践的相关问题,希望对大家有帮助。

Docker镜像原理之联合文件系统和分层理解(实例详解)

Docker——镜像原理之联合文件系统和分层理解

1、联合文件系统

UnionFS( 联合文件系统)

UnionFS( 联合文件系统):Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。

Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。

Docker 目前支持的联合文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

base 镜像

base 镜像简单来说就是不依赖其他任何镜像,完全从0开始建起,其他镜像都是建立在他的之上,可以比喻为大楼的地基,docker镜像的鼻祖。

base 镜像有两层含义:(1)不依赖其他镜像,从 scratch 构建;(2)其他镜像可以之为基础进行扩展。

所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。

Docker 镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。

典型的 Linux 启动到运行需要两个FS,bootfs rootfs:

Docker镜像原理之联合文件系统和分层理解(实例详解)

bootfs(boot file system)主要包含 bpotloader 和 kernel,bootloader主要是引导加载 kernel,Linux 刚启动时会加载 bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器bootloader和内核kernel。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

Docker 镜像中为什么没有内核

从镜像大小上面来说,一个比较小的镜像只有1KB多点,或几MB,而内核文件需要几十MB, 因此镜像里面是没有内核的,镜像在被启动为容器后将直接使用宿主机的内核,而镜像本身则只提供相应的rootfs,即系统正常运行所必须的用户空间的文件系统,比如/dev/,/proc,/bin,/etc等目录,所以容器当中基本是没有/boot目录的,而/boot当中保存的就是与内核相关的文件和目录。

由于容器启动和运行过程中是直接使用了宿主机的内核,不会直接调用过物理硬件,所以也不会涉及到硬件驱动,因此也用不上内核和驱动。而如果虚拟机技术,对应每个虚拟机都有自已独立的内核

2、分层结构

Docker 镜像是一种分层结构,每一层构建在其他层之上,从而实现增量增加内容的功能,Docker 镜像下载的时候也是分层下载,以下载redis镜像为例:

Docker镜像原理之联合文件系统和分层理解(实例详解)

Docker镜像原理之联合文件系统和分层理解(实例详解)

可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

为什么 Docker 镜像要采用这种分层结构呢?

最大的好处,莫过于是资源共享了。比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

可写的容器层

Docker 镜像都只是可读(read-only)的,当容器启动时,一个新的可写层被加载到镜像顶部。

这新的一层就是可写的容器层,容器之下都叫镜像层。

Docker镜像原理之联合文件系统和分层理解(实例详解)

Docker通过一个修改时复制策略copy-on-write来保证base镜像的安全性,以及更高的性能和空间利用率。

  • 当容器需要读取文件的时候

从最上层的镜像层开始往下找,找到后读取到内存中,若已经在内存中,可以直接使用。换句话说,运行在同一台机器上的Docker容器共享运行时相同的文件。

  • 当容器需要修改文件的时候

从上往下查找,找到后复制到容器层,对于容器来说,可以看到的是容器层的这个文件,看不到镜像层里的文件,然后直接修改容器层的文件。

  • 当容器需要删除文件的时候

从上往下查找,找到后在容器中记录删除,并不是真正的删除,而是软删除。这导致镜像体积只会增加,不会减少。

  • 当容器需要增加文件的时候

直接在最上层的容器可写层增加,不会影响镜像层。

所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的,所以镜像可以被多个容器共享。

3、分层实践——commit 提交镜像

通过镜像创建容器,然后对容器层进行操作,镜像层不动,再把操作后的容器层和镜像层打包成一个新的镜像提交。

docker commit:用容器创建一个新的镜像。

语法:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • **-a*提交的镜像作者;
  • **-c*使用Dockerfile指令来创建镜像;
  • **-m *提交时的说明文字;
  • **-p *在commit时,将容器暂停。

使用实例:通过镜像创建容器,然后对容器层进行操作,再把操作后的容器层和镜像层打包成一个新的镜像提交。

1、先下载 tomcat 镜像

2、通过tomcat 镜像创建运行tomcat 容器:

docker run -d --name="tomcat01" tomcat

3、进入正在运行的tomcat容器:

docker exec -it tomcat01 /bin/bash

4、把tomcat容器 webapps.dist目录下的文件拷贝到webapps目录下:

cp -r webapps.dist/* webapps

5、docker commit 提交镜像

将容器 dc904437d987 保存为新的镜像,并添加提交人信息和说明信息,提交后的镜像名为tomcatplus,版本为1.0:

docker commit -a="wanli" -m="add webapps files" dc904437d987 tomcatplus:1.0

Docker镜像原理之联合文件系统和分层理解(实例详解)

可以看到commit提交后的新 tomcat 镜像大小比原来的tomcat镜像要大一点,因为我们在容器层中进行了复制文件操作。

Docker镜像原理之联合文件系统和分层理解(实例详解)

推荐学习:《docker视频教程

以上是Docker镜像原理之联合文件系统和分层理解(实例详解)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
Docker vs. Kubernetes:用例和方案Docker vs. Kubernetes:用例和方案Apr 23, 2025 am 12:11 AM

在小型项目或开发环境中选择Docker,在大型项目或生产环境中选择Kubernetes。1.Docker适合快速迭代和测试,2.Kubernetes提供强大的容器编排能力,适合管理和扩展大型应用。

Linux上的Docker:Linux系统的容器化Linux上的Docker:Linux系统的容器化Apr 22, 2025 am 12:03 AM

Docker在Linux上重要,因为Linux是其原生平台,提供了丰富的工具和社区支持。1.安装Docker:使用sudoapt-getupdate和sudoapt-getinstalldocker-cedocker-ce-clicontainerd.io。2.创建和管理容器:使用dockerrun命令,如dockerrun-d--namemynginx-p80:80nginx。3.编写Dockerfile:优化镜像大小,使用多阶段构建。4.优化和调试:使用dockerlogs和dockerex

Docker:容器化工具,Kubernetes:编排者Docker:容器化工具,Kubernetes:编排者Apr 21, 2025 am 12:01 AM

Docker是容器化工具,Kubernetes是容器编排工具。1.Docker打包应用及其依赖成容器,可在任何支持Docker的环境中运行。2.Kubernetes管理这些容器,实现自动化部署、扩展和管理,使应用高效运行。

Docker的目的:简化应用程序部署Docker的目的:简化应用程序部署Apr 20, 2025 am 12:09 AM

Docker的目的是简化应用部署,通过容器化技术确保应用在不同环境中一致运行。1)Docker通过将应用和依赖打包到容器中,解决了环境差异问题。2)使用Dockerfile创建镜像,确保应用在任何地方一致运行。3)Docker的工作原理基于镜像和容器,利用Linux内核的命名空间和控制组实现隔离和资源管理。4)基本用法包括从DockerHub拉取并运行镜像,高级用法涉及使用DockerCompose管理多容器应用。5)常见错误如镜像构建失败和容器无法启动,可通过日志和网络配置调试。6)性能优化建

Linux和Docker:不同Linux发行版的DockerLinux和Docker:不同Linux发行版的DockerApr 19, 2025 am 12:10 AM

在Ubuntu、CentOS和Debian上安装和使用Docker的方法各有不同。1)Ubuntu:使用apt包管理器,命令为sudoapt-getupdate&&sudoapt-getinstalldocker.io。2)CentOS:使用yum包管理器,需添加Docker仓库,命令为sudoyuminstall-yyum-utils&&sudoyum-config-manager--add-repohttps://download.docker.com/lin

掌握Docker:Linux用户指南掌握Docker:Linux用户指南Apr 18, 2025 am 12:08 AM

在Linux上使用Docker可以提高开发效率和简化应用部署。1)拉取Ubuntu镜像:dockerpullubuntu。2)运行Ubuntu容器:dockerrun-itubuntu/bin/bash。3)创建包含nginx的Dockerfile:FROMubuntu;RUNapt-getupdate&&apt-getinstall-ynginx;EXPOSE80。4)构建镜像:dockerbuild-tmy-nginx.。5)运行容器:dockerrun-d-p8080:80

Linux上的Docker:应用和用例Linux上的Docker:应用和用例Apr 17, 2025 am 12:10 AM

Docker在Linux上可以简化应用部署和管理。1)Docker是容器化平台,将应用及其依赖打包进轻量、可移植容器。2)在Linux上,Docker利用cgroups和namespaces实现容器隔离和资源管理。3)基本用法包括拉取镜像和运行容器,高级用法如DockerCompose可定义多容器应用。4)调试常用dockerlogs和dockerexec命令。5)性能优化可通过多阶段构建减小镜像大小,保持Dockerfile简洁是最佳实践。

Docker:用于可移植性和可扩展性的容器化应用程序Docker:用于可移植性和可扩展性的容器化应用程序Apr 16, 2025 am 12:09 AM

Docker是一种基于Linux容器技术的工具,用于打包、分发和运行应用,提升应用的可移植性和可扩展性。1)通过dockerbuild和dockerrun命令,可以构建和运行Docker容器。2)DockerCompose用于定义和运行多容器的Docker应用,简化微服务管理。3)使用多阶段构建可以优化镜像大小,提升应用启动速度。4)查看容器日志是调试容器问题的有效方法。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具