Coursera 笔记

Module 03 · Components of Cloud Computing云计算的组成部分

Containers容器化技术

Coursera ↗

随着技术的不断发展,容器化(Containerization) 已成为一种越来越重要的应用部署方式。容器是将应用代码与其所需的库和依赖打包在一起的软件可执行单元,这样就能够在任何地方运行,无论是在桌面、传统IT环境还是云端。与虚拟机(VMs)不同,容器不需要在每个实例中包含来宾操作系统,而是利用主机操作系统的功能和资源,从而实现更轻量、更快速和更便捷的部署。


容器与虚拟机的对比vs

什么是容器?

容器技术具有轻量、快速和可移植的特点。容器是一种轻量级的虚拟化方式,它将应用程序的代码、运行时、系统工具、库及其依赖包裹在一起,使得应用程序能够在任何环境中一致地运行。容器比虚拟机更小、运行更快、便于迁移,并且由于不需要每次实例化时都包含操作系统(OS),而是直接利用宿主操作系统的功能和资源。

提到容器,大多数人可能会想到Docker,甚至是Kubernetes。但实际上,容器技术已经存在很长时间了。早在2008年,Linux内核就引入了C组(Cgroups)和控制组(Control Groups),这些技术为我们今天所见的各种容器技术奠定了基础。除了Docker,还有很多其他容器技术,例如Cloud Foundry、Rocket以及其他容器运行时(Container Runtimes)。

虚拟机部署:传统方式

让我们通过一个例子来了解虚拟机和容器的不同。假设我是一名开发人员,已经创建了一个 Node.js 应用程序,现在需要将其推向生产环境。我们先来看虚拟机的部署。

  1. 硬件与操作系统:
    我们首先有硬件环境和主机操作系统,此外还有一个虚拟机监控器(Hypervisor),它是启动虚拟机的关键。
  2. 虚拟机资源池:
    虚拟机在主机操作系统和虚拟机监控器(Hypervisor)之间共享资源。一些资源可能已经被占用。
  3. 部署Node.js应用程序:
    将应用程序推送到虚拟机时,我们需要为其创建一个 Linux虚拟机(VM)。
  • 在这个虚拟机中,除了主机操作系统外,还需要额外安装一个来宾操作系统(Guest OS),以及一些二进制文件和库。
  • 这种做法会导致虚拟机非常臃肿。
    例如,Node.js的最小虚拟机大小可能达到400MB,而Node.js运行时和应用程序本身的大小通常只有15MB左右。

扩展应用部署的挑战

  1. 扩展部署:
    假设我们需要扩展应用程序,创建多个实例。在虚拟机的情况下,虽然这些应用程序是完全相同的,我们仍然需要为每个实例部署独立的来宾操作系统和库。这会消耗大量的资源。
  2. 环境不一致问题:
    另外,应用程序可能在本地开发环境中运行良好,但一旦推向生产环境,可能会出现兼容性和配置问题。这种问题常常影响敏捷开发、DevOps 和持续集成与交付(CI/CD)的效率。

容器化技术的优势

容器化技术通过提供一个简单的三步流程来解决虚拟机中的许多问题。这个流程几乎适用于所有容器化平台,如 Docker 和 Cloud Foundry。

容器化流程

  1. 编写描述文件(Manifest):
    容器化的第一步是编写一个描述文件,定义容器的基本信息。例如,在Docker中,这个文件叫做 Dockerfile,在Cloud Foundry中,这个文件叫做 Manifest Channel。
  2. 创建镜像(Image):
    在描述文件的基础上,创建一个容器镜像。这个镜像包含了运行应用所需的所有运行时环境、库和二进制文件。
  • 如果使用Docker,这个镜像叫做 Docker Image。
  • 如果使用Rocket,则使用 ACI(应用容器镜像)。
  1. 生成容器(Container):
    最终,我们从镜像生成容器。容器是一种可以执行应用程序的实例,它包含了运行该应用程序所需的所有依赖。与虚拟机不同,容器不需要操作系统,而是使用主机操作系统。
    这使得容器的创建和运行变得更加高效,减少了不必要的开销。

容器的资源利用优势

容器不像虚拟机那样需要完整的操作系统,每个容器只包含应用和其必要的库。因此,容器在资源利用上更加高效。我们可以在不浪费过多系统资源的情况下,轻松扩展多个容器。

  • 扩展容器:
    如果我们将 Node.js 应用 容器化,扩展三次容器时,我们只需要部署应用及其相关依赖,而不必为每个实例部署操作系统。这极大地减少了资源消耗。

云原生架构的灵活性

假设我的同事开发了一个 Python 应用,并希望将其与我们的 Node.js 应用 集成,以调用第三方 API 进行 图像识别。

  1. 虚拟机部署的问题:
  • 如果我们使用虚拟机,可能会创建一个 Node.js 应用的虚拟机 和一个 Python 应用的虚拟机。但如果我们需要对 Node.js 应用 进行扩展,而不扩展 Python 应用,这将非常困难。
  1. 容器化的解决方案:
  • 通过容器化,我们可以将 Node.js 应用 和 Python 应用 分开部署。这样,容器可以根据需要独立扩展,而不需要重新配置虚拟机。
  • 容器的模块化:
    由于容器是独立运行的,我们可以单独部署一个 Python 容器,并在剩余的资源上运行多个 Node.js 容器,做到更高效的资源共享。

容器的资源共享与弹性

  • 资源共享:
    容器技术的另一个优势是,当某些容器进程不使用 CPU 或内存时,这些资源可以被其他容器共享,从而提高了硬件资源的利用率。
  • 云原生架构的优势:
    容器不仅具有良好的可移植性,而且易于扩展。它们使得开发、持续集成和交付变得更加敏捷和高效,符合现代 DevOps 的需求。


容器化技术的总结

  • 轻量级:容器不包含完整的操作系统,只包含必要的应用程序和库,节省资源。
  • 易于扩展:容器化应用可以更快速地进行扩展,而不需要重复部署操作系统。
  • 云原生架构:容器使得云原生架构更加灵活,并且能够充分利用云计算的资源弹性。
  • 提升开发效率:容器化支持更高效的开发流程,特别是在敏捷开发、持续集成和持续交付方面。

在接下来的课程中,我们将深入探讨云存储的相关内容。 📚