当前位置: 首页 > 科技观察

从操作系统的角度来看,对Docker

时间:2023-03-22 12:56:39 科技观察

Linux操作系统进行内核剪枝,不仅是为了提高系统的安全性,也是为了进一步提升应用系统的性能。Linux内核裁剪技术尚未得到广泛应用。为了安全、应用性能和开发效率,业界普遍采用虚拟化技术——虚拟机和容器。不管是哪一种虚拟化技术,本质上都可以看作是对操作系统能力的抽象、分离和组合。虚拟化技术一览无论是哪种虚拟化技术,都是在操作系统之上进行不同的抽象,从而形成分层架构。层数越多,调用链越长,运行时开销越大。如上图所示,虚拟机中的Hypervisor层是一种常用的硬件虚拟化软件,它将操作系统抽象为多个底层硬件接口。使用这些硬件接口,虚拟机可以实现自己的操作系统。码头工人是不同的。它建立在原有的操作系??统之上,是一定程度的复用。从部署时间来看,由于采购、软硬件安装等因素,物理机部署时间最长,而虚拟机时间短很多,Docker秒级。2013年,Docker对外开源。于2014年6月9日正式上映,并迅速风靡全球。容器虚拟化技术的发展大致是这样的——Docker的OS依赖Docker构建在操作系统之上,是一种强依赖基于操作系统的虚拟化技术,它依赖于Cgroup来管理进程组,依赖于命名空间实现资源隔离,通过特定的文件系统使用操作系统自带的文件系统。CgroupCgroup全称为LinuxControlGroup,是Linux内核的一个功能,用来限制、控制和隔离一个进程组的资源(如CPU、内存、磁盘输入输出等)。Cgroup于2006年由谷歌工程师发起,最早的名字是进程容器。2007年,因为容器这个词在Linux内核中有很多不同的含义,所以更名为cgroup,并合并到2.6.24内核版本中,后来又增加了很多功能。Cgroup的主要作用:限制一个进程组可以使用的资源量。例如,您可以为进程组设置内存使用限制。一旦进程组使用的内存达到限制再申请内存,就会触发OOM。例如,进程组优先级控制可用于将特定的cpu份额分配给进程组。记录一个进程组使用的资源数量。例如,您可以记录进程组使用的cpu时间。进程组隔离。比如可以让不同的进程组使用不同的命名空间来达到隔离的目的。不同的进程组有自己的进程、网络和文件系统挂载空间。过程组控制,例如挂起和恢复进程组。命名空间命名空间(Namespace)是Linux提供的一种内核级资源隔离的方法。也称为命名空间,主要做访问隔离,即同一个命名空间下的多个资源(内存、CPU、网络、pid)可以互相看到,其他的则不能。目前LinuxNamespaces大致有7种类型,如下表所示:类型系统调用参数隔离资源MountCLONE_NEWNS系统挂载点IPCCLONE_NEWIPC系统VIPC(信号量、消息队列、共享内存等)UTSCLONE_NEWUTS主机名、NIS域namePIDCLONE_NEWPIDprocessPIDNetworkCLONE_NEWNET网络设备,协议栈,端口UserCLONE_NEWUSER用户和用户组CgroupCLONE_NEWCGROUPCgroup根目录这样就可以通过对内核的系统调用实现相应的资源隔离。多层简化文件系统早期的Docker使用AUFS文件系统,它是Docker镜像的基石,可以将分布在不同地方的目录挂载到同一个虚拟文件系统中,只有第一层(第一文件夹级别)是可写的,其余层是只读的。添加/删除文件时,会转化为写操作,写入可写层。AUFS的Cow特性允许在多个容器之间共享层,减少物理占用空间。AUFS本质上仍然是一个堆栈联合文件系统。启动Linux时,首先加载bootfs目录,其中包括Bootloader和内核,Bootloader用于加载和启动内核。当内核成功加载到内存后,bootfs会被释放,然后内核开始加载rootfs。rootfs包含Linux系统中标准的/dev、/proc、/bin、/etc文件,是后续内核启动的基础,所以内核此时锁定了Rootfs,并将其设置为readonly。在只读权限下,内核会进行一系列的检查操作。当内核确认rootfs中包含的文件正确后,将readonly改为readwrite(可读可写),用户以后就可以按照正确的权限操作这些目录了。Docker在虚拟化一个容器的时候,相当于有内存、CPU、硬盘,但是没有操作系统。参考Linux的启动过程,通过AUFS将只读权限的rootfs添加到bootfs中。rootfs检查完成后,将用户要使用的文件内容挂载到rootfs上,也是readonly权限。每次挂载一个FS文件层,每层之间只会挂载增量。这些文件层就是stack文件系统中存储的数据,而AUFS就是用来管理和使用这些文件层的文件系统。目前,一些Docker正在尝试使用OverlayFS。与AUFS相比,OverlayFS更快,更容易实现。OverlayFS也是一个多层简化的文件系统。它依赖并建立在其他文件系统(如ext4fs和xfs等)之上,不直接参与磁盘空间结构的划分。文件的目录被“合并”,然后呈现给用户,这就是联合挂载技术。Linux内核为Docker提供了两种类型的OverlayFS驱动程序:overlay和overlay2。虽然overlay2是对overlay的改进,但它在inode利用率方面比overlay更有效。Docker的架构模型目前,除了Linux系统可以直接运行Docker外,其他系统都是基于虚拟机的。其中Client是与Docker通信的组件,即客户端。Dockerdaemon相当于daemon进程,是docker的server。镜像是一个镜像,运行的镜像是一个容器。Registry是专门存放镜像的仓库。镜像仓库分为公共仓库(如DockerHub、DockerPool)和私有仓库。有了镜像仓库,用户可以利用它提供上传/下载镜像的能力,大部分仓库都提供检索和版本排序的能力。Docker可以保持容器内部的所有配置和依赖不变,可以快速部署到任何有Dockerruntime的环境,无需迁移成本。实现了环境的标准化、版本化管理,具有高隔离性和安全性。一句话总结从操作系统看Docker,Docker是操作系统能力的抽象重组,或者可以看成是进程组粒度的可复用内核裁剪,其中linux内核中的Cgroup用于管理进程组,和命名空间用于实现资源隔离,使用AUFS或OverlayFS挂载文件系统,从而形成一个通过网络分布的容器环境。