欢迎来到容器的世界!如今,容器技术已经无处不在。在这一部分,我们将一起探索容器的起源、它的价值所在,以及我们能在哪些场景中运用它。

在过去,大多数应用程序都运行在服务器上。然而,那时的技术,无论是Windows还是Linux系统,都无法安全、可靠地在同一台服务器上运行多个应用。
这就造成了一个颇为尴尬的局面:每当业务部门需要上线一个新应用时,IT部门就得去采购一台全新的服务器。更麻烦的是,没人能准确预估新应用的性能需求,IT部门只能凭感觉去猜测该买什么型号、什么配置的服务器。
为了避免应用程序因性能不足而影响业务,甚至流失客户,IT部门只能选择购买那些价格昂贵、性能强大的服务器。毕竟,谁也不想背上“服务器性能差”的黑锅。但这样做的结果是,这些高性能服务器的利用率极低,常常只有5%到10%,造成了公司资金和能源的巨大浪费。
就在这样的背景下,VMware公司为世界带来了一份厚礼——虚拟机(VM)。 几乎在一夜之间,世界变得美好了。我们终于有了一种技术,可以在一台服务器上安全地运行多个商业应用。这无疑是IT界的一场狂欢!
虚拟机的出现彻底改变了游戏规则。IT部门再也无需为每个新应用都去采购一台全新的、配置过剩的服务器。很多时候,他们完全可以利用现有服务器的空闲资源来部署新应用。 突然之间,我们能够从公司现有的IT资产中压榨出巨大的价值,大大提升了资金的使用效率。
但是,凡事总有但是!虚拟机虽然出色,却远非完美。它最大的一个问题是,每台虚拟机都需要一个完整的、独立的操作系统(OS)。 这意味着每个操作系统都会消耗CPU、内存等本可以用来支持更多应用的宝贵资源。不仅如此,每个操作系统都需要定期打补丁、做监控,有时还需要购买昂贵的许可证。这些都带来了额外的时间和资源成本。
此外,虚拟机模型还有其他挑战。它们的启动速度很慢,可移植性也不尽人-意——想要在不同的虚拟化平台或云服务商之间迁移虚拟机,远比想象中要困难。
为了解决虚拟机模型的种种弊端,像谷歌这样的大型互联网公司很早就开始使用容器技术了。 在容器模型中,容器的角色与虚拟机有些相似,但有一个根本性的区别:容器不需要自带完整的操作系统。实际上,同一台主机上的所有容器共享主机的操作系统。
这一改变释放了大量的系统资源,如CPU、内存和存储空间。同时也减少了操作系统的授权费用,以及打补丁、维护等管理开销。最终,无论在时间、资源还是资金上,都实现了显著的节约。 容器的另一大优势是启动速度极快,并且拥有超高的可移植性。你可以轻松地将一个容器化的应用从你的笔记本电脑,迁移到云端,再部署到数据中心里的虚拟机或物理机上,整个过程如丝般顺滑。
现代容器技术起源于Linux世界,是无数开发者长期努力的结晶。例如,谷歌就为Linux内核贡献了许多与容器相关的关键技术。没有这些贡献,我们今天所熟知的容器便无从谈起。 近年来推动容器技术飞速发展的几项核心技术包括:内核命名空间(Kernel Namespaces)、控制组(Control Groups)和权能(Capabilities)。当然,还有我们不得不提的Docker。
值得一提的是,在Docker和现代容器技术出现之前,就已经存在许多类似的操作系统虚拟化技术,有些甚至可以追溯到大型机时代的System/360。 例如,BSD Jails和Solaris Zones就是类Unix系统中著名的“容器”技术。不过,在本教程中,我们主要聚焦于由Docker普及开来的现代容器技术。
尽管容器技术的基础早已奠定,但在很长一段时间里,它依然复杂难用,大多数企业都望而却步。直到Docker的出现,才真正打破了这一僵局,让容器技术变得平易近人,飞入寻常百姓家。
我们将在下一部分更详细地探讨Docker。但现在,你只需要知道,是Docker施展了魔法,让普通人也能轻松使用Linux容器。换句话说,Docker公司让容器变得简单!
微软也为将Docker和容器技术引入Windows平台付出了巨大的努力。
截至目前,Windows的桌面和服务器平台都支持以下两种容器:
Windows容器用于运行那些需要Windows内核的Windows应用。所有现代版本的Windows(如Windows 10/11和Windows Server)都原生支持Windows容器。 而任何安装了WSL 2(Windows Subsystem for Linux)的Windows主机,也都可以运行Linux容器。这使得Windows 10和11成为了一个绝佳的开发与测试平台,可以同时处理Windows和Linux容器。
然而,尽管微软在Windows容器上投入了大量心血,但目前绝大多数的容器仍然是Linux容器。这是因为Linux容器更小、更快,并且拥有更庞大的工具生态系统。本课程中的所有示例都将使用Linux容器。
Windows容器 vs. Linux容器
必须理解一个核心要点:容器共享其所在主机的内核。这意味着,Windows容器化的应用需要运行在拥有Windows内核的主机上,而Linux容器化的应用则需要Linux内核的主机。
但事情并非总是如此绝对。如前所述,借助WSL 2,我们可以在Windows机器上运行Linux容器。
目前,并没有所谓的“Mac容器”。但是,你可以通过Docker Desktop在Mac上运行Linux容器。它的工作原理是在你的Mac上无缝地运行一个轻量级的Linux虚拟机,然后在其中运行容器。 这种方式深受开发者欢迎,因为它使得在Mac上开发和测试Linux容器变得异常简单。
Kubernetes是源于谷歌的一个开源项目,它已迅速成为容器化应用编排领域的“事实标准”。说白了,Kubernetes就是目前最流行的,用来部署和管理容器化应用的工具。
“容器化应用”指的是以容器形式运行的应用程序。
过去,Kubernetes默认使用Docker作为其容器运行时——也就是负责拉取镜像、启动和停止容器的底层技术。然而,现代的Kubernetes集群采用了一种可插拔的容器运行时接口(CRI),使得更换不同的容器运行时变得非常容易。
目前,大多数新的Kubernetes集群都使用containerd作为运行时。
我们曾生活在一个“一个应用一台服务器”的时代。后来,VMware的出现让我们能够从IT资产中获得更多价值。然而,虚拟机模型并非完美无缺。 紧随其后,一种更高效、更便携的虚拟化技术——容器,应运而生。但起初,容器技术非常复杂,只有那些拥有顶尖Linux内核工程师的大型互联网公司才能驾驭。最后,Docker的出现,让容器技术变得简单易用,普及到了大众开发者手中。
说起Docker... 让我们在下一部分一探究竟,看看它究竟是何方神圣!