【云原生】容器发展之路与 Docker 简介


前言

 现在容器无疑成为了一种潮流,为了让读者更加全面地了解 Docker,本文就从容器的发展之路开始娓娓道来。

一、容器的发展之路

1.1 落后的旧时代

 业务是基于应用(Application)运转的。如果应用出现故障,业务也就无法正常运行,甚至会导致商业公司的破产。这种情况是真实的,甚至每天都在发生。

 大部分应用是运行在服务器之上的。曾经,每个服务器只能运行单一应用。Windows 和 Linux 操作系统都没有相应的技术手段来保证在一台服务器上稳定而安全地同时运行多个应用。

 在那个时代,经常会出现这样一幕:每次业务部门想要增加一个新的应用时,IT 部门就需要去采购一个新的服务器。大部分情况下,没有人知道新增应用所需的服务器性能究竟是怎样的,这意味着 IT 部门需要凭借经验去猜测所购买的服务器型号和规格。

 因此,IT 部门在采购的时候就不得不买那些性能大幅优于业务需求的服务器。毕竟无论是 IT 部门还是业务部门,都不想看到服务器性能不足的情况出现。因为服务器性能不足,可能会导致某些交易失败,而交易失败会使得公司客户流失、收益下降,所以 IT 部门通常采购的都是更大、更好的服务器。这种做法导致了大部分服务器长期运行在他们额定负载 5%~ 10% 的水平区间之内。这对公司资产和资源是一种极大的浪费!

1.2 你好,VMware

 为了解决上面的问题,VMware 公司给全世界带来了一个礼物——虚拟机(VM)。然后几乎是一夜之间,世界就变得美好了!人们终于拥有了一种允许多应用能够稳定、安全地同时运行在一个服务器中的技术。

 虚拟机是一种具有划时代意义的技术!每当业务部门需要增加应用的时候,IT 部门无须采购新的服务器。取而代之的是,IT 部门会尝试在现有的,并且有空闲性能的服务器上部署新的应用。

 突然之间,人们发现这种技术能够让现有的资产(如服务器)拥有更大的价值,从而最终为公司节省大量的资金支出。

1.3 虚拟机的不足

 但是……总有这么一个但是!就连 VM 这么伟大的技术,也远未做到十全十美!

 实际上,虚拟机最大的缺点就是依赖其专用的操作系统(OS)。OS 会占用额外的 CPU、RAM 和存储,这些资源本可以用于运行更多的应用。每个 OS 都需要补丁和监控。另外在某些情况下,OS 需要许可证才能运行。这对运营成本(OPEX)和资金性支出(CAPEX)都是一种浪费。

 虚拟机技术也面临着一些其它挑战。比如虚拟机启动通常比较慢,并且可移植性比较差——虚拟机在不同的虚拟机管理器(Hypervisor)或者云平台之间的迁移要远比想象中困难。

二、你好,容器

 长期以来,像谷歌(Google)这样的大规模 Web 服务(Big Web-Scale)玩家一直采用容器(Container)技术解决虚拟机模型的缺点。

 容器模型其实跟虚拟机模型相似,其主要的区别在于,容器的运行不会独占操作系统。实际上,运行在相同宿主机上的容器是共享一个操作系统的,这样就能够节省大量的系统资源,如 CPU、RAM 以及存储。容器同时还能节省大量花费在许可证上的开销,以及为 OS 打补丁等运维成本。最终结果就是,容器节省了维护成本和资金成本。

 同时容器还具有启动快和便于迁移等优势。将容器从笔记本电脑迁移到云上,之后再迁移到数据中心的虚拟机或者物理机之上,都是很简单的事情。

2.1 Linux 容器

 现代的容器技术起源于 Linux,是很多人长期努力持续贡献的产物。举个例子,Google LLC 就贡献了很多容器相关的技术到 Linux 内核当中。没有大家的贡献,就没有现在的容器。

 近几年来,对容器发展影响比较大的技术包括内核命名空间(Kernel Namespace)、控制组(Control Group)、联合文件系统(Union File System),当然更少不了 Docker 。再次强调一遍,当今的容器生态环境很大程度上受益于强大的基金会,而基金会是由很多独立开发者以及公司组织共同创建并维护的。感谢你们!

 虽然容器技术已经如此出色,但对于大部分组织来说,容器技术的复杂度是阻止其实际应用的主要原因。直到 Docker 技术横空出世,容器才真正被大众所接受。

注:

有很多跟容器类似的操作系统虚拟化技术要早于 Docker 和现代容器技术出现,有些甚至可以追溯到大型机上的 System/360 操作系统当中。BSD Jails 和 Solaris Zones 也是在类 UNIX 操作系统上众所周知的容器化技术。但本实验讨论内容范围主要会限制在由 Docker 主导的现代容器技术之中。

2.2 Windows 容器

 在过去的几年中,微软(Microsoft Corp.)致力于 Docker 和容器技术在 Windows 平台的发展。

 Windows 容器已经能在 Windows 10 和 Windows Server 2016 平台上使用了。为了实现这个目标,微软跟 Docker 公司、社区展开了深入合作。

 实现容器所需的核心 Windows 内核技术被统称为 Windows 容器(Windows Container)。用户空间是通过 Docker 来完成与 Windows 容器之间交互的,这使得 Docker 在 Windows 平台上的使用体验跟在 Linux 上几乎一致。那些熟悉 Linux Docker 工具的研发人员和系统管理员,在切换到 Windows 容器之后也会很快适应。

2.3 Windows 容器 VS Linux 容器

 实现容器所需的核心 Windows 内核技术实现容器所需的核心 Windows 内核技术运行中的容器共享宿主机的内核,理解这一点是很重要的。这意味着一个基于 Windows 的容器化应用在 Linux 主机上是无法运行的。读者也可以简单地理解为 Windows 容器需要运行在 Windows 宿主机之上,Linux 容器(Linux Container)需要运行在 Linux 宿主机上。但是,实际场景要比这复杂得多……

 实现容器所需的核心 Windows 内核技术截至目前,在 Windows 机器上运行 Linux 容器已经成为可能。例如,Windows 版 Docker(由 Docker 公司提供的为 Windows 10 设计的产品)可以在 Windows 容器模式和 Linux 容器模式之间进行切换。这是一个正在快速发展的领域,如果大家想要了解,需要查阅 Docker 最新文档。

2.4 Mac 容器现状

 迄今为止,还没有出现 Mac 容器(Mac Container)。

 但是读者可以在 Mac 系统上使用 Docker for Mac 来运行 Linux 容器。这是通过在 Mac 上启动一个轻量级 Linux VM,然后在其中无缝地运行 Linux 容器来实现的。这种方式在开发人员中很流行,因为这样可以在 Mac 上很容易地开发和测试 Linux 容器。

2.5 Kubernetes

 Kubernetes 是谷歌的一个开源项目,并且开源之后迅速成为容器编排领域的领头羊。有一种很流行的说法:Kubernetes 是保证容器部署和运行的软件体系中很重要的一部分。

 截至目前,Kubernetes 已经采用 Docker 作为其默认容器运行时(container runtime,注意,“容器运行时” 是一个完整概念,这里没有错误),包括 Kubernetes 启动和停止容器,以及镜像的拉取等。但是,Kubernetes 也提供了一个可插拔的容器运行时接口 CRI。CRI 能够帮助 Kubernetes 实现将运行时环境从 Docker 快速替换为其它容器运行时。在未来,Kubernetes 中的默认容器运行时可能由 Docker 替换为 containerd 。

 关于 Kubernetes,大家现在需要了解的就是 —— Kubernetes 是 Docker 之上的一个平台,现在采用 Docker 实现其底层容器相关的操作。

 关于容器技术的图书和探讨总是不可避免地涉及 Docker。但是当有人提到“Docker”时,可能是指如下 3 种概念之一:

  • Docker 公司
  • Docker 的容器运行时和编排引擎
  • Docker 开源项目(Moby)

 如果大家希望在容器的世界中有所作为,那么需要对以上 3 个内容都有所了解。接下来我们来简单了解这些概念。

三、Docker 简介

 Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建、管理和编排容器。Docker 是在 GitHub 上开发的 Moby 开源项目的一部分。Docker 公司,位于旧金山,是整个 Moby 开源项目的维护者。Docker 公司还提供包含支持服务的商业版本的 Docker。

 以上是一个简要介绍。下面针对每个概念进行详细介绍。此外还包含对容器生态的探讨,以及对开放容器计划(Open Container Initiative, OCI)的介绍。

四、Docker 公司

 Docker 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立,其标志如下图所示。

 有意思的是,Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。底层技术上,dotCloud 平台利用了 Linux 容器技术。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为 “Docker”。Docker 就是这样诞生的!

 2013 年,dotCloud 的 PaaS 业务并不景气,公司需要寻求新的突破。于是他们聘请了 Ben Golub 作为新的 CEO,将公司重命名为 “Docker”,放弃 dotCloud PaaS 平台,怀揣着 “将 Docker 和容器技术推向全世界” 的使命,开启了一段新的征程。

 如今 Docker 公司被普遍认为是一家创新型科技公司,据说其市场价值约为 10 亿美元。截止 2018 年,Docker 公司已经通过多轮融资,吸纳了来自硅谷的几家风投公司的累计超过 2.4 亿美元的投资。几乎所有的融资都发生在公司更名为 “Docker” 之后。
在这里插入图片描述
 公司更名为 Docker 之后,进行了几次小规模的未公开价格的收购,来丰富其产品和服务组合。

 截至目前,Docker 公司拥有约 300 ~ 400 名雇员,并举办名为 DockerCon 的年度会议。DockerCon 的目标是聚拢不断发展的容器生态,并促进 Docker 和容器技术的推广。

 本系列文将始终使用 “Docker 公司” 来指代 Docker 这家公司,其它地方出现的 “Docker” 都是指容器技术或开源项目。

注:

“Docker” 一词来自英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。

五、Docker 运行时与编排引擎

 多数技术人员在谈到 Docker 时,主要是指 Docker 引擎。

 Docker 引擎是用于运行和编排容器的基础设施工具。有 VMware 管理经验的读者可以将其类比为 ESXi。ESXi 是运行虚拟机的核心管理程序,而 Docker 引擎是运行容器的核心容器运行时。

 其它 Docker 公司或第三方的产品都是围绕 Docker 引擎进行开发和集成的。如下图所示,Docker 引擎位于中心,其它产品基于 Docker 引擎的核心功能进行集成。

 Docker 引擎可以从 Docker 网站下载,也可以基于 GitHub 上的源码进行构建。无论是开源版本还是商业版本,都有 Linux 和 Windows 版本。

 Docker 引擎主要有两个版本:企业版(EE)和社区版(CE)。每个季度,企业版和社区版都会发布一个稳定版本。社区版本会提供 4 个月的支持,而企业版本会提供 12 个月的支持。

 社区版还会通过 Edge 方式发布月度版。
在这里插入图片描述
 从 2017 年第一季度开始,Docker 版本号遵循 YY.MM-xx 格式,类似于 Ubuntu 等项目。例如,2018 年 6 月第一次发布的社区版本为 18.06.0-ce。

注:

2017 年第一季度以前,Docker 版本号遵循 [大版本号.小版本号] 的格式。采用新格式前的最后一个版本是 Docker 1.13。

六、Docker 开源项目(Moby)

 “Docker” 一词也会用于指代开源 Docker 项目。其中包含一系列可以从 Docker 官网下载和安装的工具,比如 Docker 服务端和 Docker 客户端。不过,该项目在 2017 年于 Austin 举办的 DockerCon 上正式命名为 Moby 项目。由于这次改名,GitHub 上的 docker/docker 库也被转移到了 moby/moby,并且拥有了项目自己的 Logo,如图下图所示:

在这里插入图片描述

 Moby 项目的目标是基于开源的方式,发展成为 Docker 上游,并将 Docker 拆分为更多的模块化组件。Moby 项目托管于 GitHub 的 Moby 代码库,包括子项目和工具列表。核心的 Docker 引擎项目位于 GitHub 的 moby/moby,但是引擎中的代码正持续被拆分和模块化。

 作为一个开源项目,其源码是公开可得的,在遵循 Apache 协议 2.0 的情况下,任何人都可以自由地下载、贡献、调整和使用。

 如果查看项目的提交历史,可以发现其中包含来自如下公司的基础技术:红帽、微软、IBM、思科,以及 HPE。此外,还可以看到一些并非来自大公司的贡献者。

 多数项目及其工具都是基于 Go 语言编写的,这是谷歌推出的一种新的系统级编程语言。使用 Go 语言的读者,将更容易为该项目贡献代码。

 Mody/Docker 作为开源项目的好处在于其所有的设计和开发都是开放的,并摒弃了私有代码闭源开发模式下的陈旧方法。因此发布过程也是公开进行的,不会再出现某个秘密的版本提前几个月就宣布要召开发布会和庆功会的荒唐情况。Moby/Docker 不是这样运作的,项目中多数内容都是开放并欢迎任何人查看和作出贡献的。

 Moby 项目以及更广泛的 Docker 运动一时间掀起了一波热潮。GitHub 上已经有数以千计的提交请求(pull request),以及数以万计的基于容器化技术的项目了,更不用说 Docker Hub 上数十亿的镜像下载。Moby 项目已经给软件产业带来了翻天覆地的变化。

 这并非妄想,Docker 已经得到了广泛的应用!

七、容器生态

 Docker 公司的一个核心哲学通常被称为“含电池,但可拆卸”(Batteries included but removable)。

 意思是许多 Docker 内置的组件都可以替换为第三方的组件,网络技术栈就是一个很好的例子。Docker 核心产品内置有网络解决方案。但是网络技术栈是可插拔的,这意味着 Docker 内置的网络方案可以被替换为第三方的方案。许多人都会这样使用。

 早期的时候,经常出现第三方插件比 Docker 提供的内置组件更好的情况。然而这会对 Docker 公司的商业模式造成冲击。毕竟,Docker 公司需要依靠盈利来维持基业长青。因此,“内置的电池”变得越来越好用了。这也导致了生态内部的紧张关系和竞争的加剧。

 简单来说,Docker 内置的“电池”仍然是可插拔的,然而越来越不需要将它们移除了。

 尽管如此,容器生态在一种良性的合作与竞争的平衡中还是得以繁荣发展。在谈及容器生态时,人们经常使用到诸如 “co-opetition” 与 “frenemy” 这样的字眼。这是一个好现象!因为良性的竞争是创新之母。

七、开放容器计划

 如果不谈及开放容器计划(The Open Container Initiative, OCI)的话,对 Docker 和容器生态的探讨总是不完整的。下图所示为 OCI 的 Logo。

在这里插入图片描述

 OCI 是一个旨在对容器基础架构中的基础组件(如镜像格式与容器运行时,如果对这些概念不熟悉的话,不要担心,本课程后续会介绍到它们)进行标准化的管理委员会。

 同样,如果不谈历史的话,对 OCI 的探讨也是不完整的。和所有的历史记录一样,其版本取决于谁来讲述它。所以,以下是我眼中的容器历史。

 我讲述的这段简短的历史是,一个名为 CoreOS 的公司不喜欢 Docker 的某些行事方式。因此它就创建了一个新的开源标准,称作 “appc”,该标准涉及诸如镜像格式和容器运行时等方面。此外它还开发了一个名为 rkt(发音 “rocket”)的实现。

 两个处于竞争状态的标准将容器生态置于一种尴尬的境地。

 这使容器生态陷入了分裂的危险中,同时也令用户和消费者陷入两难。虽然竞争是一件好事,但是标准的竞争通常不是。因为它会导致困扰,降低用户接受度,对谁都无益。

 考虑到这一点,所有相关方都尽力用成熟的方式处理此事,共同成立了 OCI —— 一个旨在管理容器标准的轻量级的、敏捷型的委员会。

 截至目前,OCI 已经发布了两份规范(标准):镜像规范和运行时规范。

 提到这两项标准时,经常用到的比喻就是铁轨。它们就像对铁轨的尺寸和相关属性达成一致,让所有人都能自由地建造更好的火车、更好的车厢、更好的信号系统、更好的车站等。只要各方都遵循标准就是安全的。没人会希望在铁轨尺寸问题上存在两个相互竞争的标准!

 公平地说,这两个 OCI 规范对 Docker 的架构和核心产品设计产生了显著影响。Docker 1.11 版本中,Docker 引擎架构已经遵循 OCI 运行时规范了。

 到目前为止,OCI 已经取得了不错的成效,将容器生态团结起来。然而,标准总是会减慢创新的步伐!尤其是对于超快速发展的新技术来说更是如此。这在容器社区引起了热烈的讨论。以我之见,这是好事!容器技术正在重塑世界,走在技术前列的人们有热情、有想法,这很正常。期待关于标准和创新有更加热烈的讨论!

 OCI 在 Linux 基金会的支持下运作,Docker 公司和 CoreOS 公司都是主要贡献者。

总结

 在过去,每当业务部门想运行新的应用时,IT 部门就需要购买新的服务器来满足需求。接下来 VMware 的出现终结了这个时代,使得 IT 部门可以更高效地利用现有的和新的机器资源,产生更大的价值。但即使 VMware 和虚拟机模型这么优秀的技术,也存在其缺点。

 在 VMware 和 Hypervisor 成功之后,出现了更高效并且更轻量级的虚拟化技术——容器。但容器技术在发展之初是很难应用于生产环境的,并且只在拥有 Linux 内核工程师的 Web 巨头的数据中心内才能看到实际应用。接下来 Docker 公司出现了,突然之间容器虚拟化技术开始被大众广泛使用。

 说到 Docker,接下来就请大家跟随本课程一起,来了解 Docker 是什么,以及为什么要使用 Docker 吧!

 本节介绍了 Docker 公司,这是一家位于旧金山的立志于变更软件行业的科技创业公司。可以说他们是现今容器革命的先行者和推动者。但是现在已经形成了一个由作者和竞争者组成的大型生态。

 Docker 项目是开源的,其上游源码位于 GitHub 的 moby/moby 库。

 开放容器计划(OCI)在容器运行时格式和容器镜像格式的标准化方面发挥了重要作用。

猜你喜欢

转载自blog.csdn.net/weixin_44009656/article/details/125089334