你如果参加过近两年的开发者大会,那肯定听说过容器(Container):Docker、Kubernetes、Mesos,以及其他许多容器的名字。微软、谷歌、亚马逊,以及其他所有公司都在争着搭上这辆车……
为何所有人都对容器趋之若鹜?
为了理解容器的重要性,让我们先来看看实体容器。当代运输业得以快速发展是因为我们对集装箱尺寸进行了标准化。在集装箱标准诞生之前,各类大宗运输都非常复杂且耗时耗力。例如,可以想象一下,在没有集装箱的情况下,你该如何从一艘装满智能手机的船上把货物搬下来装上卡车?我们所知的就是,有了标准集装箱,一切都方便多了。
软件容器带来的优势也类似。你不必传送整个操作系统和软件,只需将你的代码和依赖包打包至可以随处运行的容器即可。由于容器的尺寸通常很小,因此你可以将多个容器保存在一台计算机中。
那么,容器的重要性何在?在容器得到广泛接受之前,有虚拟机技术来帮助单一服务器运行多个互不相关的应用。这样的技术推动了第一代云计算应用(甚至网络主机服务)的发展。如果你需要为每个应用准备一台服务器,那么成本将会非常高昂。
然而,虚拟机的运行方式是将操作系统和代码打包在一起。虚拟机操作系统认为自身独占了一台服务器,但实际上一台服务器被多个虚拟机所共享。所有这些虚拟机都运行自主的操作系统,且互不了解。服务器的主机操作系统确保所有这些“访客”认为,它们是最重要的用户。
你可以看到这其中的问题。作为访客的虚拟机运行在模拟的服务器上,这带来了许多额外开支,导致系统性能变慢(但好处在于,你可以在单一服务器上运行多个操作系统。)
以货运容器作为类比,这就类似于一个巨大的集装箱货船,其中有许多小舱位,可以搭载小型的特殊集装箱货船。
容器有很大不同。容器中只包含应用,以及所依赖的库和框架。你可以将许多容器放在单一主机操作系统中。服务器的唯一操作系统就是主机操作系统,而容器直接搭载在主机操作系统上,能够与其直接通信。这确保了容器的尺寸较小,额外开支的降低。
在访客和主机操作系统之间,虚拟机使用所谓的“hypervisors”作为模拟的一层。对容器来说,类似的机制是容器引擎,其中 Docker Engine 是目前最热门的一种。
在很久之前,容器就是 Linux 系统的核心功能,但用起来很麻烦。Docker 的关键就是让容器变得更简单,开发者可以迅速利用容器。
容器帮助开发者更好地知道,他们的软件将会如何运行,无论软件安装在何处。容器也常常带来“微型服务”。开发者不需要再提供一款大型应用。通过微型服务,应用可被分解成为多个能相互通信的小部分。这意味着,不同团队可以专注于应用的不同部分,而只要这些应用的互动方式没有明显变化,那么团队就可以相互独立工作。这使软件开发的速度更快,测试变得更简单。
为了管理所有这些容器,你需要另一套专用软件,例如 Kubernetes(最初来自谷歌)。这样的软件帮助你将所有容器推送至不同机器,确保容器能正常运行,当需求上升时可以为应用加入更多容器。如果你希望容器了解彼此,那么仍需要通过某种方式搭建虚拟网络。这样的虚拟网络会为每个容器分配 IP 地址。
容器可以运行各类应用,但容器与虚拟机存在明显不同。许多企业仍在使用的较老软件无法迁移至这种模式,而虚拟机帮助你将老应用转移至云计算服务,例如亚马逊 AWS 和微软 Azure。因此,即使容器有着多方面的优势,虚拟机也不会在短期内消亡。