容器如何改变世界

2025-06-07

容器如何改变世界

很久很久以前,在一个不太遥远的地方,计算机上的所有程序都共存。它们共享相同的资源和权限。如果幸运的话,操作系统会公平地为每个任务分配 CPU 时间。如果运气不好,它们就必须等待竞争任务让路。

有些任务需要 root 权限,无论是否值得。有些任务则有复杂的依赖关系。至关重要的是,对于我们开发者来说,某个框架、库或工具经常会要求依赖与我们在其他地方需要的其他框架、库或工具所需的版本不兼容的依赖项。

这是一段黑暗的时期,朋友。

然后就有一个解决方案:容器。

那么容器到底是什么呢?

在微服务盛行、开发人员在生态系统中创建生态系统的世界里(哟,伙计,我听说你喜欢生态系统,所以我为你的生态系统创建了一个生态系统,这样你就可以在生态系统的同时进行生态系统),你几乎肯定会使用容器。

任何有关集装箱运输的文章都需要有集装箱照片

说到容器,你可能会想到开发笔记本上的 Docker 或云端的 Kubernetes。如今,人们很容易将计算机能够整齐安全地划分开来视为理所当然。虽然有一两个名字帮助这项技术成为主流,但容器的历史远比 Docker 在 2013 年推出时要久远得多。

事实上,这个世界发展得太快了,我们几乎抑制不住自己的兴奋!(抱歉)

ch容器的根

早在 1979 年,Unix 第七版就引入了 chroot。

chroot 的目的是将进程的目录更改为文件系统中的其他位置。这与我们今天所理解的容器化并不完全一样。它没有分离 CPU 时间或内存。因此,chroot 从技术上来说并非虚拟的,因为进程的文件只是被“转置”到了另一个位置。尽管如此,以这种方式更改文件位置比让所有内容都运行在同一个根目录下更安全。

思考 chroot 的一种方法就是想象在高速公路上行驶。

夜间高速公路的延时照片

每辆车都必须与所有同向行驶的其他车辆共享一套资源(高速公路)。然而,有两个惯例可以防止这些车辆相互碰撞:一是与前车保持安全距离,二是高速公路被划分成车道。车道意味着更多的车辆可以安全地占用同一块高速公路。然而,只有当所有人都遵守规则时,车道才能发挥作用:没有物理屏障。chroot 与之类似,只是根据惯例,一个进程不会窥视分配给其他进程的空间。

不良行为将导致入狱

chroot 很受欢迎。1982 年,Unix 的 BSD 重制版实现了它,从而获得了更广泛的应用。18 年后,也就是 2000 年,同名的 FreeBSD 推出了 Jails,将这一概念更进一步。

空荡荡的牢房

Jails 这个名字并非偶然。chroot 的一个弱点是,行为不端的进程很容易脱离其目录,并开始干扰其他 chroot。即使文件系统受 chroot 保护,网络、内存和其他资源仍然会在进程之间共享。

相反,Jails 更接近于主机操作系统的完全虚拟化。它们拥有自己的超级用户、文件、进程 ID、主机名和 IP 地址。这使得首次尝试和破坏程序变得更容易,而不必担心主机受到威胁。这也使得在一个 Jails 中运行的进程更难以访问其他 Jails 中正在运行的任何程序。

大约四年后,Sun Microsystems 在其 Solaris Unix 类操作系统中添加了一些类似的功能,并将其称为 Zones。

然而,到那时,世界正越来越多地转向 Linux。Linux 管理员、开发人员和用户羡慕不已,因为他们看到 FreeBSD 和 Solaris 能够安全地隔离他们的机器。这推动了 Docker 的技术发展。

等等,虚拟机怎么样?

现在你可能会想:“这太有意思了,但我记得早在21世纪初就有一个虚拟化操作系统了。”没错,VMWare早在1999年就推出了世界上第一个x86虚拟化工具。事实上,虚拟化早在20世纪60年代末的IBM大型机时代就已经出现了。

但容器化并非虚拟化。当然,它们经常相辅相成;例如在 Mac 上使用 Docker 时。关键区别在于,容器将单个操作系统划分为多个使用同一操作系统的不同环境。而虚拟机则创建功能独立的计算机,可以运行与主机完全不同的操作系统。因此,与完整的虚拟机相比,容器非常轻量级。

想要在同一版本的 Ubuntu 上安全地运行多租户工作负载?那就使用容器吧。想要在 Ubuntu 上运行 Windows、FreeBSD 和 CentOS 系统?那就使用虚拟机吧。

LXC 诞生

我们今天所理解的 chroot 和容器化之间的区别在于,它需要操作系统最底层的功能。在 Linux 中,这些功能以控制组(称为 cgroup)的形式存在于 Linux 内核中。cgroup 提供了一种将一组进程与内核正在运行的所有其他进程隔离的方法。

有了 cgroups,类似 Linux Jails 的版本就成为可能,并且 LXC(Linux 容器)于 2008 年首次亮相。

任何其他名称的容器

让我们回顾一下 LXC 诞生之前的一两年,快速了解一下 Heroku 及其 dynos。不要被“dyno”这个名字迷惑;Heroku 本质上是一个容器平台,只是在 Heroku 刚推出时,没有人称它们为容器。

Heroku 早期团队的目标是让 Rails 应用的部署变得像当时的 PHP 一样简单。最简单的方法是构建一个利用 Linux 全新 cgroup 的平台,并构建类似 FreeBSD Jails 的框架。因此,在编写 LXC 第一行代码的同时,Heroku 也构建了自己的 Linux 容器化平台,作为运行多租户工作负载的基础。我们今天所熟知的 Docker 也是在类似的环境下诞生的,它作为 dotCloud 平台即服务提供商的内部容器化系统。

通过创建第一个基于 Linux 的生产容器平台,Heroku 团队与 chroot、Jails 和 Kubernetes 的创建者一起在容器历史上占据了一席之地。

计算机到底是什么?

容器或许会让人联想到一部不太受欢迎的平板电脑电视广告,但它确实挑战了我们作为开发者对计算机的认知。正如 x86 虚拟化将大型机的多租户功能带入商用硬件一样,容器也为开发者解决了诸多问题,并使微服务和无服务器等新型架构更加实用。

对于开发人员来说,“它在我的计算机上运行”的时代已经基本结束,依赖地狱越来越不合时宜,因为容器提供了可复制的环境,可以跟踪代码从开发、测试到生产。

可以说,容器技术在近十年来对开发者生产力的贡献,堪比云计算和去中心化版本控制技术在过去十年中发挥的作用。直到 2010 年代,计算机还只是一堆耗电的硅片和电线。如今,无论您是使用Docker、部署到Heroku还是编排Kubernetes集群,容器技术都让计算机的概念变得更加短暂易逝。这真是太棒了。得益于容器化,如今的计算机几乎可以充当任何角色,只要它能够作为 CI/CD 流水线的端点即可。


集装箱必拍照片,由 chuttersnap 拍摄;
高速公路照片,由 Jake Blucker 拍摄
;监狱照片,由 Emiliano Bar 拍摄

文章来源:https://dev.to/heroku/how-containers-changed-the-world-1jip
PREV
运行微服务的最简单方法:AWS 与 Heroku 的比较
NEXT
Jest 与 Mocha 对比 3 大 JavaScript 测试框架