阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

操作系统看Docker

53次阅读
没有评论

共计 2830 个字符,预计需要花费 8 分钟才能阅读完成。

导读 从操作系统看 Docker,Docker 是操作系统能力的抽象重组,或者,可以看成进程组粒度的可复用内核裁剪,其中以 linux 内核中的 Cgroup 来管理进程组,以命名空间来实现资源隔离,以 AUFS 或者 OverlayFS 实现文件系统的挂载,从而,形成了一个通过网络分发的容器环境。

Linux 操作系统的内核裁剪不仅是为了提升系统的安全性,而且是为了进一步提升应用系统的性能。Linux 的内核裁剪技术并没有得到广泛的应用,对于安全性、应用的性能以及开发效率而言,业界普遍采用的是虚拟化技术——虚拟机和容器。无论哪一种虚拟化技术,本质上都可以看作是操作系统能力的抽象、分拆和组合。

虚拟化技术一瞥

无论是哪一种虚拟化技术,都是在操作系统之上的不同抽象,从而形成了分层的架构。层次越多,调用链也相应地变长,运行时的开销也就越大。

操作系统看 Docker

如上图所示,虚拟机中的 Hypervisor 这一层是一个常用的硬件虚拟化软件,把操作系统抽象为多个底层的硬件接口,利用这些硬件接口,虚拟机可以实现自己操作系统。Docker 则不同,它构建在原有的操作系统之上,是某种程度的复用。

从部署时间来看,物理机由于涉及到采购和软硬件安装等因素,部署的时间最长,虚拟机则要短很多,Dcoker 则是秒级的。

2013 年,Docker 对外开源,2014 年 6 月 9 日正式发布,很快便风靡全球,容器虚拟化技术的发展脉络大致是这样的——

操作系统看 Docker

Docker 的 OS 依赖

Docker 构建于操作系统之上,是强依赖于操作系统的虚拟化技术,依赖于 Cgroup 来管理进程组,依赖于命名空间来实现资源隔离,通过特定的文件系统来使用操作系统自身的文件系统。

Cgroup

Cgroup 全称为 Linux Control Group,是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如 CPU、内存、磁盘输入输出等)。

Cgroup 是由 Google 的工程师在 2006 年发起的,最早的名称为进程容器(process containers)。在 2007 年,由于在 Linux 内核中,容器这个名词有许多不同的意义,进而被重命名为 cgroup,并且被合并到 2.6.24 的内核版本中,后来又添加了很多功能。

Cgroup 的主要功能:

限制进程组可以使用的资源数量,例如,可以为进程组设定一个内存使用的上限,一旦进程组使用的内存达到限额再申请内存,就会触发 OOM。

进程组的优先级控制,例如,可以使用为某个进程组分配特定的 cpu share。

记录进程组使用的资源数量,例如,可以记录某个进程组使用的 cpu 时间

进程组隔离,例如,可以使不同的进程组使用不同的命名空间,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

进程组控制,例如,将进程组挂起和恢复。

[/erji] 命名空间 [/erji]
Namespace(命名空间)是 Linux 提供的一种内核级别资源隔离的方法。又称为命名空间,它主要做访问隔离,即同一个命名空间的多个资源(memory, CPU, network, pid)可以相互看到,但是之外的看不到。

目前 Linux Namespace 大致有 7 种,如下表所示:

操作系统看 Docker

这样,通过对内核的系统调用,即可实现相应的资源隔离。

多层单一化文件系统

早期的 Docker 使用 AUFS 文件系统,是 Docker image 的基石,可以将分布在不同地方的目录挂载到同一个虚拟文件系统中,只有第一层(第一个文件夹层级)是可写的,其余层是只读的,增加 / 删除文件时都会转换为写操作写入可写层。AUFS 的 Cow 特性能够允许在多个容器之间共享分层,从而减少物理空间占用。

AUFS 本质上仍是堆栈式的联合文件系统。在 Linux 启动时,首先加载 bootfs 目录,这个目录里面包括 Bootloader 和 kernel,Bootloader 用来加载启动 kernel。当 kernel 成功加载到内存中后,bootfs 就会释放掉,kernel 随之开始加载 rootfs。rootfs 包含的是 Linux 系统中标准的 /dev、/proc、/bin、/etc 等文件,是后续 kernel 启动的基础,因此此时 kernel 将 Rootfs 加锁,设为 readonly。在只读权限下,kernel 进行一系列的检查操作。当 kernel 确认 rootfs 包含的文件正确无误后,将 readonly 改为 readwrite(可读可写),以后用户就可以按照正确的权限对这些目录进行操作了。

当 Docker 虚拟化出来一个容器之后,就相当于有了内存、CPU、硬盘,但没有操作系统。参考 Linux 的启动过程,通过 AUFS,将 readonly 权限的 rootfs 添加到 bootfs 之上,当 rootfs 检查完毕之后,再将用户所要使用的文件内容挂载到 rootfs 之上,同样是 readonly 权限。每次挂载一个 FS 文件层,每层之间只会挂载增量。这些文件层就是堆栈式文件系统中所保存的数据,AUFS 就是用来管理、使用这些文件层的文件系统。

操作系统看 Docker

目前,一些 Docker 开始尝试使用 OverlayFS,对比于 AUFS,OverlayFS 速度更快,实现更简单。OverlayFS 也是一种多层单一化的文件系统,它依赖并建立在其它的文件系统之上(例如 ext4fs 和 xfs 等等),并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现,这也就是联合挂载技术。Linux 内核为 Docker 提供的 OverlayFS 驱动有两种:overlay 和 overlay2。而 overlay2 是相对于 overlay 的一种改进,在 inode 利用率方面比 overlay 更有效。

Docker 的架构模型

目前来说,除了 Linux 系统可以直接运行 Docker 之外,其他系统都是基于虚拟机运行的。

操作系统看 Docker

其中,Client 是与 Docker 通信的一个组件,也就是客户端。Docker daemon 相当于守护进程,也就是 docker 的 Server。Image 是镜像,运行起来的镜像就是一个容器。Registry 是具体存放镜像的仓库,镜像仓库分为公有仓库(如 DockerHub、DockerPool)和私有仓库。有了镜像仓库,用户可以用它来提供上传 / 下载 镜像的能力,大多数仓库都提供了检索和版本整理能力。

Docker 能够保持容器内部所有的配置和依赖关系始终不变,可以在任何拥有 Docker runtime 的环境快速部署而没有迁移成本,实现了环境的标准化和版本化管理,具有较高的隔离性和安全性。

一句话小结

从操作系统看 Docker,Docker 是操作系统能力的抽象重组,或者,可以看成进程组粒度的可复用内核裁剪,其中以 linux 内核中的 Cgroup 来管理进程组,以命名空间来实现资源隔离,以 AUFS 或者 OverlayFS 实现文件系统的挂载,从而,形成了一个通过网络分发的容器环境。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2830字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中