1.1 什么是容器技术
自从有了KVM、Xen这样的虚拟化技术,x86服务器的利用率以及管理得到了质的飞越。但是人们也没有停下继续研究更轻量级虚拟化技术的脚步,容器技术就是KVM、Xen之后更优秀的一种虚拟化技术。
1.1.1 什么是容器
提到“容器”这个词,我们可能首先想到的是瓶瓶罐罐,如图1-1所示。
我们要讲的容器技术是什么呢?其实,容器技术的英文是Container。Container有集装箱、容器的含义,容器是被大家广为接受的译法。不过,我们可以形象地将Container技术类比作集装箱。我们知道,集装箱是用来运载货物的,它是一种按规格标准化的钢制箱子。集装箱的特色在于规格统一,并可以层层重叠,所以能大量放置在远洋轮船上。早期航运是没有集装箱概念的,那时候货物的摆放杂乱无章,很影响出货和运输效率。有了集装箱,货运公司就可以快捷方便地运输货物。码头集装箱如图1-2所示。
后来IT领域借鉴了这一理念。早期,大家都认为硬件抽象层基于hypervisor虚拟化的方式可以最大限度地提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过虚拟机监视器hypervisor(KVM、Xen等)来衍生、运行和销毁。然而,随着时间推移,用户发现使用hypervisor越来越多麻烦。为什么?因为对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统,其中安装了大量应用程序。但在实际生产开发环境中,我们更关注的是自己部署的应用程序,如果每次发布都需要部署一个完整操作系统和附带的依赖环境,会降低工作效率。
图1-1 想象中的容器是瓶瓶罐
图1-2 码头集装箱
我们希望将底层多余的操作系统和环境共享和复用,将精力更多地放在应用程序本身。也就是一个服务完成部署后,我们可以较便捷地将它移植到另外一个地方,不用再重新安装一套操作系统和依赖环境。这就像集装箱运载一样,我们把货物—一辆兰博基尼跑车(开发好的应用App),打包放到集装箱(容器)里,通过货轮可以将它从上海码头(CentOS 7.2环境)运送到纽约码头(Ubuntu 14.04环境)。而且运输期间,我的兰博基尼(App)没有受到任何损坏(文件没有丢失),在另外一个码头卸货后,车子启动正常。这一运送过程如图1-3所示。
图1-3 兰博基尼运送过程(App容器化)示意图
2008年,Linux Container容器技术诞生,一举解决了IT界“集装箱运输”的问题。Linux Container(简称LXC)是一种内核轻量级的操作系统层虚拟化技术。Linux Container主要在Namespace和Cgroup两大机制保证下实现。那么Namespace和Cgroup是什么呢?上文我们提到了集装箱,集装箱的作用是对货物进行打包隔离,不让A公司的货跟B公司的货混在一起,Namespace就是起到类似隔离的作用。光有隔离还不够,我们还需要对货物进行资源的管理。同样,航运码头要进行管理,例如:货物用什么规格的集装箱装载,需要用多少个集装箱,哪些货物优先运走,遇到极端天气怎么暂停运输服务,是否改航道,等等。类似地,Cgroup就负责资源管理控制,比如进程组使用CPU/MEM的限制、优先级控制、挂起和恢复等。Linux Container进程管理如图1-4所示。
1.1.2 容器技术的特点
下面我们把容器和硬件抽象层虚拟化hypervisor技术进行对比,更直观地了解容器的特点。之前提到过,使用传统的虚拟化(虚拟机)技术创建环境和部署应用都很麻烦,而且应用的移植过程很烦琐,比如把VMware里的虚拟机迁移到KVM里需要转换镜像格式。但是有了容器技术就简单了,容器技术主要有以下4个特点。
1)极其轻量:只打包必要的Bin/Lib。
2)秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多)。
3)易于移植:一次构建,随处部署。
4)弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便的容器管理平台有着非常强大的弹性管理能力。
图1-4 Linux Container 进程管理
以上这些容器特性可用图1-5形象地表示。
图1-5 容器特性
1.1.3 容器的标准化
当前,Docker几乎是容器的代名词,很多人以为容器就是Docker。其实,这是个错误的认识,容器世界里并不是只有Docker一家,容器除了Docker外还有CoreOS等。任何技术出现后都需要一个标准来规范它,不然很容易导致技术厂商开发的产品过于独立化,出现大量的冲突和冗余。因此,在2015年,由Google、Docker、CoreOS、IBM、微软、红帽等厂商联合发起了OCI(Open Container Initiative)组织,并于2016年4月推出了第一个开放容器标准。该标准主要包括运行时(Runtime)标准和镜像(Image)标准。这一标准的推出,为容器市场带来稳定性,让企业能更加放心地采用容器技术。用户在打包、部署应用程序后,可以自由选择不同的容器运行时。同时,镜像打包、建立、认证、部署、命名也都能按照统一的规范进行。
下面分别对两种标准包含的内容进行介绍。
1.容器运行时标准(Runtime Spec)
1)creating:使用create命令创建容器,这个过程称为创建中。
2)created:容器创建出来,但是还没有运行,表示镜像和配置没有错误,容器能够在当前平台运行。
3)running:容器的运行状态,里面的进程处于up状态(打开状态),正在运行用户设定的任务。
4)stopped:容器运行完成,或者运行出错,或者执行stop命令之后容器处于暂停状态。这个状态下,容器还有很多信息保存在平台中,并没有完全被删除。
2.容器镜像标准(Image Spec)
1)文件系统:以层级保存的文件系统,每层保存了与上一层之间有变化的部分,如增加、修改和删除的文件等。
2)config文件:保存了文件系统的层级信息(每个层级的哈希值、历史信息)以及容器运行时需要的一些信息(如环境变量、工作目录、命令参数、mount列表),指定了镜像在某个特定平台和系统的配置。比较接近我们使用docker inspect<image_id>命令看到的内容。
3)manifest文件:镜像的config文件索引,记录了layer信息、额外的annotation信息。manifest文件中保存了很多和当前平台有关的信息。
4)index文件:可选文件,指向不同平台的manifest文件,这个文件能保证镜像跨平台使用,每个平台拥有不同的manifest文件,使用index作为索引。
1.1.4 容器的主要应用场景
容器技术主要解决了PaaS层技术实现的问题,而OpenStack、CloudStack这样的技术解决了IaaS层的问题。容器技术主要应用在哪些场景呢?下面对目前主流的4种应用场景进行介绍。
1.提高现有应用的安全性和可移植性
许多企业都在使用较旧的应用系统服务客户,随着当前技术的迭代更新,陈旧系统的安全性和移植性都存在很大的问题。通过容器技术可以增强应用的安全性,即使是大规模的单体应用,也可以实现移植,从而降低应用开发和维护成本。容器化之后,这些应用可以扩展额外的服务或者转移到微服务架构之上。
2.使用自动化部署提升交付速度
现代化开发流程速度快、持续性强且具备自动运行能力,最终目标是开发出更加可靠的软件。通过持续集成(CI)和持续部署(CD),开发人员嵌入代码并通过测试之后,IT团队将新代码集成。作为开发运维的基础,CI/CD创造了一种实时反馈回路机制,持续传输小型迭代,从而加速软件迭代、提高发布质量。CI环境通常是完全自动化的,通过git推送命令触发测试,测试成功后自动构建新镜像,然后推送到Docker镜像库。通过后续的自动化运行,可以将新镜像的容器部署到预演环境,从而进一步测试。
3.微服务加速应用架构现代化进程
应用架构正在从采用瀑布模型开发法的单体代码库转变为独立开发和部署的松耦合服务。成千上万个这样的服务相互连接就形成了应用。Docker允许开发人员选择适合服务的工具或技术栈,通过隔离服务消除彼此潜在的冲突,从而避免“地狱式的矩阵依赖”。这些容器可以独立于应用的其他服务组件,轻松地共享、部署、更新和瞬间扩展。Docker的端到端安全功能让IT团队能够构建和运行最低权限的微服务模型,并创建和访问服务所需的资源(其他应用、涉密信息、计算资源等)。
4.充分利用基础设施节省资金
Docker和容器有助于优化IT基础设施的利用率和成本。优化不仅仅是指节约成本,还要确保在适当的时间有效地使用适当的资源。容器是一种轻量级的打包和隔离应用工作负载的方法,所以Docker允许在同一物理或虚拟服务器上毫不冲突地运行多项工作负载。企业可以整合数据中心,将并购而来的IT资源进行整合,从而获得云端的迁移性,同时减少操作系统和服务器的维护工作。
通过本节的学习,我们对容器的特点、运行时标准、应用场景有了大致的了解。使用好容器,可以提升应用交付速度和节省成本,同时还能提高应用安全性和可移植性,总之好处多多。使用好容器的前提,是对容器有深入的了解,接下来我们将详细介绍最主流的容器技术Docker的方方面面。