写点什么

【云原生 | 从零开始学 Docker】四、Docker 镜像深度解析

作者:泡泡
  • 2022 年 9 月 15 日
    河北
  • 本文字数:1712 字

    阅读完需:约 6 分钟

【云原生 | 从零开始学Docker】四、Docker镜像深度解析

写在前面

相信大家经过前面的练习都掌握了基本的指令,在实战操作之后我们就要进行镜像的详解来帮助大家对于 docker 有一个更深层次的理解,并且会介绍一下我们的容器卷,后面也会用到容器卷进行数据同步!


这章的内容不是很多,也不难,不过这也是非常重要的一个内容。

镜像原理

镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件环境和基于运行环境开发的软件,它包含某个软件的所有所需内容,包括代码,环境等。

容器与镜像的关系

容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而 Dockerfile 中的 ENV、VOLUME、CMD 等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那此时每一个 docker 镜像还会包含 json 文件记录与容器之间的关系。

镜像加载原理

UnionFS(联合文件系统)

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


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


举个例子,比如一个 mysql,一个 tomcat,tomcat 下载了 centos,mysql 就不用下载了 ,过去就用,并且他是一层一层叠加的。

分层加载

Docker 的镜像实际由一层一层的文件系统组成:


bootfs 主要包含 bootloader 和 kernel。bootloader 主要是引导加载 kernel,完成后整个内核就都在内存中了。此时内存的使用权已由 bootfs 转交给内核,系统卸载 bootfs。可以被不同的 Linux 发行版公用。bootfs 启动的时候都要引导加载,加载 linux 的东西几乎不变,一个内核一个加载器,加载完之后会自动卸载卸载 bootfs 并把权限交给内核。


rootfs 包含典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件。rootfs 就是各种不同操作系统发行版(Ubuntu,Centos 等)。因为底层直接用 Host 的 kernel,rootfs 只包含最基本的命令,工具和程序就可以了。对于一个精简的 os,rootfs 可以很小,只需要包含基础命令,工具和程序库,因为底层直接用 host 的 kernel,自己只用提供 bootfs 就行了,对于不同的 linux 版本,bootfs 基本一致。rootfs 会有差别,因此不同的版本可以用公用的 bootfs。



所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层,比如 centos 是第一层,python 是第二层。这样有一个最大的一个好处就是共享资源


比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份 base 镜像, 同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。实现了资源共用,所以 pull 是分层下载,避免重复下载,简单的类比就是虚拟机,你多个虚拟机用同一个镜像。并且在添加额外的镜像层时,它会始终保持所有镜像组合,比如一个镜像两层,每层三个文件,最终拼起来是六个文件,但是突然来了个新需求,新加了一层,但是这个新加的文件是第二层的一个升级版,此时系统会覆盖一下低级版本,所以还是六个文件。



我们 pull 了一个 tomcat,本来的 tomcat 是只读的,我们启动之后它会在上面加一层,所有操作都在这里,叫容器层。然后再两个一起打包成一个大的镜像(也是新的)底层的东西不会变的,你的操作实际上就是在新加操作。

特点

容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O),“容器层”之下的都叫“镜像层”。

如何提交自己的镜像

docker commit 提交容器成为新的副本
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
复制代码


通过上篇文章下载的 tomcat 来示范




这样就完成了镜像上传,也算是 docker 的精华,整个环境打包,类似于快照,想保存就 commit 打包就可以了。

写在最后

创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!目前正在更新的系列:云原生系列。感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~

发布于: 刚刚阅读数: 3
用户头像

泡泡

关注

做最好的知识分享 云计算/云原生 2022.08.25 加入

CSDN万粉博主

评论

发布
暂无评论
【云原生 | 从零开始学Docker】四、Docker镜像深度解析_Docker_泡泡_InfoQ写作社区