Docker 镜像原理 | 学习笔记

简介: 快速学习 Docker 镜像原理

开发者学堂课程【Docker 快速入门:Docker 镜像原理】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/616/detail/9399


Docker 镜像原理


docker镜像

image.png

docker images 是镜像,以前留下过疑问,第一个是 Tomcat 为什么会这么大,第二个是镜像,就是千层饼,是一层套一层的花卷。

1.是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,他包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。搬家和你所在家的整栋楼都搬过去,镜像就是办了整栋楼。直接以镜像生成可运行的实例。

unionFs 联合文件系统:

Union 文件系统( UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual

filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性是一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,(假设花卷外面包了很多层,一个鸡蛋有鸡蛋壳,鸡蛋黄,鸡蛋白,一层嵌套一层一个同心圆一样)联合加载会把各层文件系统叠加起来,这样最终的文件会包含所有的底层文件和目录。

2.docker 镜像加载原理

docker 镜像底层原理是联合文件系统,1 层一层叠加,一个镜像是由多层打包构成

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

bootfs(boot file system) 主要包含 bootloader 和

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

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

Ubuntu,Centos 是 Linux 下具体概念的产品,他们内核相同只是定制的软件不一样

docker 实际而言真正干活的是 docker 上的容器,那些容器每一个都是精简版的Linux 系统,Boot 文件系统实际上就是一个 Linux 内核。

Docker 下面可以跑一个两百多兆精简版的 centos,他为什么这么小呢,因为内核部分够用,其他部分硬件不加载,只有这两个,对于一个精简的 os roptfs 可以很小,只需要包括最基本的命令工具和程序库就可以了,因为底层直接用 host 的kernel,自己只需要提供 roptfs 就行了,言下之意,Rootfs 是 centos,docker 就弄成 centos,如果是 Ubuntu 就是 unbuntu,由此可见,对于不同的 Linux 发行版 bootfs 基本是一致的,rootfs 会有差别,因此不同的发行版可以共用 bootfs。

3.分层的镜像

以 pull 为例,在下载的过程中可以看到 docker 的镜像好像是在一层一层的在下载,原来讲过 docker pull hello-world,这时是一个镜像,根据所讲,一个镜像最终干活的镜像 docker images,还是用 hello world 进行讲解

image.png

最外面暴露的镜像 ID 是 3535063d 9957,但是下载了两个,说明 hello world 最终镜像模板也是有多层构成的,例如在下载一个 centos

image.png

可以看到 hello world 是两层,也相类似,这就可以回答大家的第一个问题,为什么 hello world 这么大,为什么 tomcat 这么大还没启动?

Tomcat 大家都明白,一般情况下不会 400 多 M。

image.png

里面椭圆形是 kernel 内核,内核就是 Ubuntu,Tomcat 要装在 Linux 上,但是在tomcat 运行时在需要,在 JAVA 学习过程中,一定要先学 JAVA 再学同步Tomcat,Kernel 是最底层的,上面装的是 centos,centos 上面再包一层,就像千层饼叠花卷一样 Tomcat 需要有 JAVA jdk8,联合系统文件一层套一层,最外面暴露的是 tomcat 镜像,但这个 tomcat 镜像要全部用起来,需要有内核 kennel,centos,Jdk 8, tomcat,最终变成了 tomcat image,然后跑到集装箱里面,就是 docker。

在表面上看,tomcat 应该不大,但是为什么会有四百多兆呢,到最后可以看到,他们看一套实际上是由多层文件构成的,一层在一层上面打包,最终是 jdk 加centos 加 Tomcat 构成的精简版的基于 Linux 平台的 Tomcat,所以他有四百多兆,这时就可以理解联合系统花卷了。

分层镜像在拉的时候,每个前面都有组件 ID,每一个都是一层,例如 mangodb 也拉了很多层。

image.png

可以看到很多层,这是相当于一圈一圈包圆了,这就是 docker 镜像文件基于联合文件系统的分层原理。

接下来解释为什么 docker 镜像要采用这种分层结构,分层结构最大的好处是共享资源,因为多个镜像都有同的 base 镜像构建而来,宿主机只需要在磁盘上保存一份 base 镜像,同时内存中也只需要加载一份 base 镜像,就可以为所有容器服务,而且镜像的每一层都可以被共享。

上面加载了很多,可以明显的感觉到,第一次下载第一个镜像时非常慢,但是后续如果删除或者再下载会非常快,因为这时有了缓存,就是为了后续共享资源,所有的镜像都可以从 base 下载。

4.特点

docker 镜像都是只读的,因为镜像不能修改,最外层读的是 tomcat

当容器启动时,一个新的可写层被加载到镜像的顶部,(要启动运行的是最外层,拿一个鸡蛋,大家都知道是由三层构成的,鸡蛋黄,鸡蛋白鸡蛋壳,正常情况下先接触的都是蛋壳,不能隔着档口去取物先去操作里面)这一层通常被称为容器层,容器层之下的都叫做镜像层(花卷一定先吃最外面一层,这一层才是可写的,内部是封装好的,外层暴露的才是能看到的)

相关文章
|
11天前
|
Docker 容器
docker从指定repo拉取镜像
docker从指定repo拉取镜像
|
20小时前
|
测试技术 持续交付 Docker
Docker in Docker原理与实战
Docker in Docker原理与实战
4 0
|
2天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
2天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
2天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
|
2天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
3天前
|
存储 缓存 运维
【Docker 专栏】Docker 镜像的分层存储与缓存机制
【5月更文挑战第8天】Docker 镜像采用分层存储,减少空间占用并提升构建效率。每个镜像由多个层组成,共享基础层(如 Ubuntu)和应用层。缓存机制加速构建和运行,通过检查已有层来避免重复操作。有效管理缓存,如清理无用缓存和控制大小,可优化性能。分层和缓存带来资源高效利用、快速构建和灵活管理,但也面临缓存失效和层管理挑战。理解这一机制对开发者和运维至关重要。
【Docker 专栏】Docker 镜像的分层存储与缓存机制
|
3天前
|
数据库 Docker 容器
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
【5月更文挑战第8天】Dockerfile是构建Docker镜像的关键,它包含一系列指令,用于描述应用运行环境及所需软件包。通过自动化构建,能提高效率、保证可重复性并提升灵活性。确定基础镜像、安装依赖、设置环境后,执行Dockerfile生成镜像,用于应用程序部署。虽然需要熟悉Docker技术和应用细节,但其带来的益处使其成为现代软件开发和部署的重要工具。
【Docker 专栏】使用 Dockerfile 自动化构建 Docker 镜像
|
4天前
|
缓存 安全 数据安全/隐私保护
【Docker专栏】深入理解Docker镜像的构建与推送
【5月更文挑战第7天】本文介绍了Docker镜像的核心作用及基础概念,包括镜像作为容器模板的特性。文章详细阐述了Dockerfile的编写,例如设置基础镜像、工作目录、安装依赖及定义启动命令。通过`docker build`命令构建镜像,并提示了优化构建过程的技巧。此外,还讲解了如何将镜像推送到远程仓库,包括选择仓库、认证、标签和推送镜像的步骤,以及镜像安全性的考虑,如扫描漏洞和遵循最小权限原则。本文旨在帮助读者掌握Docker镜像的构建与推送,以高效管理容器化应用。
【Docker专栏】深入理解Docker镜像的构建与推送
|
5天前
|
运维 Linux 数据安全/隐私保护
Docker详解(九)——Docker镜像发布
Docker详解(九)——Docker镜像发布
28 2