云原生架构:从技术演进到最佳实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 容器

4.1 容器简介

在云平台迅速发展过程中,困扰运维工程师最多的是,需要为各种风格迥异的应用部署运行环境、依赖服务。虽然自动化运维工具可以降低环境搭建的复杂度,但仍然不能从根本上解决运行环境的问题。

容器是一种打包应用及其运行环境的方式,为应用打包所有软件及其所依赖的环境,并且可以实现跨平台部署,它是一系列内核特性的统称。比如广泛使用的容器实现Docker,它提供了让开发人员可以将应用及其依赖封装到一个可移植的容器中的能力。Docker通过集装箱式的封装方式,让开发人员和运维人员都能够以其所提供的“镜像+分发”的标准化方式发布应用,使得异构语言不再是应用环境部署的“枷锁”。

4.1.1 容器技术的优缺点

相比先前的各种技术,容器技术具有以下优点。

轻量化:相比虚拟机,容器提供了更小的镜像,因此可以更快速地对容器进行构建和启动。容器更适合需要批量快速上线和快速弹性伸缩的应用。

细粒度(资源管控):容器是一个沙箱运行进程,这个沙箱起到了细粒度管控资源的作用。在创建容器时,可以指定CPU、内存及I/O资源。在运行容器时强制执行这些资源限制,可防止容器占用其他资源。

高性能(资源利用率高):容器使用更轻量级的运行机制,它是一种操作系统级别的虚拟化机制。由于容器是以进程形态运行的,因此其性能更接近裸机的性能。对于对性能有较高要求的应用,如高性能计算等,容器更为合适。

环境一致性:容器实现了操作系统的解耦,它打包了整个操作系统,保证应用运行的本地环境和远端环境的高度一致性,从而保证一次容器打包可以到处运行,对跨平台、不同环境的应用部署有显著的帮助。

管理便捷性:使生命周期管理,包括迁移、扩展、运维等更加便捷。

但不可否认,安全隔离一直是容器技术的一大弊端。容器只是运行在宿主机上的一种特殊进程,因此多个容器之间共享的还是同一台宿主机的操作系统内核,从而大大增加了安全攻击面。

4.1.2 大事记

下面是关于容器技术发展的大事记。

1979年,UNIX 7引入了chroot,它被认为是最早的容器技术之一。在传统的Linux中,系统默认的目录结构都是以根“/root”开始的,而chroot的作用是切换进程的根目录,以指定的位置作为根位置。它允许将进程及其子进程与文件系统的其余部分隔离开来,但是此时chroot的隔离功能仅限于文件系统,对进程和网络空间并没有进行相应的处理。

2000年,FreeBSD 4.0版本中引入了Jail,为chroot文件隔离提供了更好的安全性。与chroot 不同,FreeBSD 除了能实现文件系统的隔离,还有独立的进程和网络空间,而Jail中的进程,既不能访问也不能看到Jail之外的文件、进程和网络资源。

2001年,Linux-VServer实现了操作系统级别的虚拟化功能,它使用类似于chroot的机制和“安全上下文”相结合来提供虚拟化解决方案,能够划分文件系统、网络地址和内存。它比chroot更先进,允许用户在Linux操作系统之上虚拟出多台独立运行的服务器。操作系统级别的虚拟化有一些限制,因为共享相同的体系结构和内核版本,所以无法为用户提供不同的内核版本。

2004年,Oracle发布了Solaris Containers,这是一个应用于x86和SPARC处理器的Linux-VServer。Solaris Containers是由系统资源控制和“区域”提供边界隔离的。

2005年,SWsoft基于Linux 2.6.15内核发布了OpenVZ,它与Linux-VServer一样,实现了操作系统级别的虚拟化。每个OpenVZ容器都有一套隔离的文件系统、用户及用户组、进程树、网络、设备和IPC对象。

2006年,Google发布了Process Container(进程容器)内核补丁,可以隔离进程的CPU、内存、磁盘I/O、网络I/O等资源。2007年,其更名为cgroup(control group),cgroup可以对进程分组配置,用来限制该进程可用的资源;同年它被集成到Linux内核。

2008年,LXC(Linux Container,Linux容器)的第一个版本发布,LXC的实现机制与OpenVZ、Solaris Containers、Linux-VServer类似,但它使用了已经集成到Linux内核的cgroup,同时利用namespace为容器提供独立的隔离空间,包括进程树、网络、用户组及文件系统等,再利用capability限制容器内的敏感系统调用。

2013年,dotCloud公司开源了其容器项目Docker,它与OpenVZ、Solaris Containers一样,实现了操作系统级别的虚拟化。Docker 的最初版本基于 LXC 构建,但创新性地定义了分层镜像格式。

2014年,Google开源了其内部系统Borg的容器系统lmctfy(let me contain that for you),提供了 Linux 应用程序容器。lmctfy 在同一内核上的隔离环境中运行应用程序,并且不需要补丁,因为它使用cgroup、namespace和其他Linux内核功能。但lmctfy因为对用户不够友好,所以被Docker比下去了。

2014年12月,CoreOS发布并开始支持rkt容器系统(最初作为Rocket发布),试图成为Docker的替代品。

2015年,OCI(Open Container Initiative)由Docker、CoreOS和容器行业的其他领导者发起,旨在建立软件容器的通用标准,方便同一个容器镜像可以在不同的容器运行时上运行。它包含运行时规范(runtime-spec)和镜像规范(image-spec)。