00:00
OK,大家好,我是男胖子,欢迎收看我的视频,接着上一讲,我们上一讲是搞定了一个进程,在新的命名空间里面去运行,并且呢,我们替换掉了这个进程,嗯,所能看见的一个文件系统的范围,我们替换为自己的一个跟文件系统,但是呢,你会发现这么一个问题,就是当你运行多个进程,多个容器进程的时候呢,他们用的是同一份目录,同一份跟文件系统的目录,这样的话就会让多个。容器进程,它会更改到同一份跟文件系统的目录,那如何去避免这个问题,也就是今天这一讲是要解决的问题。我们会利用。联合文件系统的功能来让多个容器。能够拥有自己的单独的文件系统,他们之间互不影响。我们先来简单的看一下什么是联合文件系统,联合文件系统能够把其他文件系统的文件和目录挂载到同一个挂载点下,形成统一的文件系统视图。那在需要界面一个最直观的显示就是它能够将多个目录下面的文件呢显示显示在同一个目录下。
01:09
然后这里我会用Linux原生自带的一种联合文件系统类型叫做overlay去演示一下,呃,如何去挂载一个联合文件系统,首先我创建了一个overlay DEMO的这个目录,然后在这个目录下面呢,也创建的另外一些目录。可以看到container layer这么一层目录呢,它其实指的是对容器文件系统如果有修改的话,将会体现在这个目录下,而image layer呢,这一层呢,它是作为一个只读层,你可以和darkcker的镜像文件类比起来,Darkcker镜像文件是可以同一个镜像文件多次运行的,而它能够达到呃,这个目的呢,一个最根本的原因就是它的镜像文件是只读的,这里和lay这一层可以类比起来。然后呢,这里没有显示完全,我缩小一点。
02:04
然后你可以看到还有一个mnt的这么一个目录,这个就是挂载目录,就到时候,呃,你可以把这个目录理解为他容器启动起来之后,它所看见的一个文件系统视图,就是读取的ma MT这个目录,这个目录下面所看见的内容呢,包含了。一个可写层也包含了可读层,他们都把自身的这种文件显示在共同显示在mnt,这个目录是头像,然后work这个目录呢,会作为联合文件系统的一个工作目录,这个是不对外发录的,就是当你挂在一个联合文件系统的时候呢,你得指定联合文件系统的一个工作目录是在这个目录。然后紧接着我们要往文件夹里面去添加一些文件,这里也是按部就班的去执行一下这些命令,你可看到添加的这些文件呢?是对于文件名的专页对应我们好区分,就是在这个文件夹上面有哪些文件,然后里面有哪些内容。
03:15
这样添加完之后呢,我们首先来看一下mnt这个目录下,现在是没有任何看不见,看不见任何东西的,然后我们来执行一下呃浪的挂载命令。执行完之后再来看一下mnt下面目录,可以看见下面我添加的这些文件呢,在各个文件夹下面的这些文件,它都出现在了mnt这个目录下面,这就是挂载一个联合文件系统所达到一个效果。那简单的解释一下,呃,这个month的命令,它涉及到的几个参数,也就刚才所提到的有一个lower Di这个参数,它指这lower d这一层呢,它是呃,只是了这个联合文件系统,一个只读层,就在这一层的文件它是只读的,然后上层文件呢,它指的一个container layer这一层,这一层是可以写,可以写的,然后他又指示了一个work dl,就是它的一个工作目录是什么?
04:11
那最后接着就是一个挂载目录,就挂载到mnt这个目录下。然后你可以看到这一层呢,在mnt,比如我进入mnt这个目录,如果我在mnt这个目录下对文件去进行修改会怎么样?比如我,呃,编辑一下image layer to.tst这个文件,这个文件呢,它本来是在image layer to这个文件夹下面,当我修改一下这个文件,比如修改一下呃,Amazing,当修改完成之后,我们再来看一下image two image two这个文件夹下面它本身的。它本身的这个文件内容有没有发生变化,你可以看见它没有发生变化,这也符合刚才我们所讲的,它是可读的,它是只读的,它不会发生变化,那这个变化的文件在哪里体现呢?来看一下container layer这一层,这里是新增的一个image layer to的文件。
05:25
可以发现我修改的内容全部是在container layer这一层体现的,所以通过这个命令你能发现就是我如果想一个镜像去运行多个容器的话,我要怎么样?我要每一个容器。它的镜像文件目录可以是不变的,但是呢,我的容器的一个container layer这一层的这个目录,我要重新给他创建一下,然后重新给他创建一下它的一个挂载目录,这样我是不是就能够让一份镜像达到多次运行的这么一个效果了?好,现在来看一下我们现在的代码发生了哪些变化。
06:02
这一节的代码呢,是在上一节的基础上去进行修改的,然后改动其实也比较简单,我这里也就不嗯直接演示手写代码,然后简单介绍一下对于上一节代码有哪些变化。我是新增了一个workspace的这么一个目录啊,新增了一个这么一个文件,然后那方法是没变的,其实也就相当于新增了这么一个目录而已,在这个目录里面呢,就是对呃联合文件系统的一些所需要的这些目录去进行创建,然后在执行完子禁程之后呢,对这些创建的目录去进行一个清理,因为我们现在呃不同的这个容器,它要创建自己的一个容器的目录,它要创建自己的一个容器的挂载点。所以呢,我们得为。创建的容器增加一个标标识。
07:00
然后我这里是用一个容器名去进行标识。嗯,现在的命令呢,对比起上一节呢,就相当于你在执行完让之后呢,你要加上你的容器名,然后再加上你的可执行文件的一个名称,然后就才能把我们的这个进程给运行起来,整个方法呢,针对于上节的变化,其实主要只是先看一下让这里让的话。我执行完状之后呢,在之前的一个cmd wrong方法后面,我加上了一个删除,嗯,挂载点目录的这么一套方法,它是删除了mnt这一层的这个容器,通过容器名呢,去检索到mnt这一层的它的一个文件夹名称,然后是work这一文件夹名称,然是这一,这一就是刚刚我们所示的这个contain lay这一这的目录,我们删除掉了它自身所创建的这些目录,在E方法。
08:00
在方法执行的时候呢,我们是不是要先把这些目录给创建起来,所以我都装到了这个set MT这个,那我们是创建的相关的这些,我们要挂载联合文件系统的时候,它所涉及的这些目录。我们把这些目录给它挂载好,先创建好,创建好之后呢,我们使用mount命令去挂载一个联合文件系统,其实挂载完之后,挂载完之后就没有什么对比上,也就没有什么多余的变化了,挂载完之后去替换掉,用这个新的挂载点了去替换掉mount space的一个跟文件系统就执行pivo root命令。并且呢,在后面我们再去挂载一下这个文件系统的命令,这样就搞定了,来看一下现在程序所达到的一个效果。我们进入到tiny darker这个目录下,然后呢,下面一个中段呢,也是进入到这个目录下,现在要运行是不是要加上容器名呢?然后这个BSH下面呢,我也运行一个新的容器,所以容器名这里我们手动规定不能一样,因为一样的话他们的目录就重合了。
09:30
然后呢,我先看一下,我在第一个容器下面看是没有test目录的啊,第二个容器下面也是没有的,那我如果在第一个容器里面,我去建一个test目录,那他对于第二个容器是可见的吗?可以发现第二个容器是看不见的,所以这样的话我们就完成了。呃,通过联合文件系统这种功能,能让我们同一份镜像运行多个容器这么一个目的,然后再下一讲,我会去讲如何去配置网络命名空间,能够让我们的容器拥有访问网络的能力,那下期再会。
10:10
呃呃呃。
我来说两句