美文网首页
白话Docker(rootfs)

白话Docker(rootfs)

作者: OOM_Killer | 来源:发表于2019-07-17 00:09 被阅读0次

前文说到要深入到操作系统级别的运行环境一致性,还是需要 深化 Mount Namespace 这项技术。

前文 白话Docker (Namespace)

Docker在镜像的设计中引入了层(layer)的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量 rootfs。
为了实现这种想法,就用到了 联合文件系统 (Union File System) 的能力。

Union File System

最主要的功能是将多个不同的目录联合挂载到同一个目录下。

$ tree
.
├── A
│   ├── a
│   └── x
└── B
    ├── b
    └── x

执行 挂载命令

mount -t aufs -o dirs=./A:./B none ./C

A 和 B 目录将被合并。

在docker中,其目录就被放置在 /var/lib/docker 路径下。最新的已经被overlay技术所取代,其实和aufs差不多。

# ll
total 0
drwx------. 3 root root     30 Jul 15 22:13 2e4d691c410329787b40cc0031dd1a67246cd7fe40906b12431295d42fcbccaa
brw-------. 1 root root 253, 0 Jul 16 23:30 backingFsBlockDev
drwx------. 4 root root     55 Jul 15 22:48 dfb8572a4ed3d8a81e2c8b4466bec6f4cdf89dc0b374f315b1992db24fc0e45d
drwx------. 4 root root     55 Jul 15 22:22 dfb8572a4ed3d8a81e2c8b4466bec6f4cdf89dc0b374f315b1992db24fc0e45d-init
drwx------. 2 root root    108 Jul 15 22:22 l

当我拉取一个容器镜像时,所谓的镜像就是一个Ubuntu操作系统的rootfs。他的内容是Ubuntu操作系统的所有文件和目录。不过与普通的rootfs相较而言,这里往往是由多个层组成的。

# docker image inspect ubuntu:latest
"RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ba9de9d8475e7f5e40086358a1353b3cc080994fc6d31e4272dd3acb69b0151e",
                "sha256:fbd2732ad777cb5db2515fa62b6122b797be233d01db02e0a19e5d894688cad6",
                "sha256:dda1518598187bf87704acc22aa0ec2a67d9e7835c24346dfca118ab42c5cd0b",
                "sha256:75e70aa52609fdbd63b58d46d6f7c20470062e1c9bb75616f7703a358a61e5ca"
            ]
        },

可以看到,这个镜像实际是有4个层组成,每一层实际上是ubuntu操作系统文件与目录的一部分。而在使用镜像时,需要将这些联合层,挂载到一个统一的挂载点上。

$ ls /var/lib/docker/overlay2/1a0eeaa99c53a69b48475f6ceadd62f906967bcaca31dd01bf1b3b8c646d447b/diff
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

查看overlay 的挂载信息。

# cat /proc/mounts |grep overlay
overlay /var/lib/docker/overlay2/bd308d4fea3953483cd7b96f3d9eccad149891d2125d7ef945124bc2f7abb137/merged overlay rw,seclabel,relatime,lowerdir=/var/lib/docker/overlay2/l/QG6AEZLLLXQ6OCRVFGTZOMYR4Z:/var/lib/docker/overlay2/l/5L5RY3F4J6ZTZYR23L37PVSGGV:/var/lib/docker/overlay2/l/EHAGOXJHQYKSPQVQWHUIBWHPIU:/var/lib/docker/overlay2/l/O2GCQLLMA5EKZF4EIUJS6A5SLS:/var/lib/docker/overlay2/l/5CMOOZLGPWNPEKBPPGFO3HYXUB,upperdir=/var/lib/docker/overlay2/bd308d4fea3953483cd7b96f3d9eccad149891d2125d7ef945124bc2f7abb137/diff,workdir=/var/lib/docker/overlay2/bd308d4fea3953483cd7b96f3d9eccad149891d2125d7ef945124bc2f7abb137/work 0 0

rootfs 由 底层的只读层init层(ro+wh) ,可读写层(rw)组成。overlay 改成了 upper层,lower层,merge层。
只读层时只读的,但还有wh,wh是删除时,底层将删除文件遮住。
init层夹在只读层与读写层之间,init 层是docker项目单独生成的一个内部层。专门用来放 /etc/hosts/ , /etc/resove.conf 等信息。
需要这样一个层的原因是,这些文件本来只属于只读的一部分,但是需要启动容器是由一些改变。
读写层就是可以读写的了,挂载方式为rw。修改的是以增量的方式递增。

相关文章

网友评论

      本文标题:白话Docker(rootfs)

      本文链接:https://www.haomeiwen.com/subject/jiaxlctx.html