何时使用 Docker 容器

已完成

我们已经知道,Docker 提供了几项功能供我们使用。 在这里,我们将探讨 Docker 向开发和运营团队提供的好处。 此外,我们还将介绍 Docker 可能并非最佳选择的一些场景。

这些方面将帮助确定 Docker 是否适合你的容器化策略。

回想前面的内容,我们的团队在开发和发布订单跟踪门户时遇到了许多挑战。 他们正寻求一种解决方案,以便:

  • 轻松管理托管环境。
  • 保证连续交付软件。
  • 确保高效使用服务器硬件。
  • 允许实现应用程序可移植性。

Docker 便是应对这些挑战的解决方案。 让我们来看一下目前所介绍的所有优点。

Docker 的优点

使用 Docker 时,可以立即获得容器化所提供的好处。

高效使用硬件

容器可在不使用虚拟机 (VM) 的情况下运行。 我们已经知道,容器依靠主机内核来实现文件系统、网络管理、进程调度和内存管理等功能。

将 VM 资源使用与 Docker 资源使用进行比较的关系图。

与 VM 相比,我们可以发现,VM 需要安装操作系统来为 VM 中正在运行的应用程序提供内核功能。 请记住,VM 操作系统还需要磁盘空间、内存和 CPU 时间。 通过消除 VM 和附加的操作系统要求,可以释放主机上的资源,并将其用于运行其他容器。

容器隔离

Docker 容器提供了安全功能,可在同一主机上同时运行多个容器,而不会相互影响。 正如我们所见,我们可以配置数据存储和网络配置,以便隔离容器或在特定容器之间共享数据和连接。

让我们将此功能与使用 VM 进行比较。

显示正在运行多个 VM 的物理主机的关系图。

假设我们有一个运行两个 VM 的物理主机。 我们有三个需要彼此独立运行的应用程序。 我们决定将第一个应用部署到 VM1,将第二个应用部署到 VM2,以便将这两个应用彼此隔开。 如果我们现在选择安装第三个应用程序,则需要安装另一个 VM 以沿用此模式。

应用程序可移植性

容器几乎可在任何地方运行,包括桌面、物理服务器、VM 和云中。 利用此运行时兼容性,可以轻松在不同环境之间移动容器化应用程序。

由于容器是轻型的,因此它们不会像 VM 那样启动或关闭速度缓慢。 因此,可以顺利且快速地重新部署和使用其他部署方案,如纵向扩展或纵向缩减。

应用程序交付

借助 Docker,我们可以将容器用作分发应用程序的单位。 这一概念可确保我们具有开发者团队和运营团队使用的标准化容器格式。 开发者可以专注于开发软件,而运营团队可以专注于部署和管理软件。

在开发团队发布应用程序版本后,我们便可以在部署系统的每个步骤中使用容器。 容器非常适合用于持续集成,并且可以加快从生成到生产的时间。

管理托管环境

我们在内部将应用程序的环境配置到容器。 由于这种包含关系,我们的运营团队可以更加密切地灵活管理应用程序的环境。 我们的团队可以监视操作系统更新,应用一次安全修补程序,并根据需要推出更新后的容器。

此外,我们的团队还可以在不影响其他容器的情况下管理要安装、更新和删除的应用程序。 每个容器都是隔离的,并且其资源限制的分配与其他容器是分开的。

云部署

Docker 容器是 Azure 容器化服务使用的默认容器体系结构,许多其他云平台也支持 Docker 容器。

例如,可以将 Docker 容器部署到 Azure 容器实例、Azure 应用服务和 Azure Kubernetes 服务。 其中的每个选项都提供了不同的特性与功能。

例如,通过 Azure 容器实例,你可以专注于设计和生成应用程序,没有管理基础结构的开销。 当需要安排多个容器时,可以通过 Azure Kubernetes 服务轻松部署和管理大规模容器部署。

何时不使用 Docker 容器

Docker 容器提供了许多好处,但请记住,容器不一定能满足你的所有需求。 需要注意以下几个方面。

安全性和虚拟化

容器提供了一定程度的隔离。 但是,容器共享单个主机操作系统内核,也就是说共享单个攻击点。

Windows 主机提供了一个额外的隔离模型,在该模型中,可以使用专门生成的 VM 在虚拟机监控程序级别隔离容器。 此模式称为 Hyper-V 隔离模式,在容器和容器主机之间添加另一层安全保障。

此外,我们还需要考虑存储和网络等方面的问题,确保我们考虑到了所有安全性方面。 例如,默认情况下,所有容器都将使用桥接网络,并且可以通过 IP 地址相互访问。

并非所有应用程序都将受益于容器化。 在这些情况下,使用 VM 可能更有意义。

服务监视

管理应用程序和容器比传统 VM 部署更加复杂。 有日志记录功能可告诉我们正在运行的容器的状态,但有关容器内服务的更详细信息更难监视。

例如,Docker 为我们提供了 docker stats 命令。 此命令返回有关容器的信息,例如 CPU 使用百分比、内存使用百分比、写入磁盘的 I/O、发送和接收的网络数据以及分配的进程 ID。 此信息作为即时数据流很有用,但是,由于不会存储数据,因此不会进行聚合。 我们必须安装第三方软件,以便在一段时间内捕获有意义的数据。