【博客228】docker技术原理之:Union FS
内容: 最近即将入职,在导师安排下开始学习docker和k8s,记录学习的docker技术原理Union FS:联合文件系统(Union File System):可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。这些分支或者是read-only或者是read-write的,所以当对这个虚拟后...
·
内容: 最近即将入职,在导师安排下开始学习docker和k8s,记录学习的docker技术原理
Union FS:
联合文件系统(Union File System):可以把多个目录(也叫分支)内容联合挂载到同一个目录下,
而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。
这些分支或者是read-only或者是read-write的,所以当对这个虚拟后的联合文件系统进行写操作时
候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对任何文件进行操作
的,但是其实它并没有改变原来的文件,这是因为unionfs用到了重要的资管管理技术叫写时复制。
读时共享,写时复制:
读时共享:在读取相同资源时,大家共享一份资源;
写时复制:当需要写某一块资源时,写方独自copy一份出去改写,其它的继续共享原资源。
应用:
1、Union FS
2、Linux的fork调用
...
...
...
UnionFS应用:
1、比如在多个磁盘分区上合并不同文件系统的主目录,
2、把几张CD光盘合并成一个统一的光盘目录(归档)。
3、具有写时复制(copy-on-write)功能UnionFS可以把只读和可读写文件系统合并在一起,虚拟上
允许只读文件系统的修改可以保存到可写文件系统当中。
Union FS 特性:
一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统
叠加起来,这样最终的文件系统会包含所有底层的文件和目录
不同linux版本中的Union FS:
各Linux版本的UnionFS不同
由于各种原因(有兴趣的可自行谷歌),Linux各发行版实现的UnionFS各不相同,所以Docker在不同
linux发行版中使用的也不同。你可以通过docker info来查看docker使用的是哪种,比如:
1、overlay2
2、aufs
...
...
我的linux:ubuntu 18.04,使用的docker采用了overlay2
docker中的Union FS:
前言:
任何程序运行时都会有依赖,如:开发语言层的依赖库或者各种系统lib。不同的系统上这些
依赖可能是不一样的,或者有缺失的。为了让容器运行时一致,docker将依赖的操作系统、各种lib
整合打包在一起(即镜像),然后容器启动时,作为它的根目录(根文件系统rootfs),使容器进程
的各种依赖调用都在这个根目录里,这样就做到了环境的一致性。
出现背景:
如果每开发一个应用,都要重复制作一次rootfs,那不是非常麻烦?
比如,用自身操作系统的ISO做了一个rootfs,然后又在里面安装了Golang环境,用来部署应用A。
那么,在发布另一个Golang应用B时,希望能够直接使用安装过Golang环境的rootfs,而不是重复
这个流程,那么UnionFS就派上用场了。
Docker镜像的设计:
引入了层(layer)的概念,制作镜像的每一步操作,都会生成一个层,就是一个增量rootfs(一个
目录),这样应用A和应用B所在的容器共同引用相同的操作系统层、Golang环境层(作为只读层),
而各自有各自应用程序层,和可写层。启动容器的时候通过UnionFS把相关层挂载到一个目录,作为
容器的根文件系统。
如果需要修改内核参数,那么得注意:
rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。这就意味着,如果你
的应用程序需要配置内核参数、加载额外的内核模块以及跟内核进行直接的交互,这些操作和依赖的
对象,都是宿主机操作系统内核,它对于该机器上所有容器来说是一个“全局变量”,牵一发动全身。
docker镜像都是只读的:
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的
都叫“镜像层”。
重启容器不会丢失数据:
Container的read-write layer存储在/var/lib/docker/aufs/diff/目录下。即使容器停止,
这个可读写层仍然存在,因而重启容器不会丢失数据,只有当一个容器被删除的时候,这个可读写层
才会一起删除。
更多推荐



所有评论(0)