前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Docker-原理之UnionFs

Docker-原理之UnionFs

作者头像
运维小路
发布2024-12-19 21:27:50
发布2024-12-19 21:27:50
8100
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:

Docker基本情况

Docker基本命令

Dockerfile

Docker镜像

Docker仓库

Docker原理(本小节属于)

Docker网络&存储&日志

Docker-Compose

Docker番外篇

我们前面讲解中,经常用一个镜像创建多个容器,他们之间的文件系统有什么关系呢?这个就是我们要讲的联合文件系统(UnionFS)。

联合文件系统,可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。

把 ubuntu18.04 这个基础镜像的文件放在一个目录 ubuntu18.04/ 下,容器自己额外的程序文件 app_1_bin 放在 app_1/ 目录下。然后,我们把这两个目录挂载到 container_1/ 这个目录下,作为容器 1 看到的文件系统。

同样,对于容器 2,就可以把 ubuntu18.04/ 和 app_2/ 两个目录一起挂载到 container_2 的目录下。这个就是联系文件系统,其实和kvm的快照有点类似。

下面我们介绍几个Docker里面的概念。

Lowerdir(只读层)

被 mount 两层目录中底下的这层(lowerdir),就是上图ubuntu18.04,可以被多个容器使用,也就是镜像,他是只读的。

Uppder(可读写层)

它是被 mount 两层目录中上面的这层 (upperdir)。在 OverlayFS 中,如果有文件的创建,修改,删除操作,那么都会在这一层反映出来,它是可读可写的。就是上图的app_1。

Merged(表示层/用户看到的层)

它是挂载点(mount point)目录,也是用户看到的目录,用户的实际文件操作在这里进行。这里就是上图的container_1, 也就是容器内部看到的所有数据。

work

存放临时文件的目录,OverlayFS 中如果有文件修改,就会在中间过程中临时存放文件到这里。重点上前面3层,需要理解到。

思考一个问题,如果uppder里面的内容和lowerdir冲突的时候会出现什么情况呢?

实际显示的uppder目录下的内容。

这里的就是容器的所有挂载信息,但是每个容器还有3个特殊文件,并不包含在这里,或者说另外3个文件+以上文件系统就是一个完整的容器的rootfs。

代码语言:javascript
代码运行次数:0
复制
/etc/resolv.conf
/etc/hostname
/etc/hosts
#我俗称的 dns,主机名,hosts

以上目录就是我们前面讲过的Docker-详细信息和目录介绍下面专门存储容器的对应的目录,当然这个目录下还有其他容器相关的信息。

当多个容器基于同一个镜像创建,那么他们的Lowerdir则是一样的,上图由于层数太多,不方便比对,下面这个层数较少可以比较明显的看出来。

其实这里在概念在实际运维中遇到的问题就是du统计使用量大于整个磁盘空间,比如du统计1.5T,但是整个磁盘才1T。这里出现的原因就是du在统计的时候Uppder和Merged这2个目录会被统计两次,如果Uppder内容比较大就会出现上面的问题如果要规避这个问题就可以使用-x参数。

代码语言:javascript
代码运行次数:0
复制
  -x, --one-file-system    skip directories on different file systems
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档