博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
云计算之k8s系列_第二回
阅读量:3515 次
发布时间:2019-05-20

本文共 2410 字,大约阅读时间需要 8 分钟。

云计算之k8s系列——rootfs

在上一回,我们了解了namespace和cgroups,我们已经知道:容器的本质是一种特殊的进程。

问题:容器里的进程看到的文件系统又是什么样子的呢?

即使开启了mount namespace,容器进程看到的文件系统也跟宿主机完全一样。只有在“挂载”这个操作发生之后,进程的视图才会被改变。而在此之前,新创建的容器会直接继承宿主机的各个挂载点。

mount namespace根其他namespace的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作才能生效。

我们可以在容器进程启动之前重新挂载它的整个“/”。而由于mount namespace的存在,这个挂载对宿主机不可见,所以容器进程就可以在里面随便折腾了。

chroot实现shell中重新挂载根目录

]# mkdir -p test1/{bin,lib,lib64}]# cp -v /bin/bash /bin/ls test1/bin/]# list=`ldd /bin/ls | egrep -o '/lib.*\.[0-9]'`]# for i in $list; do cp -v $i test1$i; done]# list=`ldd /bin/bash | egrep -o '/lib.*\.[0-9]'`]# for i in $list; do cp -v $i test1$i; done]# chroot test1]# ls # 看到的是自己创建的几个目录

docker 1.13.1 在centos7.4工作目录讲解

[root@centos7 ~]# ls /var/lib/docker/image    docker pull 下来的镜像的配置信息会存储在该文件夹中containers    容器启动后,会在该文件夹下生成相应容器ID的文件夹,同时在image/overlay2/layerdb/mounts/下也会产生同名文件夹network    存放local-kv.db文件信息,这里是网络的一些配置信息    [root@centos7 files]# strings local-kv.db | less # 可以查看该宿主机的docker的网络配置信息overlay2    因为镜像都是分层设计的,一层一层的镜像信息都会存在该文件夹里,所以,这个文件夹内容比较多,文件夹比较大plugins    一些docker相关的插件存放地swarm    docker公司的容器编排工具,后来被集成到docker项目中,便于做容器化编排管理的tmptrustvolumes    docker容器挂载的一些信息

ubuntu中联合文件系统utfs

root@ubuntu:~# tree     .    ├── A    │   ├── a    │   └── x    ├── B    │   ├── b    │   └── x    └── C我们可以看到,目录A和目录B中有相同的文件x,有不同的文件a和b,我们可以将A和B里的文件挂载到C文件夹中root@ubuntu:~# mount -t aufs -o dirs=./A:./B none ./Croot@ubuntu:~# ls C    a  b  x这时,修改C文件夹里的内容,A对应的文件会跟着一起改变,B文件夹里的内容不会跟着改变,dirs后面的路径从上往下开始分层,下面是只读层,不会改变

rootfs

需要明确的是,rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。在linux操作系统中,这两部分是分开的,操作系统只有在开机启动时才会加载指定版本的内核镜像。

什么是容器的“一致性”?

由于rootfs里打包的不只是应用,而是整个操作系统的文件和目录,也就意味着,应用以及它运行所需要的所有依赖,都被封装在了一起。对一个应用来说,操作系统本身才是它运行所需要的完整的“依赖库”。

这种深入到操作系统级别的运行环境一致性,保证了应用在本地开发和远端执行环境的一致性。

docker在镜像的设计中,引入了层的概念。也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs

由于aufs文件系统没有集成在红帽系列操作系统中,只有在ubuntu等操作系统中才有此文件系统,在centos中,安装完docker(centos中,1.12.1有devicemapper,1.13.1之后没有见到devicemapper了,改成了overlay2),它的文件系统就被称为devicemapper文件系统,所以启动容器后,也就会分层挂载到/var/lib/docker/devicemapper/mnt目录下

当容器启动后,在对应的分层中有rootfs文件夹,该文件夹中就是完整的操作系统,容器停止后,该目录自动消失,取消挂载

rootfs分层

docker容器的rootfs分层有三部分组成:只读层(ro+wh) + init层(ro+wh) + 可读写层(rw)

wh: whiteout,当删除当前某个文件时,会创建一个隐藏文件,盖住你要删除的文件,也就是说,你删除的这个文件,在下层还是存在的,只是在当前被遮盖了而已。

init 层:以 -init结尾的层,夹在只读层和读写层之间。init是docker项目单独生成的一个内部层,专门用来存放/etc/hosts,/etc/resolv.conf等信息。

补充

docker项目支持的unionfs联合文件系统:    AuFS:ubuntu    devicemapper: centos    overlayfs: ubuntu 和 centos     btrfs: SUSE

转载地址:http://ivcqj.baihongyu.com/

你可能感兴趣的文章
N9-SQL注入(union注入)
查看>>
N10-sql注入(information_schema注入)
查看>>
N1-Kali虚拟机中SQLmap
查看>>
N11-sql注入(http头注入)
查看>>
N2-sqlmap初使用
查看>>
N12-sql盲注原理以及boolean盲注案例实现
查看>>
N13-sqli盲注 基于时间型
查看>>
N1 技术心得 2019-6-26
查看>>
N1-环境配置
查看>>
N2-审计方法与步骤
查看>>
N3-常见的INI配置
查看>>
代码审计 N4 常见危险函数和特殊函数(一)
查看>>
MySQL笔记
查看>>
计算机运算方法之(原码 补码 反码 移码)
查看>>
计算机组成原理之(二进制与十进制互相转换,数的定点表示与浮点数表示)例题:设浮点数字长16位,其中阶码5位(含有1位阶符),尾数11位(含有1位数符)
查看>>
冒泡排序及其优化
查看>>
选择排序(java代码实现)
查看>>
插入排序
查看>>
哈夫曼树java代码实现
查看>>
快速排序
查看>>