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

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

相关文章
|
5天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
148 28
|
1天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
6天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
64 2
|
8天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
17 1
|
9天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
14天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
27 1
|
1天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
8 0
|
3月前
|
存储 安全 Ubuntu
Docker 镜像与 Docker 容器的区别
【8月更文挑战第27天】
273 5
|
3月前
|
存储 Ubuntu 应用服务中间件
在Docker中,怎么快速查看本地的镜像和容器?
在Docker中,怎么快速查看本地的镜像和容器?
|
4月前
|
Shell Linux Docker
docker常用命令大全(基础、镜像、容器、数据卷)
这些命令仅仅是 Docker 命令行工具的冰山一角,但对于日常操作来说已经非常全面。通过熟练地使用这些基础命令,用户可以有效地管理 Docker 的镜像、容器、数据卷和网络。随着用户对 Docker 的深入使用,更高级的命令和选项将会变得必需,但上面列出的命令已经为用户提供了一个坚实的起点。对于初学者来说,理解和掌握这些常用命令是深入学习 Docker 的基础。
439 5
docker常用命令大全(基础、镜像、容器、数据卷)
下一篇
无影云桌面