Docker容器的持久存储模式

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文讲的是Docker容器的持久存储模式,【编者的话】本文讨论了Docker容器的持久存储模式,包括默认模式、数据卷模式、只含数据的容器、从主机映射而得的数据卷、从主机映射而得的数据卷且存储后端是共享存储以及 Convoy 存储插件,其中第 2-4 种支持容器持久性,即升级容器也不会移除数据;第 5-6 种支持主机持久性,即主机失效也不会引起数据丢失。
本文讲的是Docker容器的持久存储模式 【编者的话】本文讨论了Docker容器的持久存储模式,包括默认模式、数据卷模式、只含数据的容器、从主机映射而得的数据卷、从主机映射而得的数据卷且存储后端是共享存储以及 Convoy 存储插件,其中第 2-4 种支持容器持久性,即升级容器也不会移除数据;第 5-6 种支持主机持久性,即主机失效也不会引起数据丢失。

简介

说到Docker,持久存储是一个需要小心处理的问题。通常一个服务的升级流程是关停旧版本容器,然后拉取并启动新版本容器。默认情况下,旧版容器包含的所有数据都会被消除,我们当然不想这样。

dockerdatapatterns-container_service_upgrade.jpg


本文将讨论保证数据持久性的几种模式:
  • 默认模式:不支持任何持久性
  • 数据卷:容器持久性
  • 仅含数据的容器:容器持久性
  • 从主机映射而得的卷:容器持久性
  • 从主机映射而得的卷,存储后端是共享存储:主机持久性
  • Convoy 卷插件:主机持久性

上述几种持久性(我自己发明的)是什么意思呢?
  • 容器持久性:升级容器并不会移除数据
  • 主机持久性:主机失效也不会引起数据丢失

下面一一解释这些持久存储模式。

默认模式

这是最基本的一种持久存储模式。创建容器时没有指定任何与卷相关的选项,数据保存在容器内部。前文已经提及,升级容器会导致容器数据丢失。如果容器是无状态的,这当然没问题;如果容器是有状态的,需要持久保存数据(例如,数据库容器),默认模式显然就不适合了。

dockerdatapatterns-container_only.jpg


数据卷

在创建容器时指定  volume  选项。数据卷位于主机系统的特定位置下(例如, /var/lib/docker/volumes/_container_name_/_data 目录下,可用  docker inspect  命令查看),升级容器时不会改动这些数据。

dockerdatapatterns-volume_only.jpg


只包含数据的容器

只包含数据的容器 与典型的数据卷相比略有不同。首先创建一个数据卷容器(通常以 busybox 或 alpine 为基础镜像),然后在启动主容器时使用  -volumes-from  选项,把数据卷容器的所有卷映射到主容器内。这是一种典型的 随从 模式实现。

dockerdatapatterns-volumes_from_data_container.jpg


从主机映射而得的数据卷

这种模式是把主机的目录映射为容器的数据卷。在数据卷模式中,容器的文件夹实际上保存在主机 /var/lib/docker/volumes/ 目录下面的一个文件。而 从主机映射的卷 是直接建立容器与主机之间的目录映射。这种方式与数据卷模式具有相同的优点,也可以混合使用这两种模式。这种模式的主要缺点是容器与主机之间的权限(uid/gid)映射。

dockerdatapatterns-host_mapping.jpg


从主机映射而得的数据卷,存储后端是共享存储

把共享存储(例如, NFS, Gluster ...)的文件夹映射为主机的文件夹,再映射为容器的卷。这种模式的主要优点是:即使主机失效,容器的数据也不会丢失。

dockerdatapatterns-shared_storage_host_mapping.jpg


Convoy 卷插件

主机级别的持久存储映射感觉还是有些“静态”——你必须保证所有主机默认具有相同的文件夹结构,否则终有一天会遇上麻烦。

Convoy  是 docker 的一个存储卷插件,起一个中介容器的作用:确保容器的数据卷链接到共享存储,目前实现了 NFS 和 Gluster 两种共享存储的支持,其他共享存储的支持据说“即将”实现。

dockerdatapatterns-convoy.jpg


其他模式

还有很多其他的持久存储模式。如果你有独特的持久存储模式,告诉我一声!

Flocker

我知道  Flocker  ,虽然没试用过,看起来挺不错的。

diagram-1.jpg


结论

  • Docker 支持数据持久性!
  • 记住有多种持久存储模式,每一种各有利弊。
  • 专业诀窍:一定要测试你选择的持久模式!与自我修复(resilience)和性能相关的方方面面都要进行复核。

原文链接:Docker : Storage Patterns for Persistence (翻译:柳泉波)

原文发布时间为: 2016-05-09 
本文作者:bnuhero 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Docker容器的持久存储模式
目录
相关文章
|
1天前
|
Shell Linux Docker
docker常用命令大全(基础、镜像、容器、数据卷)
这些命令仅仅是 Docker 命令行工具的冰山一角,但对于日常操作来说已经非常全面。通过熟练地使用这些基础命令,用户可以有效地管理 Docker 的镜像、容器、数据卷和网络。随着用户对 Docker 的深入使用,更高级的命令和选项将会变得必需,但上面列出的命令已经为用户提供了一个坚实的起点。对于初学者来说,理解和掌握这些常用命令是深入学习 Docker 的基础。
21 4
docker常用命令大全(基础、镜像、容器、数据卷)
|
3天前
|
Docker Python 容器
容器化技术,特别是Docker,已经成为现代软件开发和部署的重要工具。
容器化技术,特别是Docker,已经成为现代软件开发和部署的重要工具。
|
2天前
|
弹性计算 运维 应用服务中间件
容器的优势,在Docker中运行Tomcat
摘要:了解Docker与虚拟机的区别:虚拟机使用Hypervisor创建完整操作系统,而容器通过namespace和cgroup实现轻量级隔离,共享主机内核。Docker启动快、资源利用率高,适合快速部署和跨平台移植。但安全性相对较低。示例介绍了如何通过Docker搜索、拉取官方Tomcat镜像并运行容器,最后验证Tomcat服务的正常运行。
|
2天前
|
安全 网络协议 云计算
Docker容器网络配置详解
【7月更文挑战第16天】Docker的网络配置是实现容器间以及容器与外部网络通信的基础。通过选择合适的网络模式和配置选项,可以构建高效、安全、可扩展的Docker网络解决方案。
|
2天前
|
Java Scala 流计算
实时计算 Flink版产品使用问题之Docker镜像中的Java路径和容器内的Java路径不一致,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3天前
|
运维 Ubuntu Docker
Docker镜像和容器使用
【7月更文挑战第2天】Docker 概要:Docker 镜像是只读模板,包含运行应用的环境和代码,像蓝图一样。构建镜像可通过基于现有镜像(如 Ubuntu)安装软件后提交,或使用 Dockerfile 定义构建过程。Docker 容器是镜像的运行时实例,`docker run` 命令可创建并运行容器。常用容器操作包括启动/停止、状态检查和交互式进入。通过端口映射,容器服务可从主机访问,促进应用部署和管理的便捷性。
|
3天前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
1月前
|
Shell Docker 容器
深入探索Docker容器管理:常用命令一览(1)
深入探索Docker容器管理:常用命令一览(1)
|
2月前
|
Linux 开发者 Docker
如何构建在 Docker 容器中运行命令?
【1月更文挑战第6天】
86 0
|
2月前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令
77 1