65.9K
CodeProject 正在变化。 阅读更多。
Home

容器化简介

2021 年 4 月 16 日

CPOL

9分钟阅读

viewsIcon

6365

本文为有经验的开发人员提供了对容器化的全面介绍:它的起源、工作原理以及用于构建和部署容器化云原生应用程序的典型工具。

很久以前,在互联网时代的早期,全球最大的零售商投入巨资建设他们的网络业务,以抓住蓬勃发展的在线市场带来的诸多机遇。上线意味着他们可以全天候处理订单,但也带来了前所未有的运营挑战。

由于假日购物吸引了大量在线用户,硬件最终会出现故障,这些零售商不得不购买比平时更多的服务器。购买新服务器的成本非常高,但他们又无法承受在销售高峰期失去消费者的风险。

借助 VMWare 和 Virtual Box 等产品,虚拟机成为了颠覆性的技术,使公司能够更好地利用硬件资源。在一台主机上运行多个应用程序意味着企业不必购买那么多服务器。这就像在“计算机内运行计算机”。

尽管如此,虚拟化也面临着挑战。开发人员在他们的本地机器上进行开发,而这些机器可能与他们部署到的虚拟机不同。环境之间的这种不匹配导致了令人沮丧的“在我机器上可以运行”的借口,并让开发人员感到沮丧,因为他们不得不担心应用程序外部发生的故障。

虚拟机后来被容器化所取代,尽管容器背后的理念并不新鲜。早在 1979 年,Unix 系统就引入了 chroot 系统来实现进程隔离和文件访问隔离。2000 年,FreeBSD Jails 将 Linux 计算机划分为更小的系统,2005 年,OpenVZ 使用 Linux 内核进行系统虚拟化和隔离。然后,在 2008 年,Linux 内核引入了控制组。

所有这些都是向我们今天使用的容器迈出的步伐。最终,Docker 因众多原因脱颖而出,包括面向开发人员的工具、简单的配置、出色的可移植性以及强大的管理生态系统。

现代容器的崛起

随着 Docker 的普及,容器化席卷了 IT 行业。容器类似于虚拟机,但没有客户操作系统 (OS),从而形成了一个更简单的软件包。

开发人员的“在我机器上可以运行”的借口不再是问题,因为应用程序及其依赖项都是自包含的,并被打包到同一个称为容器映像的单元中。映像是随时可部署的应用程序副本,而从这些映像创建的容器实例通常在 Azure 等云平台上运行。

新的架构缺少了虚拟机监视器,因为它不再需要了。但是,我们仍然需要管理新的容器,因此引入了容器引擎的概念。

容器是不可变的,这意味着您无法在容器映像的生命周期内对其进行更改:您无法应用更新、补丁或配置更改。如果必须更新应用程序,则应构建新映像(本质上是在现有容器映像之上进行更改集),然后重新部署它。不可变性使容器部署简单安全,并确保部署的应用程序无论在哪里都能按预期运行。

与虚拟机相比,新容器极其轻量且便携。此外,容器启动速度更快。由于体积小,容器有助于最大限度地利用主机操作系统及其资源。

您可以在 Docker 容器中运行 Linux 和 Windows 程序。Docker 平台原生支持 Linux 和 Windows,Docker 的工具使开发人员能够在 Linux、Windows 和 macOS 上构建和运行容器。

您不能使用容器运行位于本地文件系统上的应用程序。但是,您可以使用绑定挂载和卷访问 Docker 容器外部的文件。它们很相似,但绑定挂载可以指向主机计算机上的任何目录,并且不由 Docker 直接管理。

Docker 容器在 Linux 上可以访问 GPU 等物理主机硬件,但在 Windows 上不行。这是因为 Linux 上的 Docker 直接在内核上运行,而 Windows 上的 Docker 在虚拟机中运行,因为 Windows 没有 Linux 内核可以直接通信。

容器:从编码到部署

假设您正在开发一个容器化的电子商务应用程序。作为开发人员,您将应用程序构建到容器中。接下来,您编写一个包含设置和运行容器中应用程序所需的命令的 Dockerfile,每个应用程序或服务一个。然后,您编写一个 docker-compose.yml 文件来设置多容器 Docker 应用程序中不同容器应用程序和服务之间的关系。

通过执行 `docker run` 命令并指定本地端口,在开发机器上本地运行和测试容器,然后在浏览器中打开 `https://:[PORT]`。

要构建和运行您的应用程序,您可以将其部署到 Docker 主机(虚拟机或物理服务器),或者将其部署为组合应用程序,可以使用单个命令行界面 (CLI) 命令或集成开发环境 (IDE),如 Visual Studio。

一旦您的应用程序或服务经过测试,构建过程就会生成一个或多个容器映像。那么,如何处理它们呢?这时就需要像 Azure Container Registry 或 Docker Hub 这样的存储库了:一旦生成容器映像,开发人员就会将其推送到公共或私有存储库。然后,他们可以将映像拉取到数据中心、云端或应用程序可以运行的任何其他地方。

要了解如何使用 GitHub Actions 实现持续集成和持续部署 (CI/CD) 以将映像推送到容器注册表,请遵循此 YouTube 播放列表:使用 GitHub Actions 构建 CI/CD 工作流

使用注册表的一些优点是:

  • 您可以严格控制谁可以访问您的映像以及它们存储在哪里。
  • 注册表可以成为您要运行的映像的单一事实来源。
  • 您可以根据需要扫描容器中的漏洞。

如果您的应用程序或服务可以在没有编排的隔离容器中运行。在这种情况下,您可以使用 Azure Container Instances (ACI) 等解决方案,通过手动或从您的开发管道直接从容器注册表部署映像到生产环境。

部署之外:使用 Kubernetes 进行编排

当公司开始将他们的解决方案迁移到容器时,他们意识到扩展应用程序并非易事。 Kubernetes 平台很快成为运行容器化应用程序的黄金标准,引发了企业对容器探索的空前兴趣。

容器编排自动化了许多运行容器化工作负载和服务所需的任务,在大型系统中这将需要巨大的努力。Kubernetes 通过管理容器的生命周期来解决这一挑战,包括置备、部署、扩展、网络和负载均衡。

部署 Kubernetes 时,您会得到一个集群。Kubernetes 集群由一组称为工作节点或节点(运行容器中应用程序)的机器组成。每个集群至少需要一个工作节点。在工作节点中,应用程序工作负载沿着称为 Pod 的组件进行分发。

集群的 控制平面 管理工作节点和 Pod。在生产环境中,控制平面和集群通常分布在多台机器和节点上,提供高可用性和弹性。

您可以使用 minikube 创建本地 Kubernetes 集群,也可以创建托管 Kubernetes 服务。Kubernetes 是一项复杂的技术,需要充分了解安全性、支持技能、频繁升级以及注重细节。像 Azure Kubernetes Service (AKS) 这样的托管 Kubernetes 服务提供了许多便捷的管理功能,让您从这些重复性任务中解脱出来,从而专注于您的业务。

CI/CD 流水线与 Kubernetes

让我们来看看一个 CI/CD 流水线,该流水线将您的代码容器化,将其推送到注册表,然后从那里部署到 Kubernetes 集群的生产环境中。

一切都从您的代码开始。经过适当的代码审查、单元测试和其他控制后,合并请求会合并到您的 Git 存储库的主分支。这会触发一个事件,导致构建流水线将您的应用程序构建成容器映像。然后,构建流水线将这些映像推送到您的 Azure Container Registry (ACR)。

您可以为在 Azure Container Registry 中创建的每个对象定义策略、合规性和规则。CI/CD 流水线然后从 ACR 拉取容器映像,并将它们作为 Pod 部署到 Kubernetes 集群的工作节点中。容器映像可以根据您在部署配置文件中定义的副本数量,复制到多个工作节点中的多个 Pod 中。

从现在开始,您的新代码已经在 Kubernetes 集群的生产环境中运行。每当您将新代码提交到您的 Git 存储库时,构建流水线都会重复该过程。

Kubernetes 通过将一组虚拟机或物理机整合成一个统一的 API 接口供开发人员交互,并对应用程序进行编排,而无论底层是什么物理机。

在 Kubernetes 中,您的容器存在于 Pod 中,Pod 是最小的部署单元。Kubernetes 的 ReplicationController 有助于确保您的应用程序 Pod 在各个节点上的健康状况。当您定义所需数量的 Pod 副本时,ReplicationController 保证该数量的副本始终保持不变。因此,当一个 Pod 失败时,控制器会注意到并在集群中的其他地方启动一个 Pod。

Azure Kubernetes Service 使您能够通过自动调整运行工作负载的节点数量来维护一个高效、经济高效的集群。群集自动缩放组件会检测到资源限制何时发生,因此节点池中的节点数量会增加以满足您的应用程序需求。同样,当需求下降时,节点数量会减少,因此您不必为未使用的云资源付费。

除了在 Kubernetes 集群中创建额外的节点和 Pod 之外,您还必须确保这些新资源得到与现有资源相同的程度的使用。负载均衡组件(如 Azure 负载均衡器)会将来自 AKS 虚拟网络内部或外部的流量分发,从而成功扩展您的应用程序并创建高可用性服务。

后续步骤

您刚刚对容器的重要性进行了快速回顾:目前,它们似乎是企业应用程序部署的未来。随着技术的成熟,越来越多的开发人员和 DevOps 团队将受益于容器化提高的可移植性、可扩展性和效率。

想了解更多?探索以下资源

  • 通过 Kubernetes 学习构建和管理基于容器的应用程序。 获取这套免费的三本电子书,一次性了解 Kubernetes 的基础知识。
  • 在 Azure 上利用 Kubernetes 加速开发。通过学习如何大规模部署和管理容器集群 阅读此 Packt 电子书,开始您的学习之旅。
  • 容器是云原生应用程序开发的基础。 云原生应用程序 基于微服务。每个应用程序由小的、相互独立的服务的组成,利用持续交付来实现可靠性和更快的上市时间。
  • 了解如何使用 公共负载均衡器 通过 Azure Kubernetes Service (AKS) 公开您的服务。
© . All rights reserved.