00:00
来,同学们,我们继续,接下来我们继续给大家讲解第四章,Docker的镜像。诶,说到这儿,那同学们可能有点奇怪,这堂课从开讲讲到这儿,你自己强调过的DOER3要素,镜像容器、仓库,以及刚刚讲完的doer的常用操作命令,这不刚完成吗?怎么又到镜像了?这个不会炒回锅肉。又来老生常谈吧,那么同学们前面只是粗浅的理解,这一块才是doer镜像的底层原理。那么两个问题。第一个同学们所谓镜像,它底前底层结合容器和操作系统跟我们有哪些关系,那么你了不了解什么是联合文件系统,这是第一个。第二个从开奖到现在我们都晓得,反正没有镜像的话,我们去服务器上远程拉一个本地run运行就OK,那么这些镜像都是我们从服务器上拉进来的。那下面我们的问题是那么。我们自己本地能不能自己做一个镜像,也提供给别人服务呢?那么看一下我们的笔记。
01:04
大家请看,对于我们镜像的命令,前面都讲过了,这是不是有个do commit呀?哎,这个我们还没说好吧,那么所以说带着这两个问题,我们来看一下我们现在的基础知识,以及本次要讲解的。底层原理和以及我们的刀卡镜像的卡密操作案例。好,那么同学们来复习一下何为镜像。可是轻量级的可执行的独立的软件包,对吧,我们呢。把我们要运行某个软件所需要的内容。这些呢,各种程序和依赖环境打包好,形成一个可交付的运行环境啊,这个里面就包含了代码运营时需要的库,环境变量、配置文件等,那么这个打包好的运行软件,运行环境就是我们的镜像软件,那么从开讲到现在都是我们用别人的,那么待会儿我们要给大家介绍我们自己怎么做一个对外暴露提供服务的镜像,那么。
02:00
可以了解,只有通过这个镜像文件,我们才能生成do的容器实例,类似于Java中你有一个对象,OK,这些呢,大家都了然于胸。那么下面我们来。了解第一个概念,镜像,就像一个蛋糕奶油蛋糕一样啊,里面是蛋糕,外面是奶油,奶油上面再有水果,层层堆叠出来的,所以说第一个概念先要明白。镜像是什么?第二个更深层次的理解,那么就是镜像是分层的,它为什么会分层?那么这就是我们的联合文件系统union file system。好,那么下面请大家来看这么个东东。以我们的铺。从远程库拉一个仓库里面的存在的镜像为例,下载过程当中我们可以看到docker的镜像好像是一层一层的在下载。同学们doctor pro他们看。很熟悉吧,有没有发现pro FS这一层,OKOK,拉完了拉完了,等等等等等等。我们都晓得啊,只要有这么一个流水,说明它有一层哇,我们会发现一个,他们看老复杂了,它是有好多层构成构成的,那么第二同学们。
03:07
我们的do。Pro他们看的最新版,大家请看使用最默认的。版本标签tag latest没加版本号,慢慢的从网站上去拉。那么这个时候同学们请。我们呢,就如同这儿稍微有点慢啊,那么我们呢,稍微等他一会儿开始下载啊,因为他们看的还是比较大,那么这个呢,呃,大家可以看一下。跟我们的。课件的抓图是一样,慢慢的一层一层一层的下载,先下完了上面的,再有下面的,诶,那么所以所以说我们给他慢慢下载啊,后面他们看到这个镜像我们也在用,所以说我们得到一个结论。镜像是分层的,那么这我们就要来说一下镜像的底层原理,联合文件系统它是什么?为什么要这么设计?以及根本性更深入的回答doer它的镜像加载原理为什么这么快?来,同学们。
04:02
走吧。联合文件系统呢,是一种分层的轻量级并且是高性能的文件系统啊,是操作系统它独有的,它支持对文件系统的修改,作为一次提交来一层一层的叠加,同时可以将不同的目录挂载到同一个虚拟文件下面,那么这个时候联合文件系统是docker镜像的基础,镜像可以通过什么分层来进行继承?基于基础镜像,那么基础镜像就有点类似于我们的什么我们Java里面的object组宗类,它有了一个模板,一个底子以后,可以由他制作出各种各样的具体镜像,那么回到我们这儿,我们大家可以看到一个time cat,所谓的有机画卷,罗马不是一天建成的,那么他们K作为一个。容器。外部的容器可以跑各种东西,那么它天生里面也带了很多小巧精妙的复杂功能,那么这一切都是一块一块的堆叠,所以说我们德卡来模拟他们开头要原模原样,那么它呢,不可能一蹴而就,都是通过分层的各个子功能模块,就像乐高搭积木一样,一块一块的来搭。好比我们。
05:14
做一个花卷,一个褶子一样,一层一层,一层一层,最后多层嵌套了以后发出这个花卷,OK,那么所以说。对于docker而言,它一次同时加载多个文件系统,但是从外面来看,就跟这个花卷这个褶子一样,有多个层吧,一层一层的,一层就是一个功能,多个功能,多个乐高的积木块发起来这么一个花卷,我们对外暴露只能看到一个整体,那么这个时候联合加载就会把各层文件系统堆叠加起来,这样最终的文件系统会包含所有底层的文件和目录,每一层合在一块,是不是就是我们这个花卷的整体啊?哎,所以说呢,联合文件系统它呢,就是一个什么分层清亮且能够聚合的一种。镜像的基础完全支持对文件系统的什么,通过一次提交来一层层堆叠,最终形成一个对外暴露的服务实体,那么这个镜像的加载原理啊,也类似啊,他是这样干的。
06:13
我们都明白,Docker加载非常非常的快啊,一个容器一启动。秒赚秒秒起,那我现在。需要一个他们看不用派,只要下载完了run,他们看那只猫就出来了。以前我们要各种配置,还要设置cat home,那么这是为什么do卡会这么灵巧,这么快呢?你们来吧,Doer的进期啊,实际上是由一层一层的文件系统组成,大家看这还在正在下载当中呢,对吧,200多兆,稍微有点慢,那么这层好了再发另一层一层一层一层一层的,那么小个小个小个功能模块拼接在一块,整个花卷给你出来,那么下面这种一层层的文件系统。就叫联合文件系统,那么对于我们联合文件系统小的以后,我们都清楚do它呢底层有一个boot FS啊,那么就是跟启动boot FS主要包含根加载和Linux的内核,我们都晓得前面呢说过这句话啊,非常重要。
07:14
那来复习一下,每一个容器都是一个简易版的Linux,它简在哪?那么说明它有怎么叫简易版的Linux?根子就在这儿,它包含了引导区文件系统,就跟Linux内核一样和有内核和引导,那么它呢?Boot load就可以引导加载Linux内核,Linux刚启动时就会去加载这个boot FS的文件系统,那么它是属于引导内核,那么引导了以后,一层一层的文件系统来驱动它,形成一个容器实例镜像发布多样暴露服务,那么在do镜像的最底层就是引导文件系统。来简易版的Linux环境包含这些和运行在其中的运行环境。以前我们画过一个图,底层就是这个Linux,上面才是redx这个实例。那么上一层与我们典型的lix是一样的,包含了boot加载器和内核。当boot加载完了,整个内核就在内存中,那么这个简易的Linux基础诞生了,此时内存使用权就由波特FS转交给内核,那么系统也就卸载这个。
08:18
跟文件的引导系统,那么更完了以后我们就是什么root FS,你引导Linux内核启动了,我就是一个迷你版的Linux。在这之上我们就是。有典型的Linux系统,那么这些目录啊,DPLC变DC等等的标准目录配置啊,那么root rf就是不同操作系统发现版本,那么U版图啊,等它S啊,就这么一块块来的,那么来大家可以看得出。我们现在平时安装虚拟机的生态瑞都是多少?4.8个G,为什么do里面的才200兆,因为我们只要最小的,那么这个时候同学们还记得吗?基于容器化的。
09:02
技术仅包含业务所需的runtime环境,Doer里面的生啊U图,也就是什么170多兆,那么所以说它呢比较快,人家只要什么最小的这一份,也就是只要这个不FS啊,内核和root FS啊,这个就把它当做一个什么我们的基石和基础,好那么完了以后,那么前面我们大家说过啊,我再给大家呢演示一下,好,那么大家请看,那么现在刚刚好我们的time。也已经下载完成,我们打卡rar-ITU班图。那么。我们现在运行这个U班图的镜像,生成了一个尾号为766C的这么一个U班图Linux系统的容器实例。LS这个命令有吧,但是你看via.txt,它有没有command not found,为什么呀?那么同学们,我们都晓得doer images u班图。多大才73兆?B,一个微小版的Linux系统,它为什么小?因为也就是什么用不到的,它觉得不是非核心非必要的,这些参数命令通通不卷进来,不加载,当然我体量就小了,人家只要什么最核心的Linux内核,OK,所以说呢,对于一个精简的OS啊,Root FS啊,可以很小,那么只需要包括最基本的命令工具和程序库就可以了。那么当然了,像什么LS啊,它有吧,但是那些复杂命令。
10:30
他就不给你支持,那么所以说呢,尽量的瘦身,如果到后面你需要了,自己再去加,再去改装,那么因为我们的这个center。我们这个U盘图它的底层就直接复用宿主机的内核,自己只需要提供引导区的这个跟文件就行了,因此对于不同的Linux发行版不FS都是这个底子和内核是一样的,Root FS稍微会有点差别,只不过你叫S啊,我叫U版图,因此不同的发行版本就可以什么公用同一份root FS,哎,这就是什么它的根源和底层。
11:07
那么为什么镜像要采用这种分层的结构呢?像一个。花卷一样的一层一层的发出来呢,那么请问假设这一层固定了,就是比如说我们不管是red,不管是他们看都需要某一层的功能,我就把它。叠加出来给大家共用,那么这样的话,你就可以像乐高积木一样的组装,你需要哪一块拼哪一块,不用每次都新建,所以说它采用分层结构主要是为了干嘛。资源共享,方便复制迁移,就是为了什么服用,那么比如说多个镜像都从相同的贝斯镜像中构建而来,对吧,那假如说啊,我们现在。从官网上下载的这个U班图目前只是73兆功能,假设这个VI根本没有这个功能对吧?那么我现在就想添加这个功能,那么添加完了以后,我这个时候就可以自定义一个含有VI编辑命令的一个新的U图,那么我是不是只需要在这个附类镜像上面。
12:06
做我们添加了V功能的这么一个新的镜像的扩展,我不用从头来吧,那么我可以继承于这个,那么这样回答我前面这些基础镜像是不是就给大家做好了最基本的模板啊,那么我们大家都说这样的话呢,从相同的贝斯镜像构建而来,那么这样的话呢?Do的宿主机只需要在磁盘上保留一份最基础的镜像。那么。同时我们也只需要加载同样一份基础镜像,那么就可以为其他所有容器服务了,那么每一个镜像的每一层都可以被共享,哎,它主要就是为了完成加载简单资源复用,这个就是我们进项分层的意义,好。那么接下来docker的镜像层都是什么?只读的啊,镜像是只读的,只有容器层是可写的,哎,那么现在当容器启动的时候,一个新的可写层被加载到镜像的顶部。
13:04
这一层就会称为什么容器层,容器层之下都叫做什么镜像层,那么好,同学们。看一眼。当一个容器启动的时候,一个新的可写层被加载到镜像的什么顶部,我们操作所谓的容器实列,其实就是最上面这个,那么这层是容器,容器以下的都叫进下,那么你最终对外暴露的,比方说这个花卷有四层,那么你肯定要吃的话,肯定是什么,从最外层开始吃吧,没有说谁不就就像我说的,吃个鸡蛋肯定是先剥鸡蛋壳,你不可能隔空取物先吃鸡蛋黄吧,对吧?那么所以说对容器的这个改造,你要先把鸡蛋壳给敲坏了,才能去吃鸡蛋白,才能去吃核心的鸡蛋黄,那么你对容器的改造,不论是。各种增加新的一层或者修改都只会发生在最顶层的容器层,那么容器层是可写的,容层下面所有的镜像都是只读,那么可以这么讲,我们在操作。
14:02
容器下面就是我们这些内核,好,那么OK,在这块部分我们再回到我们的平台架构图,这个复杂的这个动作,同学们再理解一下。从上到下连上来以后,各种的。从拿到一个镜像来进行驱动,加载了以后,巴拉巴拉往下走,大家请看do,看什么contain,什么东东容器,我们操作的是它,但是它底层就是root FS,你看layer的层,哎,这一层一层的就是对应着我们刚才给大家所看到的这些东西,可以这么极端的说一句,你只是操作最上面,就像你吃奶油蛋糕,你肯定是先吃奶油嘛,但是底下这个。鸡蛋糕,那么都是什么?作为我们的root fs1层一层的给你堆叠好了,好,那么这个就是我们的docker镜像最重要的一个观念,记着do它是分层的,每一层的功能它是辅右。
我来说两句