最常见的 Docker 使用方法(二)

433 阅读11分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

书接上文

六、用于多租户

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

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

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

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

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

七、加速 CI/CD 管道部署

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

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

八、独立的应用基础设施

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

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

九、可移植性——将任何应用程序运送到任何地方

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

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

十、混合云和多云支持

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

多亏了 Docker,企业可以构建混合和多云环境,其中包含来自不同供应商的两个或多个公共/私有云。你可以选择服务并根据安全协议和服务级别协议将它们分布在不同的云中。

十一、降低成本

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

十二、安全实践

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

当容器启动时,Docker 会激活一组限制功能,通过细粒度的访问控制来增强二进制根目录。这提供了更高的安全性,因为许多以 root 身份运行的进程不需要真正的 root 权限。因此,他们可以以较小的权限进行操作。另一个重要功能是使用 dockerd 配置文件中定义的 Docker 内容信任签名验证功能运行签名图像。

十三、灾难恢复

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

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

十四、简单的基础设施扩展 

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

十五:依赖管理

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

尝试重现环境时,应注意操作系统、语言和包依赖性。如果您使用 Python 语言,则需要依赖项管理工具,例如 virtualenv、venv 和 pyenv。如果新环境没有像 git 这样的工具,你需要创建一个脚本来安装 git CLI。该脚本会针对不同的操作系统和操作系统版本不断变化,因此每个团队成员都应该了解这些工具,这并不总是那么容易。  无论是操作系统、语言还是 CLI 工具依赖,Docker 都是依赖管理的最佳工具。通过简单地在 dockerfile 中定义配置及其依赖项,你可以将应用程序无缝地移动到另一台机器或环境,而无需记住依赖项、担心包冲突或跟踪用户首选项和本地机器配置。

结论

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