剖析Docker镜像原理

前言:
作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!

前不久给大家分享了Docker的基本理论知识,稍微介绍了镜像相关的概念,本篇文章则着重剖析Docker镜像底层原理。让小伙伴们理解为什么我们启动一个 Docker 会是秒极启动,为什么拉取镜像时是一层层拉取。

文章目录

  • 1. 写在前面
  • 2. 什么是镜像
  • 3. Docker镜像加载原理
  • 4. 为什么Docker镜像要采用这种分层结构呢?
  • 5. 本章小结

1. 写在前面

希望通过本篇文章让小伙伴们理解几个问题:

  • 镜像的本质是什么?
  • Docker 中一个 Ubuntu 镜像为什么只有一百多兆,而一个 Ubuntu 操作系统的 iso 文件要好几个G?

在开启分享之前先分享一个前提知识。Linux 操作系统中的文件管理系统:
Linux 文件系统主要由boofts 和 rootfs两部分组成,其中

  • bootfs:包含 bootloader(引导加载程序)和 kernel(内核)
  • rootfs:root 文件系统,包含的 Linux系统中的 /dev、/proc、/bin、/etc 等标准目录和文件。

所以,不同的Linux发行版,bootfs基本是一样的,只是 rootfs 不同,如ubuntu、centos等,相当于他们共用一个 bootfs 系统。

2. 什么是镜像

简而言之,镜像的本质就是一个分层文件系统。详解如下,
镜像就是一种轻量级、可执行的独立软件包,它包含运行某个软件所需要的所有内容。例如,开发把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 images 镜像文件。
其中打包的具体内容可以包括 代码、运行时需要的库、环境变量和配置文件等。
镜像也可以看做是java中的类。然后new出来的对象可以看作是Docker容器实例,这样应该就好理解了吧。

3. Docker镜像加载原理

当我们在下载镜像时,会看到镜像下载流程是一层层下载。
例如,docker pull tomcat
剖析Docker镜像原理_第1张图片
实际上,镜像是由一层层的文件系统叠加而成,这些一层层的文件系统就叫做UnionFS(联合文件系统)
UnionFS 系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
UnionFS 是 Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像。

剖析Docker镜像原理_第2张图片
在Docker底层有个bootfs(boot file system)系统,在bootfs中主要包含 bootloader 和 kernel,bootloader 主要是引导加载kernel,Linux 系统刚启动时会加载 bootfs 文件系统,在Docker 镜像的最底层是引导文件系统 bootfs。这一层与典型得到Linux/Unix 系统一样,包含boot加载器和内核。当 boot加载完成之后整个内核就都在内存中了。

Why:Docker中一个 Ubuntu 镜像为什么只有几十兆,而一个 Ubuntu 操作系统的 iso 文件要好几个G?

答:对于一个精简OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层直接用host的kernel,自己只需要提供rootfs就行了,由此可见,对于不同linux发行版,bootfs基本是一致的,rootfs会有差别,因为不同的发行版可以公用bootfs。

剖析Docker镜像原理_第3张图片

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

最大的一个好处是共享资源方便复制迁移便于复用
比如说有多个镜像都从相同的base镜像构建而来,那么Docker host只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
再比如,我们开启一个Ubuntu容器,在容器中下载vim、ifconfig命令,然后再将这个容器commit成新的镜像,再用这个新的镜像开启新的容器,那么新的容器中自动会有vim、ifconfig命令,这就是复用。

5. 本章小结

  • Docker 镜像的本质是什么
    是一个分层文件系统
  • Docker 中一个Ubuntu镜像为什么只有几十兆,而一个ubuntu 操作系统的iso文件要几个G
    Ubuntu的iso镜像文件包含bootfs和rootfs,而docker的ubuntu镜像复用操作系统的bootfs,所以ubuntu镜像中只有rootfs和其他镜像层
  • 镜像层只读,容器层可写。容器层之下都叫做“镜像层”。

你可能感兴趣的:(Docker,Docker镜像原理,Docker容器,联合文件系统,镜像分层,云原生)