探索容器:驱动云原生创新、效率和敏捷开发的轻量级技术。
译自 Introduction to Containers,作者 TNS Staff。
容器是云原生计算的基石之一。它们类似于早期的虚拟机(例如 VMware 提供的虚拟机),但轻量级得多。
容器是不可变的,因此如果您需要进行更改,则必须创建一个新的容器。
它们包含两个基本元素:
- 容器镜像是一个轻量级、独立的、可执行的软件包,其中包含应用程序运行所需的一切:代码、运行时、系统、工具、库和设置。
- 容器化涉及标准的打包格式和运行容器的引擎。当容器引擎解包应用程序并在隔离软件与同一基础架构上运行的任何其他容器的方式下运行它时,容器镜像在运行时成为容器。
通过将应用程序包含在可执行包中,容器建立了一个运行环境,解决了“在我的机器上运行良好”的常见问题。
容器改变了应用程序的创建和部署方式。
它们提供的可移植性和可靠性对于持续集成和持续交付 (CI/CD) 等 DevOps 方法至关重要。容器通过使开发人员能够在减少错误的环境中构建、测试和启动应用程序来简化 CI/CD 流程。容器还通过更紧密的 bin 打包来提高资源利用率,从而降低环境影响和运行成本。
虽然它们在微服务环境中并非严格要求,但它们已成为微服务的代名词。这是因为容器化应用程序启动速度快,并且在微服务架构中,我们经常启动和关闭系统。
因此,随着企业越来越多地采用微服务和相关的云原生技术,容器在促进敏捷开发和快速创新方面发挥着作用。它们提高可扩展性、可靠性和易于维护的能力,使其成为现代软件设计的关键要素。
容器在商业软件系统中已经存在了二十多年。早期的容器技术版本出现在 FreeBSD jails 中,该技术出现在 2000 年代。这些 jails 能够将 FreeBSD 操作系统划分为多个独立的迷你系统(称为 jails),所有这些系统都共享相同的内核,开销非常小。
Solaris Containers 是 Sun Microsystems Solaris 操作系统的功能,大约在同一时间出现。Solaris Container 基于系统资源控制的组合以及区域提供的边界分离。区域充当单个操作系统实例内的完全隔离的虚拟服务器。它们使管理员能够在 Solaris 实例内创建虚拟化的操作系统环境,从而增强安全性并优化资源使用。
2008 年,容器的概念成为 Linux 内核的一部分,引入了 Linux 容器 (LXC),这是一种操作系统级虚拟化方法,用于使用单个 Linux 内核在控制主机上运行多个隔离的 Linux 系统。LXC 最初由 IBM 开发,它依赖于 Linux 内核 cgroups 功能和对隔离命名空间的支持。这使得应用程序能够在相同的物理硬件上安全地运行。诸如 Google 之类的公司使用 LXC 来监督其基础架构,这展示了容器如何提高资源管理效率和可扩展性。
LXC 为容器技术奠定了基础,但 2013 年 Docker 的出现真正普及了容器,将其从主要用于系统管理员的工具转变为主要用于开发人员的工具,并在 Microsoft 的帮助下,将其扩展到涵盖 Windows 服务器以及 Linux 和其他 Unix 派生产品。Docker 简化了容器的创建、部署和管理,提供了 CLI 和 2015 年收购的称为 Kitematic 的 GUI 界面。
通过简化 LXC 的复杂性,Docker 使开发人员能够将其应用程序和依赖项捆绑到容器镜像中,从而确保在各种设置下的性能。 Docker 的影响是巨大的。它简化了软件从开发到生产过渡的过程,无需重新构建,有效地弥合了开发和运维之间的差距。这为容器的大规模采用铺平了道路,进而推动了 Kubernetes 和 Docker Swarm 等容器编排解决方案的发展。
Docker 最初的开源理念(Docker Engine 采用 Apache License 2.0 许可)催生了 runC、Containerd 和 Moby 项目 等计划,这些计划推动了容器技术的发展。此外,为增强容器安全性和效率所做的努力也带来了诸如 Kata Containers 等创新。
Docker 和其他行业领导者还创建了一个开放的治理结构,用于创建围绕容器格式和运行时的开放行业标准。该组织称为开放容器倡议 (OCI),目前维护着运行时、镜像和分发的标准。拥有行业标准的容器镜像格式允许在多个竞争平台之间实现互操作性。
容器化是指将应用程序及其依赖项打包到容器中。容器使用主机操作系统内核并在其自身环境中隔离应用程序进程。这种简化的方式使容器能够快速启动、停止和运行。
容器和虚拟机 (VM) 都提供运行应用程序的环境。它们在架构和资源使用方面有所不同。虚拟机在具有客户操作系统的虚拟机管理程序上运行,导致资源利用率增加。相比之下,容器共享主机操作系统内核,使其更轻量级且更高效。这种效率能够提高密度并优化计算资源的使用。
容器化的优势有很多:
- 可移植性:容器可以在不同的环境中一致运行,这使其成为多云和混合云策略的理想选择。
- 可扩展性:容器可以轻松地向上或向下扩展以处理不同的负载,从而增强应用程序性能和资源利用率。
- 效率:通过共享主机操作系统内核,容器减少了开销并提高了在单个主机上运行的应用程序的密度。
- 隔离性:容器提供进程和资源隔离,通过确保一个容器中的问题不会影响其他容器来增强安全性和稳定性。
容器引擎是使容器能够在主机系统上运行的软件。它们负责容器从创建和部署到扩展和最终关闭的生命周期。
有很多容器引擎,包括 Docker、RKT、CRI-O 和 LXD。此外,许多云提供商、平台即服务 (PaaS) 和容器平台都有自己的内置容器引擎,它们使用 Docker 或符合 OCI 标准的容器镜像。
随着容器开始流行,许多人开始寻找如何在多台机器上管理容器的解决方案。Sam Newman 在“构建微服务”一书中指出,“Docker 曾尝试过两次(分别使用 Docker Swarm 和 Docker Swarm Mode);Rancher 和 CoreOS 等公司提出了自己的方案;Mesos 等更通用的平台也用于与其他类型的负载一起运行容器。然而,最终,尽管在这些产品上投入了大量精力,但在过去几年中,Kubernetes 已经在这个领域占据主导地位。”
容器镜像是自包含的包,包含执行软件应用程序的所有组件,例如代码、运行时环境、库和安装文件。这些镜像包可以通过充当容器镜像存储中心的容器注册表共享。
- Docker Hub:Docker Hub 是最流行的容器注册表,提供大量可用于 Docker 环境的预构建镜像库。它允许开发人员轻松共享和分发容器化应用程序。
- Google Container Registry:Google Container Registry 是 Google Cloud Platform 上的私有容器镜像存储服务,提供安全、高性能的镜像存储。
- Amazon Elastic Container Registry (ECR):Amazon ECR 是一个完全托管的 Docker 容器注册表,使开发人员可以轻松存储、管理和部署 Docker 容器镜像。
容器生命周期:容器生命周期包括几个阶段:构建、交付和运行。在构建阶段,会创建一个包含所有必要依赖项的容器镜像。然后将镜像交付到注册表,其他系统可以访问和拉取该镜像。最后,在运行阶段,容器引擎根据镜像执行容器。
隔离和安全:容器采用诸如命名空间隔离之类的技术,隔离进程ID、网络接口、文件系统和控制组,这些控制组管理资源分配和限制。这些机制可以防止未授权访问,限制漏洞的影响,并增强整体系统安全性。
资源管理:容器共享主机操作系统内核,但仅限于其分配的资源,例如CPU、内存和I/O。这种高效的资源管理与虚拟机相比,可以实现更高的应用程序密度和更好的硬件利用率。
Docker是最知名的容器引擎。除了引擎本身,Docker还提供了一套产品,包括:
- Docker Desktop,容器开发的启动平台。
- Docker Hub (https://hub.docker.com),最大且最活跃的容器镜像注册表。
- Docker Scout,提供对软件供应链漏洞和公司策略违规的洞察,涵盖从开发到生产的全过程。
- Build Cloud,可以显著加快容器构建速度。
- Docker Debug,为使用容器的开发人员提供内置工具箱。
Kubernetes由Google创建,是用于编排容器的平台。它处理诸如部署、调整大小和监督跨主机集群的容器中应用程序等任务。Kubernetes提供了一个适应性强的系统,具有自动化资源分配、自我恢复机制、服务发现和负载均衡等功能。其多功能性和广泛的工具使其成为监督容器设置的首选方案。但是,它也以复杂性著称。
目前Kubernetes的主要替代方案包括:
- Cycle:介于PaaS和编排器之间,Cycle旨在简化容器管理。它不使用Docker或Kubernetes,但它符合OCI标准,这意味着底层容器是跨兼容的。
- HashiCorp's Nomad:以单个Go语言编写的二进制文件部署,在GitHub上拥有活跃的维护者社区。该平台的知名用户包括Autodesk、Cloudflare和Roblox。它具有非常灵活的模型,用于运行不同类型的应用程序工作负载——包括Java应用程序、虚拟机(VM)、Hadoop作业等等——并允许进行大量的自定义。
- VMware Tanzu Application Service:之前称为Pivotal Cloud Foundry (PCF),Tanzu Application Service旨在跨云运行微服务应用程序。它适用于vSphere和所有主要的云提供商,尤其适用于基于.NET、Spring和Spring Boot的应用程序。
containerd是一个容器运行时,它处理容器生命周期的所有方面,例如传输镜像、执行容器和管理存储。它旨在集成到像Docker这样的系统中,提供容器操作功能。containerd遵循开放容器倡议(OCI)为运行时和镜像制定的标准,从而提高了容器技术的兼容性和一致性。
runc是一个轻量级、可移植的容器运行时,它直接实现开放容器倡议(OCI)运行时规范。它是Docker和containerd的底层运行时,提供了一种标准化的运行容器的方式。runc专注于简单性和性能,使其成为现代容器生态系统中的关键组件。
Kata Containers力求融合容器和虚拟机的优势,提供具有安全性和隔离性的虚拟化容器。通过使用管理程序在虚拟机中运行每个容器,Kata Containers保证了强大的隔离性,同时保持了容器的速度和效率。这种方法对于在共享环境中执行工作负载或增强安全性非常有益。
大多数主要的云提供商都提供精心设计的Kubernetes体验,例如Azure Kubernetes Service (AKS)、Amazon Elastic Kubernetes Service (EKS)或Google Kubernetes Engine (GKE)。对于本地工作负载,Kubernetes发行版,例如Red Hat’s OpenShift或Tanzu Application Platform,具有类似的功能。
容器非常适合云原生方法,因为它们易于移动并在各种环境中保持一致性。公司可以在本地、云端或跨云服务运行容器化应用程序,无需进行重大更改。这种适应性使得能够有效利用资源,节省资金并增强弹性,避免受供应商绑定,并实现环境之间的平滑过渡。
虽然通常被认为是容器的替代方案,但诸如 Azure Functions、AWS Lambda 或 Google Cloud Functions 等 FaaS/无服务器产品提供了一种构建令人愉悦的简单分布式系统的方法,它们都在底层依赖某种容器技术。
安全是容器实施的关键方面。最佳实践包括:
- 镜像访问管理:限制开发人员仅使用可信来源的容器镜像,例如 Docker 官方镜像、Docker 验证的发布者镜像或您自己的公司镜像,并定期扫描漏洞。
- 容器隔离:例如,通过 Linux 用户命名空间以非特权方式运行所有容器,审查某些关键系统调用以防止容器逃逸,以及监控可疑活动。
- 网络安全:确保容器之间安全通信,并使用诸如服务网格之类的工具隔离网络流量。
我们预计将看到容器技术的进一步普及,使没有使用过容器的初级开发人员更容易上手。这可能包括特定的工具,例如使用 AI 工具(例如 GitHub Copilot)来帮助开发人员在 GitHub 中进行事务处理、构建文件和执行。
人工智能的兴起也导致了更多远程工作负载的转变;虽然我们的笔记本电脑越来越强大,但这些项目涉及的密集型和专业计算需求意味着不可能在本地机器上运行所有内容。因此,我们看到重新推动促进远程构建、测试和运行环境,但我们需要能够以保持开发人员反馈循环快速而紧密的方式做到这一点。我们预计容器工具将变得真正混合,并且它也可能会扩展,其用户界面将为数据科学专业人员和软件开发人员设计。
无服务器方法(其中容器化被抽象到开发人员几乎看不到的地步)表明,虽然容器和编排器将继续存在,但它们对典型的企业开发人员来说可能会越来越不明显。
随着越来越复杂的供应链攻击的兴起,人们越来越重视改进容器安全。未来的预期发展包括改进运行时安全工具、自动扫描漏洞、验证容器镜像真实性的可靠方法以及对完全隔离环境的支持。这些升级的安全措施旨在帮助公司保护其容器化应用程序免受新兴风险的影响。
即将在容器编排方面取得的进展预计将集中在增强容器化应用程序管理的自动化方面。这将涉及实施调度算法、优化资源分配以及增强与 AI 和机器学习的集成,以实现预测性扩展和异常检测。这些改进旨在简化容器编排流程,使其更有效,并减轻开发和运营团队的工作量。
在 The New Stack,我们致力于让您了解容器技术的最新发展和最佳实践。我们的平台提供深入的文章、教程和案例研究,涵盖容器的各个方面,包括工具评论、实施策略和行业趋势。
我们提供来自行业专家的见解,他们分享他们在容器方面的经验和知识。从实际实施中学习,并获得克服常见挑战和取得成功结果的宝贵技巧。
定期访问我们的网站,随时了解容器技术的最新新闻和发展。我们的内容帮助您保持领先地位,确保您能够访问最新的信息和资源。加入我们由开发人员、DevOps 专业人员和 IT 领导者组成的社区,他们对容器技术充满热情,并利用我们全面的资源来改进您的实践。访问 The New Stack 网站了解最新更新,并浏览我们丰富的容器内容集。