在过去的软件开发时代,将应用程序从代码部署到生产环境的过程缓慢而痛苦。开发人员深受”依赖地狱”的困扰——测试环境和生产环境在细节上存在差异,导致代码在一个环境中神秘地工作,在另一个环境中却不行。后来 Docker 在 2013 年应运而生,它最初是 dotCloud 内部对容器技术的一次实验,旨在简化部署流程。Docker 在那年 3 月开源,并在接下来的 15 个月里崛起为领先的容器平台。
在这篇文章中,我们将探索容器技术的历史、推动 Docker 飞速发展的具体创新,以及实现其魔力的 Linux 基础原理。我们会解释什么是 Docker 镜像、它们与虚拟机有何区别,以及使用 Docker 是否需要 Kubernetes。到最后,你会理解为什么 Docker 已经成为云端应用程序打包和分发的标准。
在过去的二十年里,后端基础设施经历了快速发展,如下图所示的时间线:
在计算的早期,应用程序直接运行在物理服务器(“裸机”)上。团队需要购买、上架、堆叠、通电并配置每一台新机器。这只是开始就非常耗时。
然后是硬件虚拟化。它允许多个虚拟机运行在单台强大的物理服务器上。这实现了更高效的资源利用。但配置和管理虚拟机仍然需要大量工作。
接下来是基础设施即服务(IaaS),如 Amazon EC2。IaaS 消除了设置物理硬件的需求,并提供按需虚拟资源。但开发人员仍然必须手动配置虚拟机,安装库、依赖项等。
平台即服务(PaaS)如 Cloud Foundry 和 Heroku 是下一个重大转变。PaaS 提供托管的开发平台以简化部署。但环境之间的不一致导致了”在我的机器上能跑”的问题。
这就把我们带到了 2013 年的 Docker。Docker 通过两项关键创新改进了 PaaS。
容器技术经常与虚拟机进行比较,但它们使用非常不同的方法。
虚拟机管理程序(hypervisor)模拟底层服务器硬件(如 CPU、内存和磁盘),允许多个虚拟机共享相同的物理资源。它在虚拟化的硬件上安装客户操作系统。运行在客户操作系统上的进程无法看到主机硬件资源或其他虚拟机。
相比之下,Docker 容器共享主机操作系统内核。Docker 引擎不虚拟化操作系统资源。相反,容器通过 Linux 命名空间(namespaces)和控制组(cgroups)实现隔离。
命名空间提供进程、网络、挂载和其他资源的隔离。cgroups 限制和计量容器的 CPU、内存和磁盘 I/O 等资源的使用。我们稍后会更深入地讨论这一点。
这使得容器比虚拟机更轻量、更便携。多个容器可以共享主机及其资源。它们启动也快得多,因为不需要启动完整的虚拟机操作系统。
Docker 并不是某些人描述的”轻量级虚拟化”。它使用 Linux 原语来隔离进程,而不是像管理程序那样虚拟化硬件。这种操作系统级隔离正是轻量级 Docker 容器得以实现的原因。
在 Docker 2013 年发布之前,Cloud Foundry 是一个广泛使用的开源 PaaS 平台。许多公司采用 Cloud Foundry 来构建自己的 PaaS 产品。
与 IaaS 相比,PaaS 通过处理部署和应用程序运行时来改善开发人员体验。Cloud Foundry 提供以下关键优势:
- 避免供应商锁定——构建在其上的应用程序可以在不同的 PaaS 实现之间移植
- 支持多样化的基础设施环境和扩展需求
- 全面支持主要语言(如 Java、Ruby 和 JavaScript)和数据库(如 MySQL 和 PostgreSQL)
- 一套用于部署应用程序的打包和分发工具
Cloud Foundry 在底层依赖 Linux 容器来提供隔离的应用程序沙箱环境。然而,这种支撑 Cloud Foundry 的核心容器技术并未作为面向用户的功能暴露出来,也没有被强调为关键架构组件。
提供 Cloud Foundry PaaS 解决方案的公司忽视了将容器解锁为开发人员工具的潜力。他们未能认识到容器如何从内部隔离机制转变为外部化打包格式。
Docker 通过解决 PaaS 打包的两个关键问题而变得流行:
- 将应用程序、配置、依赖项和操作系统捆绑到一个可部署的镜像中
- 保持本地开发环境与云运行时环境一致
下图展示了一个比较:

这优雅地解决了困扰 PaaS 的依赖和兼容性问题。但 Cloud Foundry 未能足够快地适应以支持 Docker 镜像。这使得 Docker 镜像在云计算环境中迅速普及。
Docker 早期受欢迎是因为它在应用程序打包和部署方面的创新。它最初的成功很大程度上归功于这种将应用程序隔离在轻量级容器中的新方法。
随着 Docker 的普及,该公司寻求将其产品扩展到容器化之外。它尝试扩展为完整的 PaaS 平台。这导致了 Docker Swarm(用于集群管理)的开发,以及对 Fig(后来的 Docker Compose)的收购,以增强编排能力。
Docker 的雄心引起了一些科技巨头的注意。Google、RedHat 和其他 PaaS 公司都想加入这个热门新技术的行列。
让我们看看 2013 年到 2018 年之间发生了什么:

本文为学习目的的个人翻译,译文仅供参考。
原文链接:A Crash Course in Docker。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。