[第二部:容器和微服务架构](3)Docker应用程序中的状态和数据

简介: [第二部:容器和微服务架构](3)Docker应用程序中的状态和数据

在大多数情况下,可以将容器视为流程的实例。进程不保持持久状态。虽然容器可以写入其本地存储,但假设实例无限期地存在,就像假设内存中的单个位置是持久的一样。您应该假设容器映像(如进程)具有多个实例,或者最终将被终止。如果它们是由容器编排器管理的,则应该假设它们可能会从一个节点或VM移动到另一个节点或VM。

以下解决方案用于管理Docker应用程序中的数据:

从Docker主机,作为Docker卷:

  • 卷存储在Docker管理的主机文件系统的一个区域中。
  • 绑定挂载可以映射到主机文件系统中的任何文件夹,因此无法从Docker进程控制访问,并且由于容器可以访问敏感的OS文件夹,因此可能会带来安全风险。
  • tmpfs挂载就像虚拟文件夹,只存在于主机的内存中,从不写入文件系统。

从远程存储:

  • Azure存储提供了地理分布存储,为容器提供了一个良好的长期持久性解决方案。
  • 远程关系数据库,如Azure SQL数据库或NoSQL数据库,如Azure Cosmos DB,或缓存服务,如Redis。

从Docker容器:

  • 覆盖文件系统。此Docker功能实现了一个写时拷贝任务,该任务将更新的信息存储到容器的根文件系统中。该信息位于容器所基于的原始图像的“顶部”。如果容器从系统中删除,则这些更改将丢失。因此,虽然可以将容器的状态保存在其本地存储中,但围绕此设计系统将与容器设计的前提冲突,容器设计的前提默认为无状态。

不过,使用Docker卷现在是处理Docker中本地数据的首选方法。如果您需要更多关于容器中存储的信息,请查看Docker存储驱动程序和存储驱动程序。

以下提供了有关这些选项的详细信息:

  • 是从主机操作系统映射到容器中目录的目录。当容器中的代码可以访问该目录时,该访问实际上是对主机操作系统上的一个目录的访问。此目录不与容器本身的生存期绑定,该目录由Docker管理,并与主机的核心功能隔离。因此,数据卷被设计成独立于容器的生命周期来保存数据。如果从Docker主机中删除容器或图像,则不会删除保存在数据卷中的数据。
  • 可以命名或匿名(默认)。命名卷是数据卷容器的发展,使容器之间的数据共享变得容易。卷还支持允许您在远程主机上存储数据的卷驱动程序,以及其他选项。
  • 绑定挂载很久以前就可用了,允许将任何文件夹映射到容器中的挂载点。绑定装载具有比卷更多的限制和一些重要的安全问题,因此建议使用卷。
  • tmpfs挂载基本上是虚拟文件夹,只存在于主机的内存中,从不写入文件系统。它们快速、安全,但使用内存,仅用于临时、非持久性数据。

如图5所示,常规Docker卷可以存储在容器本身之外,但在主机服务器或虚拟机的物理边界内。但是,Docker容器无法从一个主机服务器或虚拟机访问卷

到另一个主机服务器或虚拟机。换句话说,使用这些卷,不可能管理在不同Docker主机上运行的容器之间共享的数据,尽管可以使用支持远程主机的卷驱动程序来实现。


图 5基于容器的应用程序的卷和外部数据源

卷可以在容器之间共享,但只能在同一主机中共享,除非使用支持远程主机的远程驱动程序。此外,当Docker容器由编排器管理时,容器可能在主机之间“移动”,这取决于集群执行的优化。因此,不建议将数据卷用于业务数据。但它们是处理跟踪文件、临时文件或类似不会影响业务数据一致性的文件的良好机制。

  • 远程数据源和缓存工具(如Azure SQL Database、Azure Cosmos DB或远程缓存(如Redis))可以在容器化应用程序中使用,就像在没有容器的情况下开发时使用它们一样。这是一种行之有效的存储业务应用程序数据的方法。
  • Azure存储。业务数据通常需要放在外部资源或数据库中,如Azure存储。具体来说,Azure存储在云中提供以下服务:
  1. Blob存储存储非结构化对象数据。blob可以是任何类型的文本或二进制数据,例如文档或媒体文件(图像、音频和视频文件)。Blob存储也称为对象存储。
  2. 文件存储为使用标准SMB协议的传统应用程序提供共享存储。Azure虚拟机和云服务可以通过挂载的共享跨应用程序组件共享文件数据。本地应用程序可以通过文件服务REST API访问共享中的文件数据。
  3. 表存储存储结构化数据集。表存储是一种NoSQL关键属性数据存储,它允许快速开发和快速访问大量数据。
  • 关系数据库和NoSQL数据库。外部数据库有许多选择,从关系数据库如SQL Server、PostgreSQL、Oracle或NoSQL数据库如Azure Cosmos DB、MongoDB等。这些数据库不会作为本指南的一部分进行说明,因为它们属于完全不同的主题。

最佳实践

  • 不要在docker容器或docker主机(虚拟机)的本地文件中存储任何配置信息。
  • 建议您将配置信息存储在对象存储或其他全局存储服务中。
  • 不要使用本地缓存(如Java Hashmap),建议使用全局缓存(如Redis服务)
相关文章
|
6天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
6天前
|
消息中间件 监控 持续交付
构建高效微服务架构:后端开发的进阶之路
【4月更文挑战第20天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。微服务架构作为一种新兴的分布式系统设计方式,以其独立部署、易于扩展和维护的特点,成为解决这一问题的关键。本文将深入探讨微服务的核心概念、设计原则以及在后端开发实践中如何构建一个高效的微服务架构。我们将从服务划分、通信机制、数据一致性、服务发现与注册等方面入手,提供一系列实用的策略和建议,帮助开发者优化后端系统的性能和可维护性。
|
1天前
|
监控 测试技术 持续交付
探索现代微服务架构的最佳实践
【4月更文挑战第25天】 随着软件开发领域不断演进,微服务架构已成为设计灵活、可扩展且高度可维护系统的首选方案。本文将深入探讨构建和部署微服务时的关键最佳实践,涵盖从服务划分原则到持续集成/持续部署(CI/CD)的流程,再到监控与日志记录的策略。我们的目标是为开发者提供一套实用的指南,帮助他们在构建未来的应用程序时做出明智的架构选择,并确保这些系统能够快速响应市场和技术的变化。
|
2天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
2天前
|
持续交付 API 开发者
构建高效微服务架构:后端开发的新范式
【4月更文挑战第24天】 随着现代软件系统的复杂性日益增加,传统的单体应用已难以满足快速迭代与灵活扩展的需求。微服务架构作为一种新兴的软件开发模式,以其服务的细粒度、独立部署和弹性伸缩等优势,正在逐渐成为后端开发的重要趋势。本文将深入探讨微服务架构的设计原则、关键技术以及在实际业务中的应用实践,旨在为后端开发者提供构建和维护高效微服务架构的参考指南。
|
2天前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令
11 1
|
3天前
|
监控 API 持续交付
构建高效微服务架构:后端开发的新趋势
【4月更文挑战第23天】 随着现代软件开发实践的不断演进,微服务架构已经成为企业追求敏捷、可扩展和弹性解决方案的首选。本文深入探讨了如何构建一个高效的微服务架构,涵盖了关键的设计原则、技术选型以及实践建议。通过分析微服务的独立性、分布式特性和容错机制,我们将揭示如何利用容器化、服务网格和API网关等技术手段,来优化后端系统的可维护性和性能。文章旨在为后端开发人员提供一套全面的指南,以应对不断变化的业务需求和技术挑战。
|
7天前
|
Kubernetes Cloud Native Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(下)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
41 0
|
7天前
|
Cloud Native 算法 Go
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)(上)
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
32 0
|
8天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
13 0

热门文章

最新文章