【Docker】7. 镜像-加载原理、分层原理、commit镜像

简介: 【Docker】7. 镜像-加载原理、分层原理、commit镜像

一、什么是镜像


镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。


它包含运行某个软件所需的所有内容,包括代码、运行时环境、库、环境变量和配置文件。


所有的应用,直接打包成docker镜像,就可以直接跑起来。


如何得到镜像:


  • 从远程仓库下载
  • 从其他地方copy
  • 自己制作一个镜像 DockerFile


二、docker镜像加载原理


1. 联合文件系统UnionFS


UnionFS是一种分层、轻量级并且高性能的文件系统。支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录

挂载到同一个虚拟文件系统下。这个在我们下载镜像的时候,就可以看到这样的效果。


1268169-20210518123315999-1065563510.png


比如有涉及到相同的文件,那么就可以共用了,极大节省资源。


UnionFS是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以

制作各种具体的应用镜像。


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

包含所有底层的文件和目录。


2. 镜像加载原理


docker的镜像实际上由一层一层的文件系统组成,这种层级文件系统就是上述的UnionFS。接着,在内部又分为2部分:


  • bootfs(boot file system):docker镜像的最底层是bootfs,主要包含bootloader(加载器)和kernel(内核)。
    bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统。这一层与典型的linux/Unix系统一样,包含bootloader和kernel。
    当boot加载完成后,整个内核就在内存中了,此时内存的使用权已由bootfs转交给了内核,此时系统也会卸载bootfs。
    这里的加载,可以理解为,我们windows电脑开机时候,从黑屏到进入操作系统的过程。
  • rootfs(root file system):在bootfs之上,包含的就是典型linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。
    rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等等。


如图所示:

1268169-20210518124700949-1493633356.png


图中以debian系统为例,从左到右,分为3个过程:


  • 图1,开始的状态,下载了一个debian系统。
  • 图2,安装了一个emacs,这时候可以看到在图1基础上,加了一层Image。
  • 图3,又装了一个Apache,此时在图2的基础上再加了一层Image。


说明了docker的镜像实际上是由层一层的文件系统组成的。对于不同的的linux发行版本,bootfs基本是一致的,rootfs会有差别,所以不同的

发行版可以共用bootfs。


另外,在docker上的操作系统通常都是精简版的,在VM上安装个centos镜像大小1个G多,而在docker上的centos镜像只有200M大小。


因为底层直接用主机的内核,自己只需要提供rootfs就行了,所以rootfs可以很小,只需要包含最基本的命令、工具和程序库即可。


这样一来,启动速度也快了,因为最浪费时间的引导加载过程没了。


三、分层原理


知道了镜像的加载原理,不妨再回头看下镜像分层的原理。之前提过,镜像下载的时候是分层下载的,有些层如果已经存在了,就无需再次下载。


比如我下载一个redis的镜像。


1268169-20210519123933812-536946669.png


这种方式最大的好处就在于资源共享。比如有多个镜像都从相同的BASE镜像构建来的,那么宿主机只需要在磁盘上保留1分BASE镜像,同时内存中

也只需要加载一份BASE镜像,这样所有的容器都可以使用。另外,镜像的每一层都是可以共享的。


可以通过docker image inspect来查看镜像的分层,比如查看刚才下载的redis镜像:


docker image inspect redis:latest


1268169-20210519124317232-1279845956.png


所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。


比如:


1268169-20210519124848304-956138275.png


我现在要制作一个镜像。


  1. 这个镜像基于Ubuntu linux 16.04,这也是镜像的第一层。
  2. 继续还要安装python包,就会在第一层之上创建第二个镜像层。
  3. 继续打补丁的话,还会再创建第三个镜像层。


注意的是:


在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,如下图:


1268169-20210519125203522-1671597036.png


这里每个镜像层包含了3个文件,而镜像则是包含了来自2个镜像层的6个文件。


现在,如果第二层中的 文件5 需要升级版本。这时候上层镜像中的文件会覆盖底层镜像中对应的文件,使得文件里更新版本作为一个新镜像层添加到镜像当中。


1268169-20210519125638195-757582287.png


docker 通过存储引擎的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。


1268169-20210519221636753-18331449.png


四、commit镜像


通过上面的了解,现在已经知道镜像的结构原理,那么我们自己就可以制作一个镜像来。


比如,现在pull一个tomcat镜像作为基础层,我启动这个镜像后,在容器里做了一些我自己的改动,我觉得我的这些改动很好,镜像变得更好用了。那么我需要

来保存这个容器的状态,通过commit命令,提交镜像。


docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名称:版本标签


运行tomcat后,进入到webapps下,发现是没有项目的,因为是阉割版。


1268169-20210519224413894-1027285765.png


现在我把webapps.dist下的所有内容copy到webapps下。


1268169-20210519224814711-563700547.png


现在我用ip:8080就可以访问到项目了。


1268169-20210519224844792-130080655.png


现在我提交这个改动过后的容器。


docker commit -m="pingguo first commit image" -a="pingguo" 03844ff66434 tomcatpingguo:1.0


提交成功后,docker images查看镜像,发现已经保存在本地。


1268169-20210519225319499-275014739.png


通过自己的提交镜像操作,再回过来体会下镜像的分层,是不是理解更深刻了些?

相关文章
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
3天前
|
运维 前端开发 Devops
云效产品使用报错问题之流水线打包docker镜像时报网络代理有问题如何解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
15天前
|
应用服务中间件 Docker 容器
docker 镜像常用命令
docker 镜像常用命令
35 0
|
15天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
26 0
|
22天前
|
存储 Kubernetes API
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
Docker拉取镜像或者kubectl出现的这个解决方案x509: certificate signed by unknown authority
55 2
|
24天前
|
Linux Docker 容器
Linux彻底卸载Docker包括运行拉取的镜像
Linux彻底卸载Docker包括运行拉取的镜像
24 1
|
26天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
47 1
|
27天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
265 1
|
28天前
|
Docker 容器
docker删除镜像
docker删除镜像
51 0
|
1月前
|
网络安全 Docker 容器
docker 拷贝本地镜像
【2月更文挑战第27天】