《Docker进阶与实战》——2.1节容器技术的前世今生

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技术把用户的文件系统根目录切换到某个指定的目录下,实现了简单的文件系统视图上的抽象或虚拟化。但是这种技术只是提供了有限的文件系统隔离,并没有任何其他隔离手段,而且人们后来发现这种技术并不安全,用户可以逃离设定的根目录从而访问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的jail、Solaris上的Zone等。

到了2005年,同样是Odin公司,在Virtuozzo的基础上发布了OpenVZ技术,同时开始推动OpenVZ中的核心容器技术进入Linux内核主线,而此时IBM等公司也在推动类似的技术,最后在社区的合作下,形成了目前大家看到的Cgroup和Namespace,这时,容器技术才开始逐渐进入大众的视野。
对于Namespace,其各个子系统进入内核的版本号及贡献公司如表2-1所示。

随着容器技术在内核主线中的不断成熟和完善,2013年诞生的Docker真正让容器技术得到了全世界技术公司和开发人员的关注,相信容器技术的未来一定会比它的前世和今生更加精彩。

时间: 2024-08-07 14:43:42

《Docker进阶与实战》——2.1节容器技术的前世今生的相关文章

《Docker进阶与实战》——第2章关于容器技术

第2章关于容器技术在第1章对Docker的介绍中,已经知道容器技术是Docker的一项基础技术,而在当前对Docker的火热讨论中,容器也时常跟Docker一起被提及.作为Docker的进阶书籍,有必要对容器技术做一些探讨,以深刻理解Docker与相关技术之间的关联.

《Docker进阶与实战》——导读

目 录 序 前 言 第1章 Docker简介1.1 引言1.2 功能和组件1.3 安装和使用1.4 概念澄清1.5 本章小结第2章 关于容器技术2.1 容器技术的前世今生2.2 一分钟理解容器2.3 Cgroup介绍2.4 Namespace介绍2.5 容器造就Docker2.6 本章小结第3章 理解Docker镜像3.1 Docker image概念介绍3.2 使用Docker image3.3 Docker image的组织结构3.4 Docker image扩展知识3.5 本章小结第4章

《Docker进阶与实战》——2.5节容器造就Docker

2.5 容器造就Docker 关于容器是否是Docker的核心技术,业界一直存在着争议.有人认为Docker的核心技术是对分层镜像的创新使用,有人认为其核心是统一了应用的打包分发和部署方式,为服务器级别的"应用商店"提供了可能,而这将会是颠覆传统行业的举措.事实上,这一系列创新并不是依赖于容器技术的,基于传统的hypervisor也可以做到,业界也由此诞生了一些开源项目,比如Hyper.Clear Linux等.另外,Docker官方对Docker核心功能的描述"Build,

《Docker进阶与实战》——1.4节概念澄清

1.4 概念澄清 本书的附录A是关于Docker常见问题的解答,但对于Docker基本概念方面的问题,希望读者可以在阅读完本章后就有清晰的认识,所以本节会针对与Docker概念息息相关的几个常见问题进行说明.1.4.1 Docker在LXC基础上做了什么工作 首先我们需要明确LXC的概念,但这常常有不同的认识.LXC目前代表两种含义: LXC用户态工具(https://github.com/lxc/lxc). Linux Container,即内核容器技术的简称. 这里通常指第二种,即Docke

《Docker进阶与实战》——1.1节引言

1.1 引言1.1.1 Docker的历史和发展自从2013年年初一个叫dotCloud的PaaS服务供应商将一个内部项目Docker开源之后,这个名字在短短几年内就迅速成为一个热词.似乎一夜之间,人人都开始谈论Docker,以至于这家公司干脆出售了其所持有的PaaS平台业务,并且改名为Docker.Inc,从而专注于Docker的开发和推广.对于Docker,目前的定义是一个开源的容器引擎,可以方便地对容器(关于容器,将在第2章详细介绍)进行管理.其对镜像的打包封装,以及引入的Docker R

《Docker进阶与实战》——2.6节本章小结

2.6 本章小结本章对容器技术做了详细的剖析,相信读者已经对容器的概念和原理有了清晰的认识,在这样的基础之上,可以更加轻松和深刻地理解Docker的一系列技术了,接下来的章节会针对Docker中的各个子系统做详细的介绍.

《Docker进阶与实战》——2.2节一分钟理解容器

2.2 一分钟理解容器2.2.1 容器的组成 上文已多次提及,容器的核心技术是Cgroup + Namespace,但光有这两个抽象的技术概念是无法组成一个完整的容器的.在2.1.2节也提到过最早的容器概念就包括了对文件目录视图的抽象隔离,而所有的这一切,都需要有工具来驱动,需要有一个工具来提供用户可操作的接口,来创建一个容器.所以笔者认为,对于Linux容器的最小组成,可以由以下公式来表示: 容器 = cgroup + namespace + rootfs + 容器引擎(用户态工具) 其中各项

《Docker进阶与实战》——1.3节安装和使用

1.3 安装和使用1.3.1 Docker的安装 Docker的安装和使用有一些前提条件,主要体现在体系架构和内核的支持上.对于体系架构,除了Docker一开始就支持的x86-64,其他体系架构的支持则一直在不断地完善和推进中,用户在安装前需要到Docker官方网站查看最新的支持情况.对于内核,目前官方的建议是3.10以上的版本,除了内核版本以外,Docker对于内核支持的功能,即内核的配置选项也有一定的要求(比如必须开启Cgroup和Namespace相关选项,以及其他的网络和存储驱动等).如

《Docker进阶与实战》——3.2节使用Docker image

3.2 使用Docker image Docker内嵌了一系列命令制作.管理.上传和下载镜像.可以调用REST API给Docker daemon发送相关命令,也可以使用client端提供的CLI命令完成操作.本书的第7章会详细阐述Docker REST API的细节,本节则主要根据功能对涉及image的命令进行说明.下面就从Docker image的生命周期角度说明Docker image的相关使用方法. 3.2.1 列出本机的镜像 下面的命令可以列出本地存储中镜像,也可以查看这些镜像的基本信