从 2013 年发布至今,Docker 一直保持着旺盛的生命力。Docker 选择容器作为核心和基础,依靠容器技术支撑的 Docker 迅速成为国内外各大云计算厂商和开发者手中的至宝。

云计算平台

云计算时代蕴育出了众多的云计算平台,虽然在服务类型后平台功能上有所差异,但他们的本质上如出一辙,都与 NIST 对于云计算平台的定义有着密切的关系。

云计算是一种资源服务模式,能便捷按需地将资源(网络、服务器、存储、应用及服务)快速供应并释放。

经典云计算架构包括 IaaS(Infrastructure as a Service,基础设施即服务)、PaaS(Platform as a Service,平台即服务)、SaaS(Software as a Service, 软件即服务)三层。

云计算分层

  • IaaS 层为基础设施运维人员服务,提供计算、存储、网络及其他基础资源,云平台使用者可以在上面部署和运行包括操作系统和应用程序在内的任意软件,无需再为基础设施的管理而分心。
  • PaaS 层为应用开发人员服务,提供支撑应用运行所需的软件运行环境、相关工具与服务,如数据库服务、日志服务、监控服务、服务发现等,让应用开发者可以专注于核心业务的开发。
  • SaaS 层为一般用户服务,提供了一套完整可用的软件系统,让一般用户无需关注技术细节,只需要通过浏览器、应用客户端等方式就能使用部署在云上的应用服务。

同时,随着计算机技术推陈出新,应用的规模愈发庞大,逻辑愈发复杂,迭代更新愈发频繁,应用开发所需的统一规范和原有开发模式杂乱无章成了追求进步的主要障碍。在尖锐的矛盾中,云时代应用生命周期管理机制(Application Lifecycle Management,ALM)和十二要素应用规范[1] (The Twelve-Factor App)应运而生。

所有理论设计和预想一定是美好的。IaaS 的发展主要以虚拟机为最小粒度的资源调度单位,出现了资源利用率低、调度分发缓慢、软件栈环境不统一等一系列问题。PaaS 在 IaaS 基础上发展而来,众多 PaaS 已经意识到可以利用容器技术解决资源利用率问题,但是 PaaS 通常在应用架构选择、支持的软件环境服务方面有较大的限制,这带来了应用于平台无法解耦、应用运行时环境局限性强、运维人员控制力下降的问题。

可见不论 IaaS 还是 PaaS 都有各自适用的场景,但依旧存在诸多缺陷,人们亟需一个真正可用的解决方案。

容器,新的革命

每一场革命背后都有着深刻的历史背景和矛盾冲突,新陈代谢是历史的必然结果,新生取代陈旧得益于理念的飞跃和对时代发展需求的契合,很显然 Docker 抓住了这个契机。

Docker 是什么?

根据官方的定义,Docker 是以 Docker容器为资源分隔和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。它是一个跨平台、可移植并且简单易用的容器解决方案。Docker 的源代码托管在Github 上,基于 Go 语言开发并遵从 Apache 2.0 协议。Docker 可以在容器内部快速自动化的部署应用,并通过操作系统内核技术(namespace、cgroups 等)为容器提供资源隔离与安全保障。

比较容器和虚拟机[2]

容器

容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比 VM 少(容器映像的大小通常为几十 MB),可以处理更多的应用程序,并且需要更少的 VM 和操作系统。

容器应用

虚拟机

虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。管理程序允许多台 VM 在单台机器上运行。每个 VM 都包含操作系统的完整副本,应用程序,必要的二进制文件和库,这带来体积巨大(占用数十 GB是常态);在启动速度上,虚拟机也可能很慢。

虚拟机

容器 x 虚拟机

现在,将容器和虚拟机结合起来使用, 为部署和管理应用程序提供了极大的灵活性。

容器和虚拟机一起

容器技术的好处

容器技术的生态系统自下而上分别覆盖了 IaaS 层和 PaaS 层所涉及的各类问题,包括资源调度、编排、部署、监控、配置管理、存储网络管理、安全、容器化应用支撑平台等。除了基于容器技术解决构建分布式平台无法回避的经典问题,容器技术主要带来了以下几点好处:

持续部署与测试

容器消除了线上线下环境差异,保证了应用生命周期的环境一致性和标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移,由此,测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程。

跨云平台支持

容器带来的最大好处之一就是其适配性,越来越多的云平台都支持容器,用户再也无需担心受到云平台的捆绑,同时也让应用多平台混合部署成为可能。目前支持容器的国外 IaaS 云平台包括但不限于亚马逊云平台(AWS)、Google 云平台(GCP)、微软云平台(Azure)、OpenStack 等,国内 IaaS 云台包括但不限于阿里云、腾讯云、华为云、金山云等等云厂商。还包括如 Chef、Puppet、Ansible 等配置管理工具。

容器技术生态系统

环境标准化和版本控制

基于容器提供的环境一致性和标准化,你可以使用 Git 等工具对容器镜像进行版本控制,相比基于代码的版本控制来说,你还能够对整个应用运行环境实现版本控制,一旦出现故障可以快速回滚。相比以前的虚拟机镜像,容器压缩和备份速度更快,镜像启动也像启动一个普通进程一样快速。

高资源利用率与隔离

容器没有管理程序的额外开销,与底层共享操作系统,性能更加优良,系统负载更低,在同等条件下可以运行更多的应用实例,可以更充分的利用系统资源。同时,容器拥有不错的资源隔离与限制能力,可以精确的对应用分配 CPU、内存等资源,保证了应用见不会相互影响。

容器跨平台性与镜像

Linux 容器虽然早在 Linux2.6 版本内核已经存在,但是缺少容器的跨平台性,难以推广。容器在原有 Linux 容器的基础上进行大胆革新,为容器设定了一整套标准化的配置方法,将应用及其依赖的运行环境打包成镜像,真正实现了「构建一次,到处运行 」的理念,大大提高了容器的跨平台性。

易于理解且易用

Docker 的英文原意是处理集装箱的码头工人,标志是鲸鱼运送一大堆集装箱,集装箱就是容器,生动好记,易于理解。一个开发者可以在 15 分钟之内入门 Docker 并进行安装和部署,这是容器使用史的一次飞跃。因为他的易用性,有更多的人开始关注容器技术,加速了容器标准化的步伐。

应用镜像仓库

Docker 官方构建了一个镜像仓库,组织和管理形式类似于 Github,其上已经累积了成千上万的镜像。因为 Docker 的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由的下载微服务组件,这位开发者提供了巨大便利。

进化从容器到容器云

容器为用户打开了一扇通往新世界的大门,真正进入这个容器的世界后,却发现新的生态系统如此庞大。在生产和使用中,不论是个人还是企业,都会提出更复杂的需求。这时,我们需要众多跨主机的容器协同工作,需要支持各种类型的工作负载,企业级应用开发更是需要基于容器技术,实现支持多人协作的持续集成、持续交付平台。即使 Docker 只需要一条命令便可启动一个容器,一旦试图将其推广到软件开发和生产环境中,麻烦便层出不穷,容器相关的网络、存储、集群、高可用等就是不得不面对的问题。从容器到容器云的进化应运而生。

什么是容器云

容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。当容器云专注于资源共享与隔离、容器编排与部署时,它更接近传统的 IaaS;当容器云渗透到应用支撑与运行时环境时,它更接近传统的 PaaS。

容器云并不仅限于 Docker,基于 rkt 容器的 CoreOS 项目也是容器云。Docker 的出现让人们意识到了容器的价值,使得一直以来长期存在但并未被重视的轻量级虚拟化技术得到快速的发展和应用。

参考资料


  1. 1.十二要素应用规范 https://12factor.net/zh_cn/
  2. 2.容器、虚拟机 https://www.docker.com/resources/what-container

Comments