暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

容器技术发展简史

技术万花筒 2021-03-20
527

    容器技术是一种虚拟化技术,但是它和虚拟机有本质上的区别,容器即应用,我们现在有很多容器的实现方案,也就是容器引擎,对于容器引擎的种类,可以参考以下文章:

【没了docker,我们还有哪些选择?

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    容器技术不是凭空出现的,本文将为你呈现容器技术发展的历史。先我们得先讲下Unix及Linux操作系统的历史,因为容器技术是伴随着这俩操作系统发展起来的,容器是种子,那么操作系统就是土壤。

Unix出现

    时间要追溯到1969年,不得不提到两个人,就是大名鼎鼎的肯·汤普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie),当时属于贝尔实验室的的研究人员:

 


后者就是C语言之父,在很多文献和书里面也经常看到这两个大师级的人物的介绍。Unix也不是凭空出来的,也有一些有趣的历史,1965年时,贝尔实验室加入一项由通用电气和麻省理工学院合作的计划;该计划要开发一个多用户、多任务的操作系统。贝尔实验室当时也参与了该系统的研发,但因为开发过程中有各种各样的问题,进度缓慢,1969年贝尔实验室决定退出这个计划。贝尔实验室的工程师,肯·汤普逊和丹尼斯·里奇,在此时自行开发了Unix。据说当时肯·汤普森自己开发了一个游戏,为了能继续玩游戏就顺手在实验室的机器上开发了Unix,开始是用B语言开发,后来设计出了C语言并用C语言重写了Unix。

    Unix由于其优秀的设计,使得在未来的10年中大大流行了起来,在学术界和大型企业得到了广泛的使用,山水轮流转,此时Unix的拥有者成了AT&T公司,AT&T当时半卖半送的授权一些学术机构可以使用源码,因此有很多基于该系列源码的一些改造和扩展,于是出现了很多变种,比如BSD,就是来自美国加州大学伯克利分校的变种版本。

    后来AT&T意识到了Unix的商业价值所在,就停止了对学术等机构的Unix源码授权,并对之前的Unix及其变种声明了版权。由于BSD版本在Unix的社群中具有巨大的影响力,使用非常广泛,因此被很多商业厂家采用,成为很多商用Unix的基础。因此Unix的影响力越来越大,终于引起了AT&T的关注,资本毕竟是嗜血的,于是就开始发起专利战争进行了广日持久的专利官司,后来AT&T将贝尔实验室卖掉,导致Unix再度易主,此时到了Novell手中。时间继续推进到80年代,Unix被彻底的商业化了,并且需要昂贵的授权费用,并且规定不能对大学生提供源代码,很多大学不得不停止对其的研究,都不知道该拿上面教学了。

GUN计划

    很快时间到了1983年,另外一个大师开始有动作了,那就是Richard Stallman,是的,就是那个时刻兜着一台笔记本Coding的大胡子:


Stallman是一个很有个性的人,通常牛人都如此,受到Unix商业化的影响,他觉得软件不应该被垄断,尤其是被一些商业化公司垄断,加之在1976年,美国颁布版权保护法,限制了软件的自由传播,而比尔盖茨也在1976年发表了那篇著名的”公开信“,明确反对软件盗版行为。时间很快又到了1985年,Stallman决心要改变这种现状,于是发表了著名的“GNU宣言”,宣布要创立一个新的操作系统,名为GUN,就是GUN is Not Unix的递归缩写,要兼容Unix。随后,Stallman设立了“自由软件基金会”(FSF),发动业内的程序员来卸写这个操作系统,为自由软件运动(movement)提供一个合法的框架,这项运动得到了很多人的大力支持,他们首先开始重写Unix上的很多商业化软件,很多Unix上的工具都逐一被重写,而重写需要编译器,大名鼎鼎的gcc就是此时出现的,作者就是Stallman本人,GUN操作系统在不断的完善,软件也趋于丰富,但是有个致命的问题,缺少一个理想的内核。

Linux

    时间又来到了90年代,又一大师横空出世,那就是Linus,那句著名的Talk is cheap,show me the code就出自他的口。

    1991年,芬兰大学生Linus Torvalds将自己写的一个称之为Linus' Minix(后改为Linux)的内核代码放到网上,很快引起了广泛的关注,全世界的开发者开始集体贡献力量,加入到内核维护队伍中,最终促成了GUN和Linux的结合,使得GUN/Linux操作系统趋于完美,推动着整个计算机行业的发展,进而推动着整个世界的发展。

    由于Linux内核实在太出名了,有点喧宾夺主的意思,我们都简单的称该操作系统为Linux,这多少也让Stallman有点不爽,觉得起了个大早赶了个晚集,他在GUN的官网上专门写了一篇文章来说明GUN和Linux的关系,感兴趣的可以去拜读一下。

 https://www.gnu.org/gnu/linux-and-gnu.html

GUN/Linux   

到2021年,Linux内核已经走过30年的历程,而Linus由小伙也变成了大叔,还在孜孜不倦的维护着Linux内核,而内核也从第一版的1w行代码,发展到现在超过2800w行(截止2020.1.1),Linus也偶尔会怼下这个怼下那个......

    发展到现在,GUN/Linux已经有上百种不同的发行版本,如debian、archlinux,Red Hat Enterprise Linux、SUSE、Oracle Linux等。在企业级应用、嵌入性、智能硬件、可穿戴设备等领域有着极为广泛的使用。如我们使用的安卓手机,就是基于Linux的Java虚拟机,占据了智能手机的半壁江山。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

   说完了这个历史,我们整理出来几个关键的时间点:

  • 1978年,SCO包装并发行了商用版的Unix。

  • 1979年,发行了V7版,也是公认的第一个稳定完美版。

  • 1980年,TCP/IP协议在BSD版本上实现出来,BSD版本Unix的一个变种。

  • 1983年,GUN,开始开源操作系统的构建。

  • 1991年,Linux内核出现

     知道Windows吗?Windows操作系统在1990年之前,都是在Unix上开发的。

     容器始于OS,OS就是它的土壤,大致讲完了Unix’like OS的历史,该讲容器了。容器这个技术,不是一个新技术,它其实早就有了,虽然这几年才被引爆,但是容器完全是一个新瓶装旧酒的玩意,不但是容器,就连k8s也是个新瓶装旧酒的设计,看似高端,其实都是OS早就有的一些组件和方案,进行了适度的整合。

    我们先来看第一个时间点:

1979年

1979年,第一个Unix版本V7发布,在1979年的这个V7版本上,chroot这个系统调用被发明了出来,什么是chroot呢?就是改变一个进程及其子进程的根目录到另外一个目录下,在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,这样有几个好处:

  • 增强系统安全性,限制了用户进程的权限,使得进程不能访问一些特定的文件;

  • 建立一个和原系统隔离的目录结构(是不是联想到了容器的隔离文件系统union gs),为进程指定一个单独的、新的文件系统上下文环境。

于是,Unix就具有了这种能力:为每个进程提供一个隔离的虚拟文件系统。Chroot在后来的1982年被新增到了BSD这个分支中。可见,在早期构建Unix系统的先驱们已经有了这种意识,就是隔离的意识。chroot可以认为是容器技术的鼻祖。

1999年

在这年,一家共享主机托管商提供了FreeBSD Jails的概念,顾名思义,就是将服务和客户端服务明确的区分开,实现安全性和可管理的便捷性,它允许将系统划分为几个独立的较小的系统,称之为Jail,并且这些小系统有独立的配置和IP地址。这就有容器的意思了。2000年,伴随FreeBSD4.0版的发布,正式对外公开。系统管理者可以使用jail(8)这个命令来调用这个服务。

2001年

该Linux出场了,GUN和Linux整合后迅速发展,这个时间点上Linux已经比较成熟了,Linux Vserver出现了,和Free BSD的Jails是相同的原理,可以对OS上的资源(文件系统、网络等)进行隔离划分。到了2001年,Linux通过对内核打补丁的方式实现了该种虚拟化,其实就是namespace机制,中间经过了很多次完善,最后的stable补丁在2006年发布。

2004年

Solaris属于Unix的一个变种,在2004年,Solaris上的虚拟化诞生了,期初称为Solaris container,Solaris的虚拟化技术由Sun公司开发,2004年2月同Solaris10版本对外发布,Sun公司在2009年被并购后落入了Oracle公司,Solaris11之后叫Solaris zones。从名字也能看出来,也是一种操作系统层面的轻量级虚拟化技术。

    Solaris zones 是Native zone,kernel zone的统称,能够为你使你的应用在隔离的环境中运行,并实现有效的资源管理。几乎所有的Oracle用户都在使用Zone,广泛应用在生产环境中,从web app 到Oracle数据库实例都可以安装在zone里面。zone 技术为应用程序创建了虚拟的一层,可以将zone 称之为一个沙箱,我们安装的操作系统称为global-zone,在global zone里面可以创建很多独立的zone,称为non-globalzone,global zone 控制着操作系统内核,设备驱动,系统内存管理,文件系统等等并为non global zone 提供接口。非global zone 之间互相独立,互不影响,每一个zone 拥有自己的文件系统,进程空间,防火墙,网络配置等等,对于global zone 来说每一个non-global zone 是一个拥有一组资源并用zone ID命名的进程。Solaris zone 是一种轻量级的虚拟化技术,虚拟化的开销很小,所有的native zone 依赖于操作系统内核,kernelzone 可以拥有独立的内核版本

2005: Open VZ (Open Virtuzzo)

2005年,SWsoft发布了Open VZ,OpenVZ是开源软件,是基于Linux平台的操作系统级服务器虚拟化解决方案。OpenVZ采用SWsoft的Virtuozzo虚拟化服务器软件产品的内核,Virutozzo是SWsoft公司提供的商业虚拟化解决方案。

    OpenVZ可以在单个物理服务器上创建多个隔离的虚拟专用服务器(VPS)并以最大效率共享硬件和管理资源。每个VPS的运行和独立服务器完全一致,因其自身的用户、应用程序都可以独立重启,它拥有根访问权限、用户、IP地址、内存、处理器、文件、应用服务、系统库文件和配置文件等。拥有轻量级处理损耗和高效设计的OpenVZ是运行应用服务和实时数据生产型服务器虚拟化的最佳选择。

    OpenVZ软件同时为用户提供工具,协助自动化管理虚拟服务器。基于模板的应用程序部署可以在几分钟内用简单的方法创建新的虚拟服务器并投入使用,而且与其他的虚拟化技术相比,OpenVZ可以在每CPU上运行几倍于其他虚拟化服务器技术的虚拟化服务器。

    OpenVZ是基于Linux内核和作业系统的操作系统级虚拟化技术。OpenVZ允许物理服务器运行多个操作系统,被称虚拟专用服务器(VPS,Virtual Private Server)或虚拟环境(VE, Virtual Environment)。

与硬件虚拟化的VMware和半虚拟化的Xen相比,OpenVZ的host OS和guest OS都必需是Linux(虽然在不同的虚拟环境里可以用不同的Linux发行版)。但是,OpenVZ声称这样做有性能上的优势。根据OpenVZ网站的说法,使用OpenVZ与使用独立的服务器相比,性能只会有1-3%的损失。

2006: Process Containers

Process Containers横空出世,这个名字可能比较陌生,但是提到另外一个名字:Cgroups你可能就了然了。Cgroups在容器中控制容器的资源配额,是极其重要的一个控制功能,由谷歌工程师在2006年发布,2008年在2.6.24版本合并到Linux内核中。

2008: LXC

    终于,在2008年,LXC横空出世,LXC作为集大成者,采集众家之所长,有了前期的N多铺垫,终于有了容器技术的雏形。LXC的主要两大依托就是namespace和Cgroups,一个做资源隔离,解决进程可以用什么资源的问题;一个做资源控制,解决进程可以用多少资源的问题。

    进程在运行时,除了CPU和内存外,其实还需要很多其他资源,为了将其隔离,需要将资源一并隔离,如网络、文件系统、IPC等,什么是namespace?

A namespace wraps a global system resource in an abstraction that
makes it appear to the processes within the namespace that they
have their own isolated instance of the global resource. Changes
to the global resource are visible to other processes that are
members of the namespace, but are invisible to other processes.
       One use of namespaces is to implement containers.

隔离的资源种类有以下几种:

namespace的存在,使得每个进程都以为自己是单独的存在,拥有独享的必要资源,其实是被划分到一个单独的隔离区域。


2011: Warden

LXC是个好东西,加上Linux系统的覆盖面和应用广泛的加持,CloudFoundry在2011年启动了Warden项目,早期使用了LXC的技术,但是后面就用自己的实现替代掉了,它可以隔离进程的上下文环境,并且在后台提供了一个daemon进程提供了各种API来供你进行容器的管理,它提供了一种C/S架构的工具用来跨域多个主机来管理容器,它支持对cgroups,namespace及进程生命周期的管理。这是不是有Docker的影子了?如果你对Docker比较熟悉的话,和Docker的架构有点像。

2013: LMCTFY

Let Me Contain That For You (LMCTFY),谷歌在2013年搞起的一个容器栈,可以为Linux应用提供容器(container)。这些容器可以让一台机器上的不同应用使用相互隔离的资源,以独占的方式运行在同一台机器上。这些应用也可以拥有容器,因此能够创建和管理属于他们自己的子容器。这个项目的地址如下:

https://github.com/google/lmctfy

    谷歌后来转向了libcontainer,因此这个项目在2015年停止更新,现在已经合并到了https://github.com/opencontainers/runc/tree/master/libcontainer

读到这里,感觉是不是越来越像Docker了?

2013: Docker

    是的,Docker也很快出现了,Docker优秀的设计使得它非常流行,像Warden一样,期初也是基于LXC的,后来就以自己的libcontainer来替代了,Docker之所以如此流行,一个重要的原因就是提供了一个完整的解决方案生态系统,使得易用、简单,这是它的前辈们所做不到的,历史上的解决方案看起来都有Docker的影子,但是都有各种各样的不足,Docker几乎解决了所有的痛点,变得非常易用。

2014 微服务

明明讲容器技术的发展史,为什么提到微服务呢?这是有原因的,大家对微服务的一致性认知,都是出自2014年,马丁福勒的那篇布道文,通俗易懂的阐述了什么是微服务架构:

其实微服务的概念早在2012年就陆续的出现了,但是由于容器技术还不太完善,微服务的一个特点就是拆分,服务的数量会增长,膨胀的服务如何部署是个问题,无论是用虚拟机还是物理机,成本都比较高,而且扩容也不是很流畅。容器技术逐渐完善了后,微服务的发展终于得到了解放,一个个小而美的服务运行在容器里,具有必要的隔离性,且近乎原生系统的性能(直接在内核上运行),简直是再合适不过了。微服务得到了长足的进展,而这又反过来促进了容器的发展。

2014 k8s

Docker引爆了容器技术,加上微服务的加持,使得二者发展迅速,但是容器更像是一个好玩的玩具,如何在产线上工业化的使用起来?网络问题、负载均衡问题、监控、部署、更新、镜像管理、发布……需要解决很多很多问题,因此容器的编排应运而生,k8s在2014年横空出世,说横空出世或许有点夸张,因为它是基于谷歌内部建设了十几年的Borg构建的开源版本,实践出真知,因此很快就成为容器编排事实上的标准。

2014年12月

CoreOS发布并开始支持rkt(最初作为Rocket发布)作为Docker的替代品。

2015 CNCF

容器技术,容器编排,微服务,三者相辅相成,共同促进,迅速发展,容器云的概念也应运而生,于是乎,谷歌在2015年底拉着一票巨头成立了CNCF这个组织,共同做大云原生这个生态,无利不起早,也是为了照顾自家生意。

2017-2018

微服务、容器编排、容器云,整个生态变得异常的火爆,旧时王谢堂前燕,飞入寻常百姓家。以前只有一些巨头公司才用得起的所谓“高大上”的解决方案,中小公司们都可以愉快的使用了,大家都在考虑自己技术生态的转型,考虑对架构做改造:这是19年的一项调查:

这个调查很有趣,代表了一种趋势,做了微服务,才有可能做容器化;容器化后才有可能容器编排,大家都在这浪潮下暗流涌动,跃跃欲试,大部分人还处于改造微服务的一种阶段下,而服务网格作为新一代的微服务标准,还在发展和完善过程中。

    可以看到,一种颠覆行业的解决方案绝对不是凭空出现的,其必定是经过了前人无数的探索、积累,随着行业发展,在某个时刻被引爆,可以说是一种必然。

参考文章:

https://man7.org/linux/man-pages/man7/namespaces.7.html

https://man7.org/linux/man-pages/man7/cgroups.7.html

https://blog.aquasec.com/a-brief-history-of-containers-from-1970s-chroot-to-docker-2016?spm=ata.13261165.0.0.2b17486fZ7mVoY

文章转载自技术万花筒,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论