深入浅出Docker
上QQ阅读APP看书,第一时间看更新

第一部分 Docker概览

第1章 容器发展之路

现在容器无疑成为了一种潮流,为了让读者更加全面地了解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)或者云平台之间的迁移要远比想象中困难。

1.4 你好,容器!

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

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

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

1.5 Linux容器

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

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

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


 

注:  

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


 

1.6 你好,Docker!

本书会在第2章中讨论更多有关Docker的细节。但在这里,不得不感叹Docker确实是使Linux容器技术得到广泛应用的技术。换个角度来说,是Docker这家公司使容器变得简单。

1.7 Windows容器

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

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

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

本书修订版的大部分练习都包含了Linux和Windows的示例。

1.8 Windows容器vs Linux容器

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

在本书撰写过程中,在Windows机器上运行Linux容器已经成为可能。例如,Windows版Docker(由Docker公司提供的为Windows 10设计的产品)可以在Windows容器模式和Linux容器模式之间进行切换。这是一个正在快速发展的领域,如果读者想要了解,需要查阅 Docker 最新文档。

1.9 Mac容器现状

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

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

1.10 Kubernetes

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

在本书撰写时,Kubernetes已经采用Docker作为其默认容器运行时(container runtime),包括Kubernetes启动和停止容器,以及镜像的拉取等。但是,Kubernetes也提供了一个可插拔的容器运行时接口CRI。CRI能够帮助Kubernetes实现将运行时环境从Docker快速替换为其他容器运行时。在未来,Kubernetes中的默认容器运行时可能由Docker替换为containerd。关于containerd在本书后续部分有更详细的介绍。

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

可以通过阅读我Kubernetes的图书,以及观看Getting Started with Kubernetes视频课程来进一步了解Kubernetes的相关内容。

1.11 本章小结

在过去,每当业务部门想运行新的应用时,IT部门就需要购买新的服务器来满足需求。接下来VMware的出现终结了这个时代,使得IT部门可以更高效地利用现有的和新的机器资源,产生更大的价值。但即使VMware和虚拟机模型这么优秀的技术,也存在其缺点。在VMware和Hypervisor成功之后,出现了更高效并且更轻量级的虚拟化技术——容器。但容器技术在发展之初是很难应用于生产环境的,并且只在拥有Linux内核工程师的Web巨头的数据中心内才能看到实际应用。接下来Docker公司出现了,突然之间容器虚拟化技术开始被大众广泛使用。

说到Docker,接下来就请读者跟随本书一起,来了解Docker是什么,以及为什么要使用Docker吧!