Docker进阶与实战-关于容器技术(1)

在第1章对 Docker的介绍中,已经知道容器技术是 Docker 的一项基础技术,而在当前对 Docker 的火热讨论中,容器也时常跟 Docker一起被提及。作为Docker 的进阶书籍有必要对容器技术做一些探讨,以深刻理解 Docker 与相关技术之间的关联
容器技术的前世今生2.1
2.1.1关于容器技术
容器技术,又称为容器虚拟化,从字面上看它首先是一种虚拟化技术。在如今的技术浪潮下,虚拟化技术层出不穷,包括硬件虚拟化、半虚拟化、操作系统虚拟化等。本书不会对虚拟化技术展开介绍,只需要知道容器虚拟化是一种操作系统虚拟化,是属于轻量级的虚拟化技术即可。又因为在实现原理上,每一种虚拟化技术之间都有较大的差别,所以
即使没有虚拟化的技术背景,也是可以单独来学习容器虚拟化的。容器技术之所以受欢迎,一个重要的原因是它已经集成到了 Linux内核中,已经被当作 Linux 内核原生提供的特性。当然在其他平台上也有相应的容器技术,但本书讨论的以及Docker涉及的都是指 Linux平台的容器技术。
对于容器,目前并没有一个严格的定义,但普遍认可的说法是,它首先必须是一个相对独立的运行环境,在这一点上,有点类似虚拟机的概念,但又没有虚拟机那样彻底。另外,在一个容器环境内,应该最小化其对外界的影响,比如不能在容器中把 host 上的资源全部消耗掉,这就是资源控制。

般来说,容器技术主要包括Namespace和Cgroup这两个内核特性口Namespace 又称为命名空间(也可翻译为名字空间),它主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于这类资源.因为每个容器都有自己的抽象,而它们彼此之间是不可见的,所以就可以做到访问隔离。
口Cgroup是control group 的简称,又称为控制组,它主要是做资源控制。其原理是将一组进程放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这-组进程可用资源的目的。
实际上,Namespace和Cgroup并不是强相关的两种技术,用户可以根据需要单独使用它们,比如单独使用 Cgroup 做资源控制,就是一种比较常见的做法。而如果把它们应用到一起,在一个Namespace中的进程恰好又在一个Cgroup中,那么这些进程就既有访问隔离,又有资源控制,符合容器的特性,这样就创建了一个容器对于Namespace和Cgroup,后面的章节会做详细的介绍:

2.1.2容器技术的历史
上文提到容器技术属于一种操作系统虚拟化,事实上,其最早的原型可以简化为对目录结构的简单抽象,如图2-1所示。

图2-1所示为在普通的目录结构中创建一个完整的子目录结构。这种抽象化目录结构的出现最早源于1982年,那时通过 chroot 技术把用户的文件系统根目录切换到某个指定的
第2章关于容器技术13
目录下,实现了简单的文件系统视图上的抽象或虚拟化。但是这种技术只是提供了有限的文件系统隔离,并没有任何其他隔离手段,而且人们后来发现这种技术并不安全,用户可
以逃离设定的根目录从而访问 host上的文件。针对上面提到的安全性问题,在2000年,内核版本2.3.41引人了pivot root技术,它可以有效地避免 chroot带来的安全性问题。今日的容器技术,比如LXC、Docker 等,也都是使用了 pivot root来做根文件系统的切换。然而pivot root 也仅仅是在文件系统的隔离上做了一些增强,并没有在其他隔离性上有所提高。

同样在2000年左右,市场上出现了一些商用的容器技术,比如 Linux-VServer 和SWsoft(现在的Odin)开发的 Virtuozzo,虽然这些技术相对当时的XEN和KVM,有明显的性能提升,但是因为各种原因,并未在当时引起市场太多的关注。
这里只讨论Linux系统上的容器技术,同时期还有很多有名的非 Linux 平台的容器注煎技术,比如FreeBSD的iail、Solaris 上的Zone等。
到了2005年,同样是Odin公司,在Virtuozzo的基础上发布了OpenVZ技术,同时开始推动OpenVZ中的核心容器技术进入Linux内核主线,而此时IBM等公司也在推动类似的技术,最后在社区的合作下,形成了目前大家看到的Cgroup和 Namespace,这时,容器技术才开始逐渐进入大众的视野。 

 

 

随着容器技术在内核主线中的不断成熟和完善,2013年诞生的 Docker 真正让容器技术得到了全世界技术公司和开发人员的关注,相信容器技术的未来一定会比它的前世和今生更加精彩。
2.2 一分钟理解容器
2.2.1容器的组成
上文已多次提及,容器的核心技术是 Cgroup + Namespace,但光有这两个抽象的技术概念是无法组成一个完整的容器的。在 2.1.2 节也提到过最早的容器概念就包括了对文件目录视图的抽象隔离,而所有的这一切,都需要有工具来驱动,需要有一个工具来提供用户可操作的接口,来创建一个容器。所以笔者认为,对于 Linux 容器的最小组成,可以由以下公式来表示:

 

 

2.2.2容器的创建原理
至此对容器的描述还一直停留在文件和概念的层面,本小节将通过简单的代码抽象清晰地展现容器的创建原理,使读者对容器有更深刻的理解。

 

对于代码一,通过clone系统调用,并传人各个Namespace 对应的clone flag,创建了一个新的子进程,该进程拥有自己的Namespace。根据以上代码可知,该进程拥有自己的pid、mount、user、net、ipc、uts namespace。

对于代码二,将代码一中产生的进程 pid写人各个Cgroup 子系统中,这样该进程就可以受到相应Cgroup子系统的控制。
口对于代码三,该fun 函数由上面生成的新进程执行,在fun函数中,通过 pivotroot系统调用,使进程进入一个新的rootfs,之后通过exec系统调用,在新的 Namespace、Cgroup、rootfs 中执行“/bin/bash”程序。通过以上操作,成功地在一个“容器”中运行了一个bash程序。对于Cgroup和Namespace的技术细节,将在以下两节详细描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值