15 种最常见的 Docker 使用方法

@高效码农  November 28, 2022

容器化应用程序而不是将它们托管在虚拟机上是过去几年一直流行的概念,使容器管理流行起来。Docker 处于这一转变的核心,帮助组织无缝地采用容器化技术。最近,Docker 用例遍布所有行业,无论规模大小和性质如何。

什么是Docker?

Docker 是一种容器化技术,它使开发人员能够将服务及其依赖项、库和操作系统打包到容器中。通过将应用程序与基础架构分离,Docker 允许您在各种环境中无缝部署和移动应用程序。 

Docker 使用以下步骤可以非常简单地创建和管理容器:

  1. 创建一个 Docker 文件并添加代码
  2. 基于 Dockerfile 构建 Docker 镜像
  3. 从 Docker 镜像创建一个正在运行的实例
  4. 按需扩展容器

什么是微服务?

传统上,软件是使用单体架构开发的,其中整个软件是使用瀑布开发方法作为单个实体开发的。这些单体架构带来了规模、复杂性和可扩展性方面的挑战。微服务或微服务架构允许开发人员将应用程序分解为更小的独立单元,这些单元使用 REST API 相互通信,从而解决了这些挑战。通常,每个功能都可以开发为独立的服务,这意味着每个服务都可以独立运行而不影响任何其他服务。因此,组织可以加快发布周期、按需扩展操作并无缝更改代码,而无需应用程序停机。从单体架构迁移到微服务是一个流行的 Docker 用例。 

什么是容器?

容器是微服务架构的一个显着用例。容器是一个标准的软件单元,它通过将应用程序与所有依赖项和所需资源打包在一起,将应用程序与其底层基础设施隔离开来。与虚拟化硬件层的虚拟机不同,容器仅虚拟化操作系统级别之上的软件层。我们将讨论更多关于容器管理的内容。

Docker 的业务优势

Docker 因其可移植性和生态系统而成为容器化的代名词。AWS、GCP 和 Azure 等主要云提供商都将 Docker 纳入系统并提供支持。因此,您可以在任何环境(包括 VirtualBox、Rackspace 和 OpenStack)上无缝运行 Docker 容器。可扩展性是 Docker 的最大优势之一。通过在单个主机上部署多个容器,组织可以显着降低运营成本。此外,Docker 允许您在商品硬件上部署服务,从而消除购买昂贵服务器的成本。
Docker 的基本格言包括更少的资源和更小的工程团队。因此,组织可以使用更少的资源执行操作,从而需要更少的人员来监视和管理此类操作。这意味着成本节约和更高的投资回报率。Docker 允许您轻松地即时创建和管理容器,从而促进更快的部署。使用简单的 YAML 配置文件部署和扩展基础设施的能力使其易于使用,同时提供更快的上市时间。每个隔离容器都优先考虑安全性。

您将在下面找到最常见的 Docker 用例。 

Docker 用例 1:从单体架构到微服务架构

仅使用整体方法(瀑布模型)开发软件的日子已经一去不复返了,在这种情况下,整个软件是作为一个实体开发的。尽管整体架构有助于软件的构建、测试、部署和水平扩展,但随着应用程序变得越来越大,管理可能会成为一个挑战。任何功能中的任何错误都会影响整个应用程序。此外,进行简单的更改需要重写、测试和部署整个应用程序。因此,采用新技术并不灵活。 

另一方面,微服务将应用程序分解为多个独立的模块化服务,每个服务都拥有自己的数据库模式,并通过 API 相互通信。微服务架构适合支持 DevOps 的基础架构,因为它有助于持续交付。通过利用 Docker,组织可以轻松地将 DevOps 最佳实践整合到基础架构中,从而在竞争中保持领先地位。此外,Docker 允许开发人员轻松地与运营团队共享软件及其依赖项,并确保它在两端以相同的方式运行。例如,管理员可以使用开发人员使用 Dockerfile 创建的 Docker 镜像来暂存和更新生产环境。像这样,降低了构建和配置 CI/CD 管道的复杂性,从而可以更高级别地控制对基础设施所做的所有更改。负载均衡配置也变得更容易。

Docker 用例 2:提高生产力

在传统的开发环境中,复杂性通常在于使用手动工作定义、构建和配置开发环境,而不会延迟发布周期。缺乏可移植性会导致应用程序出现不一致的行为。Docker 允许您使用 Docker 映像构建容器化开发环境,并轻松设置和使用开发环境,同时在其整个生命周期内提供一致的性能。此外,它还为开发环境中使用的所有工具、框架和技术提供无缝支持。 

其次,Docker 环境促进了自动化构建、自动化测试和 Webhooks。这意味着您可以轻松地将 Bitbucket 或 GitHub 存储库与开发环境集成,并从源代码创建自动构建并将它们移至 Docker 存储库。开发人员和 CI/CD 工具之间的连接工作流也意味着更快的发布。 

Docker 带有一个云管理的容器注册表,无需管理您自己的注册表,当您扩展底层基础设施时,这可能会变得昂贵。此外,配置的复杂性已成为过去。实施基于角色的访问允许不同团队的人员安全地访问 Docker 镜像。此外,Slack 集成允许团队在整个产品生命周期中无缝协作和协调。 

毫无疑问,Docker 提供加速开发、自动化工作流程和无缝协作,可以提高生产力。 

Docker 用例 3:基础架构即代码

微服务架构使您能够将软件分解为多个服务模块,从而使您能够单独处理每个功能。虽然这带来了可扩展性和自动化,但也有一个问题:它让您有数百个服务需要监控和管理。这就是基础架构即代码(IaC) 为您提供帮助的地方,它使您能够使用代码管理基础架构。基本上,它允许您使用配置文件为基础设施定义资源配置,并将基础设施转换为软件,从而利用 CI/CD 流程、自动化、可重用性和版本控制等软件最佳实践。 

Docker 将 IaC 带入 CI/CD 管道的开发阶段,因为开发人员可以使用 Docker-compose 构建使用多个服务的复合应用程序,并确保它在整个管道中一致地工作。IaC 是 Docker 用例的典型示例。

Docker用例4:多环境标准化

Docker 为管道中的所有成员提供了一个生产对等环境。考虑一个软件开发团队正在发展的例子。当一个新成员加入团队时,每个成员都必须安装/更新操作系统、数据库、节点、纱线等。光是准备好机器就需要 1-2 天的时间。此外,确保每个人都获得相同的操作系统、程序版本、数据库版本、节点版本、代码编辑器扩展和配置也是一项挑战。 

例如,如果您为两个不同的程序使用两个不同版本的库,则需要安装两个版本。此外,应在执行这些程序之前指定自定义环境变量。现在,如果您在开发阶段对依赖项进行了某些最后一刻的更改而忘记在生产阶段进行这些更改怎么办?

Docker将所有需要的资源打包到一个容器中,并保证依赖之间没有冲突。此外,您可以监控破坏环境的未跟踪元素。Docker 标准化了环境,确保容器在整个 CI/CD 管道中以相似的方式工作。 

Docker 用例 5:松耦合架构

传统瀑布软件开发模型的时代已经一去不复返了。如今,在云和微服务架构的支持下,开发人员正在将应用程序分解成更小的单元,并轻松地将它们构建为松散耦合的服务,这些服务通过 REST API 相互通信。Docker 帮助开发人员将每项服务连同所需的资源打包到一个容器中,从而使其易于部署、移动和更新。 

电信行业正在利用 5G 技术和 Docker 对软件定义网络技术的支持来构建松耦合架构秒。新的5G技术支持网络功能虚拟化,使电信能够虚拟化网络设备硬件。因此,他们可以将每个网络功能划分并开发为服务,并将其封装到容器中。这些容器可以安装在商用硬件上,使电信公司无需昂贵的硬件基础设施,从而显着降低成本。公有云提供商最近进入电信市场已经缩减了电信运营商和 ISV 的利润。他们现在可以使用 Docker 通过现有基础设施构建具有成本效益的公共云,从而将 Docker 用例转化为新的收入流。

Docker 用例 6:用于多租户

多租户是一种云部署模型,其中单个安装的应用程序为多个客户提供服务,每个客户的数据完全隔离。软件即服务 (SaaS) 应用程序大多使用多租户方法。 

多租户模型有 4 种常见方法:

  • 共享数据库——独立模式:所有租户的数据都存储在一个数据库中,每个租户都有一个单独的模式。隔离度中等。
  • 共享数据库 - 共享模式:所有租户的数据都存储在一个数据库中,其中每个租户的数据都由“外键”标识。隔离级别低。
  • 隔离数据库——共享应用服务器:与每个租户相关的数据存储在单独的数据库中。隔离级别高。
  • 基于 Docker 的独立租户:一个单独的数据库存储每个租户的数据,每个租户由一组新的容器标识。

虽然租户数据是分开的,但所有这些方法都为所有租户使用相同的应用程序服务器。也就是说,Docker 允许完全隔离,其中每个租户应用程序代码都在每个租户自己的容器内运行。

为此,组织只需将应用程序代码转换为 Docker 镜像即可运行容器,并使用 docker-compose.yaml 定义多容器和多租户应用程序的配置,从而使他们能够为每个租户运行容器。一个单独的 Postgres 数据库和一个单独的应用程序服务器将用于容器内运行的每个租户。每个租户将需要 2 个数据库服务器和 2 个应用程序服务器。您可以通过添加 NGINX 服务器容器将您的请求路由到正确的租户容器。  

Docker 用例 7:加速 CI/CD 管道部署

与需要几分钟才能启动的整体应用程序不同,容器在几秒钟内启动,因为它们是轻量级的。因此,您可以使用CI/CD 管道中的容器以闪电般的速度快速部署代码或快速更改代码库和库。但是,请务必注意,较长的构建时间会减慢 CI/CD 部署的速度。发生这种情况是因为 CI/CD 管道每次都必须从头开始,这意味着每次都必须拉取依赖项。幸运的是,Docker 带有一个缓存层,可以轻松解决构建问题。也就是说,它仅适用于本地机器,因此不适用于远程运行器机器。 

为了解决这个问题,使用“--from-cache”命令指示Docker build从本地机器镜像中获取缓存。如果您没有本地现有的 docker 镜像,您可以简单地创建一个镜像并在执行“Docker build”命令之前拉取它。需要注意的是,此方法仅使用最新的 docker 镜像库。因此,为了获得更早的图像缓存,您应该根据每个阶段推送和拉取每个 docker 图像。

Docker 用例 8:独立的应用基础设施

Docker 的主要优势之一是其独立的应用程序基础设施。每个容器都打包了所有依赖,因此您无需担心依赖冲突。无论应用程序的操作系统、平台和版本如何,您都可以轻松地在一台或多台计算机上轻松部署和运行多个应用程序。考虑一个实例,其中两个服务器使用同一应用程序的不同版本。通过在独立容器中运行这些服务器,您可以消除依赖性问题。

Docker 还提供了一个 SSH 服务器,用于每个独立容器的自动化和调试。由于每个服务/守护进程都是隔离的,因此很容易监视在隔离容器内运行的应用程序和资源并快速识别错误。这使您可以运行不可变的基础架构,从而最大限度地减少因基础架构更改而导致的停机时间。 

Docker 用例 9:可移植性——将任何应用程序运送到任何地方

可移植性是前五个 Docker 用例之一。可移植性是软件应用程序在任何环境中运行的能力,无论主机操作系统、插件或平台如何。容器提供了可移植性,因为它们打包了运行应用程序所需的所有资源,例如代码、系统库、运行时、库和配置设置。可移植性还通过应用程序移动到另一个主机环境所需的调整量来衡量。例如,Linux 容器可以在所有 Linux 发行版上运行,但有时无法在 Windows 环境中运行。Docker 提供了完整的可移植性,允许您在各种环境之间移动应用程序,而无需对其配置进行任何重大更改。Docker 为容器化创建了一个标准,因此,它的容器高度便携也就不足为奇了。此外,Docker 容器使用主机操作系统内核,无需添加操作系统。这使它们重量轻且易于在不同环境之间移动。 

当开发人员想要在各种操作系统中测试应用程序并分析结果时,上述内容特别有用。代码中的任何差异只会影响单个容器,因此不会导致整个操作系统崩溃。

Docker 用例 10:混合云和多云支持

根据Channel Insider的说法,组织中采用 Docker 的三大驱动因素是混合云、VMware 成本和来自测试团队的压力。尽管混合云非常灵活并且允许您运行定制的解决方案,但在多个环境中分配负载可能是一个挑战。为了促进云之间的无缝移动,云提供商通常需要在成本或功能集上做出妥协。Docker 消除了这些互操作性问题,因为它的容器在内部部署和云部署中以相同的方式运行。您可以在测试和生产环境或使用多个云供应商产品构建的内部云之间无缝移动它们。此外,部署过程的复杂性也降低了。 

多亏了 Docker,组织可以构建混合和多云环境,其中包含来自不同供应商的两个或多个公共/私有云。从 AWS 迁移到 Azure 云很容易。此外,您可以选择服务并根据安全协议和服务级别协议将它们分布在不同的云中。

Docker 用例 11:降低 IT/基础设施成本

对于虚拟机,您需要复制整个来宾操作系统。值得庆幸的是,Docker 并非如此。Docker 允许您预置更少的资源,使您能够运行更多的应用程序并促进资源的有效优化。例如,开发团队可以将资源整合到一台服务器上,从而降低存储成本。此外,Docker 具有高可扩展性,允许您在精确的时刻配置所需的资源,并按需自动扩展基础设施。您只需为实际使用的资源付费。此外,在 Docker 中运行的应用程序在整个 CI/CD 管道中提供相同级别的性能,从开发到测试、暂存和生产。因此,错误和错误被最小化。这种环境对等使组织能够以最少的人员和技术资源管理基础架构,从而大大节省维护成本。基本上,Docker 提高了生产力,这意味着您不需要像在传统软件开发环境中那样雇用那么多的开发人员。Docker 还具有最高级别的安全性,最重要的是,它是开源和免费的。 

Docker 用例 12:安全实践

Docker 容器默认是安全的。当你使用 Docker 创建容器时,它会自动创建一组命名空间并将容器隔离。因此,容器无法访问或影响在另一个容器内运行的进程。同样,每个容器都有自己的网络堆栈,这意味着除非授予某些权限,否则它无法获得对其他容器的网络端口、套接字和接口的特权访问。除了资源核算和限制之外,控制组还处理内存、计算和磁盘 I/O 资源的配置。因此,由于资源耗尽的容器不会使系统崩溃,因此成功缓解了分布式拒绝服务 (DDoS) 攻击。 

当容器启动时,Docker 守护进程会激活一组限制功能,通过细粒度的访问控制来增强二进制根目录。这提供了更高的安全性,因为许多以 root 身份运行的进程不需要真正的 root 权限。因此,他们可以以较小的权限进行操作。另一个重要功能是使用 dockerd 配置文件中定义的 Docker 内容信任签名验证功能运行签名图像。如果你想添加额外的安全层并强化 Docker 容器,SELinux、Apparmor 和 GRSEC 是可以帮助你这样做的著名工具。 

Docker 用例 13:灾难恢复

虽然混合云和多云环境为组织带来了惊人的好处,但它们也带来了某些挑战。保持弹性是一个值得注意的问题。为了确保业务连续性,您的应用程序必须能够承受错误和故障而不会丢失数据。当组件出现故障时,您无法承受停机时间,尤其是对于关键应用程序。因此,我们建议您使用冗余组件弹性和访问路径来消除单点故障以实现高可用性。应用程序还应该具有自我修复能力。容器可以在这方面为您提供帮助。然而,对于出现意外故障的情况,您需要一个灾难恢复计划来减少人为或自然故障期间的业务影响。 

Docker 容器可以轻松即时地创建或销毁。当一个容器出现故障时,它会自动被另一个容器替换,因为容器是使用 Docker 镜像构建的,并且基于 dockerfile 配置。在将图像移动到另一个环境之前,您可以将数据提交到现有平台。您还可以在发生灾难时恢复数据。 

综上所述,重要的是要了解底层主机可能连接到其他组件。因此,您的灾难恢复计划还应该包括启动替换主机。此外,您还应该考虑有状态服务器、网络和 VPN 配置等问题。

Docker 用例 14:简单的基础设施扩展 

Docker 增强了微服务架构,其中应用程序被分解为独立的服务并打包到容器中。组织正在利用微服务和云架构并构建分布式应用程序。Docker 使您能够立即为应用程序启动相同的容器并水平扩展基础架构。随着容器数量的增加,您将需要使用容器编排工具例如 Kubernetes 或 Docker Swarm。这些工具具有智能扩展能力,允许它们按需自动扩展基础设施。它们还可以帮助您优化成本,因为它们消除了运行不必要容器的需要。为了使编排更容易,细化组件很重要。此外,无状态和一次性组件将使您能够轻松监控和管理容器的生命周期。

Docker 用例 15:依赖管理

依赖隔离是容器最强大的特性。考虑一个实例,您有两个应用程序使用不同的第三方库。如果应用程序依赖于同一库的不同版本,那么在整个产品生命周期中密切关注版本差异可能是一项挑战。您可能需要允许容器相互通信。例如,一个应用程序需要与另一个应用程序关联的数据库对话。当您将应用程序移动到新机器时,您必须记住所有依赖项。此外,版本和包冲突可能会很痛苦。 

尝试重现环境时,应注意操作系统、语言和包依赖性。如果您使用 Python 语言,则需要依赖项管理工具,例如 virtualenv、venv 和 pyenv。如果新环境没有像 git 这样的工具,你需要创建一个脚本来安装 git CLI。该脚本会针对不同的操作系统和操作系统版本不断变化,因此每个团队成员都应该了解这些工具,这并不总是那么容易。 

无论是操作系统、语言还是 CLI 工具依赖,Docker 都是依赖管理的最佳工具。通过简单地在 dockerfile 中定义配置及其依赖项,您可以将应用程序无缝地移动到另一台机器或环境,而无需记住依赖项、担心包冲突或跟踪用户首选项和本地机器配置。

由 Docker 提供支持的公司

Docker 用例不受地区或行业限制。

PayPal是一家领先的美国金融科技公司,在全球范围内提供在线支付服务。该公司在三个不同的系统中每秒处理大约 200 笔付款;贝宝、Venmo 和布伦特里。因此,在不同的云和架构之间移动服务常常会延迟部署和维护任务。因此,PayPal 实施了 Docker 并在整个基础设施中标准化了其应用程序和操作。时至今日,该公司已将 700 个应用程序迁移到 Docker,并与 4000 名软件员工合作,每年管理 200,000 个容器和 8+0 亿次交易,同时实现生产力提高 50%。

Adobe还使用 Docker 进行容器化任务。例如,ColdFusion 是一种 Adob​​e 网络编程语言和应用程序服务器,可促进网络应用程序和后端系统之间的通信。Adobe 使用 Docker 来容器化和部署 ColdFusion 服务。它使用 Docker Hub 和 Amazon Elastic Container Registry 来托管 Docker 镜像。因此,用户可以将这些图像拉到本地机器并运行 Docker 命令。

GE是为数不多的几家在技术萌芽阶段就大胆采用该技术的公司之一,多年来已成为领导者。因此,该公司运行多个遗留应用程序,从而延迟了部署周期。GE 转而使用 Docker,并成功地大大减少了开发到部署的时间。此外,它现在能够实现比 VM 更高的应用程序密度,从而降低运营成本。 

Docker 之后的下一步是什么?

一旦您了解了 Docker 如何影响不同的业务方面,接下来您要掌握的是如何充分利用 Docker 技术。随着组织运营的发展,对数以千计的容器的需求出现了。值得庆幸的是,Docker 具有高度可扩展性,您可以轻松地向上和向下扩展服务,同时定义使用规模所需的副本数量。 

  • $ docker 服务规模前端=50

您还可以使用 docker service scale 命令一次扩展多个服务。

集装箱管理系统

随着业务的发展,组织需要按需扩展运营。此外,随着容器集群的增加,编排它们变得具有挑战性。容器管理系统可帮助您管理容器任务,从创建和部署一直到扩展和销毁,让您可以在适用的地方使用自动化。基本上,它们简化了容器管理。除了创建和删除容器之外,这些系统还管理其他与容器相关的任务,例如编排、安全、调度、监控、存储、日志管理、负载平衡和网络管理。根据Datadog的说法,使用容器管理系统的组织平均每台主机托管 11.5 个容器,而在非编排环境管理时每台主机托管 6.5 个容器。

流行的容器管理工具

以下是您的企业中一些最受欢迎的容器管理器。

  • Kubernetes: Kubernetes 是谷歌开发的最受欢迎的容器编排工具。不久之后,Kubernetes 就成为了容器管理和编排的事实标准。谷歌将该工具移交给了云原生计算基金会(CNCF),这意味着该工具现在得到了 IBM、微软、谷歌和 RedHat 等行业巨头的支持。它使您能够轻松地快速打包、测试、部署和管理大型容器集群。它还是开源的、具有成本效益的并且与云无关。
  • Amazon EKS: 随着 Kubernetes 成为容器管理的标准,云提供商开始将其整合到他们的平台产品中。Amazon Elastic Kubernetes Service (EKS) 是一种托管 Kubernetes 服务,用于在 AWS 上管理 Kubernetes。使用 EKS,组织不需要安装和配置 Kubernetes 工作节点或平面,因为它会为您处理这些事情。简而言之,EKS 充当容器服务并为您管理容器编排。但是,EKS 仅适用于 AWS 云。
  • Amazon ECS: Amazon Elastic Container Service (ECS) 是一种适用于 AWS 环境的完全托管的容器编排工具,可帮助组织轻松管理微服务和批处理作业。ECS 看起来与 EKS 相似,但在管理容器集群方面有所不同,与仅执行 Kubernetes 任务的 EKS 不同。ECS 是免费的,而 EKS 每小时收费 0.1 美元。也就是说,由于它是开源的,EKS 为您提供了来自社区的更多支持。另一方面,ECS 更像是一种专有工具。ECS 最适合那些没有广泛的 DevOps 资源或发现 Kubernetes 很复杂的人。
    另请阅读:Amazon ECS 与 EKS
  • Amazon Fargate: Amazon Fargate 是另一种容器管理,作为一种无服务器容器服务,使组织能够运行虚拟机而无需管理服务器或容器集群。它实际上是 ECS 的一部分,但它也适用于 EKS。虽然 ECS 可以更好地控制基础架构,但它具有一些管理复杂性。如果您想运行特定任务而不用担心基础设施管理,我们推荐 Fargate。
  • Azure Kubernetes 服务: Azure Kubernetes 服务 (AKS) 是一种容器管理工具,是 Microsoft 为 Azure 环境提供的完全托管的 Kubernetes 服务。它是开源的,而且大部分是免费的,因为您只需为相关资源付费。AKS 与 Azure Active Directory (AD) 集成,并通过基于角色的访问控制提供更高的安全级别。它与 Microsoft 解决方案无缝集成,并且易于使用 Azure CLI 或 Azure 门户进行管理。
  • Google Kubernetes Service: Google Kubernetes Engine (GKE) 是 Google 于 2015 年开发的 Kubernetes 托管服务,用于管理运行 Kubernetes 的 Google 计算引擎实例。GKE 是有史以来第一个 Kubernetes 托管的服务,其次是 AKS 和 EKS。GKE 提供比其竞争对手更多的功能和自动化。Google 对每个集群每小时收费 0.15 美元。

结论

在当今复杂的软件开发环境中,包括多种操作系统、编程语言、插件、框架、容器管理和架构,Docker 为每个成员在整个产品生命周期中创建了一个标准化的工作流环境。更重要的是,Docker 是开源的,并得到强大而充满活力的社区的支持,可以帮助您解决任何问题。未能成功利用 Docker 用例肯定会使您落后于竞争对手。



评论已关闭