Docker 的两类存储资源 - 每天5分钟玩转 Docker 容器技术(38)

我们从本章开始讨论 Docker 存储。

Docker 为容器提供了两种存放数据的资源:

  1. 由 storage driver 管理的镜像层和容器层。
  2. Data Volume。

我们会详细讨论它们的原理和特性。

storage driver

在前面镜像章节我们学习到 Docker 镜像的分层结构,简单回顾一下。

容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中。这样的分层结构最大的特性是 Copy-on-Write:

  1. 新数据会直接存放在最上面的容器层。
  2. 修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。
  3. 如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。

分层结构使镜像和容器的创建、共享以及分发变得非常高效,而这些都要归功于 Docker storage driver。正是 storage driver 实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图。

Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。对于 Docker 用户来说,具体选择使用哪个 storage driver 是一个难题,因为:

  1. 没有哪个 driver 能够适应所有的场景。
  2. driver 本身在快速发展和迭代。

不过 Docker 官方给出了一个简单的答案:
优先使用 Linux 发行版默认的 storage driver

Docker 安装时会根据当前系统的配置选择默认的 driver。默认 driver 具有最好的稳定性,因为默认 driver 在发行版上经过了严格的测试。

运行docker info查看 Ubuntu 的默认 driver:

Ubuntu 用的 AUFS,底层文件系统是 extfs,各层数据存放在 /var/lib/docker/aufs。

Redhat/CentOS 的默认 driver 是 Device Mapper,SUSE 则是 Btrfs。

对于某些容器,直接将数据放在由 storage driver 维护的层中是很好的选择,比如那些无状态的应用。无状态意味着容器没有需要持久化的数据,随时可以从镜像直接创建。

比如 busybox,它是一个工具箱,我们启动 busybox 是为了执行诸如 wget,ping 之类的命令,不需要保存数据供以后使用,使用完直接退出,容器删除时存放在容器层中的工作数据也一起被删除,这没问题,下次再启动新容器即可。

但对于另一类应用这种方式就不合适了,它们有持久化数据的需求,容器启动时需要加载已有的数据,容器销毁时希望保留产生的新数据,也就是说,这类容器是有状态的。

这就要用到 Docker 的另一种存储机制:Data Volume,下一节我们讨论。

有个好消息:出版社现在搞促销,《每天5分钟玩转OpenStack》直降26元,全网最低价销售,有兴趣的同学可以访问 https://detail.tmall.com/item.htm?id=543416839771 了解详情。

时间: 2024-10-26 20:47:03

Docker 的两类存储资源 - 每天5分钟玩转 Docker 容器技术(38)的相关文章

如何实现跨 Docker 主机存储?- 每天5分钟玩转 Docker 容器技术(73)

从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器. 无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的 web 服务器. 有状态是指容器需要保存数据,而且数据会发生变化,访问的结果依赖之前请求的处理结果,最典型的就是数据库服务器. 简单来讲,状态(state)就是数据,如果容器需要处理并存储数据,它就是有状态的,反之则无状态. 对于有状态的容器,如何保存数据呢? 前面在 Docker 存储章节我们学习

Docker系列之(一):10分钟玩转Docker(转)

1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是一个开源的应用容器引擎,可以把应用以及依赖包放到一个可移植的容器中,然后发布到任何流行的 Linux 系统上,通过这种方式实现虚拟化. 提到虚拟化,大家应该十分熟悉了,有VMware,Xen,KVM等等很多.那么,Docker和VM有什么不同呢,我们用官网的一张图来说明一下. 可以看出,Docker

Docker系列之(一):10分钟玩转Docker

1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是一个开源的应用容器引擎,可以把应用以及依赖包放到一个可移植的容器中,然后发布到任何流行的 Linux 系统上,通过这种方式实现虚拟化. 提到虚拟化,大家应该十分熟悉了,有VMware,Xen,KVM等等很多.那么,Docker和VM有什么不同呢,我们用官网的一张图来说明一下. 可以看出,Docker

k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)

命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2 在命令行中通过参数指定资源的属性. 2. 通过配置文件和 kubectl apply 创建,要完成前面同样的工作,可执行命令: kubectl apply -f nginx.yml nginx.yml 的内容为: 资源的属性写在配置文件中,文件格式为 YAML

Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)

service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一:打包在容器里. 显然不行.除非数据不会发生变化,否则,如何在多个副本直接保持同步呢? 选项二:数据放在 Docker 主机的本地目录中,通过 volume 映射到容器里. 位于同一个主机的副本倒是能够共享这个 volume,但不同主机中的副本如何同步呢? 选项三:利用 Docker 的 volum

volume 生命周期管理 - 每天5分钟玩转 Docker 容器技术(44)

Data Volume 中存放的是重要的应用数据,如何管理 volume 对应用至关重要.前面我们主要关注的是 volume 的创建.共享和使用,本节将讨论如何备份.恢复.迁移和销毁 volume. 备份 因为 volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份. 还记得前面我们是如何搭建本地 Registry 的吗? 所有的本地镜像都存在 host 的 /myregistry 目录中,我们要做的就是定期备份这个目录. 恢复 volume

k8s 重要概念 - 每天5分钟玩转 Docker 容器技术(117)

在实践之前,必须先学习 Kubernetes 的几个重要概念,它们是组成 Kubernetes 集群的基石. Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用. Master Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行.Master 运行 Linux 操作系统,可以是物理机或者虚拟机.为了实现高可用,可以运行多个 Master. Node Node 的职责是运行容器应用.Node 由

用 k8s 运行一次性任务 - 每天5分钟玩转 Docker 容器技术(132)

容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容器就退出. Kubernetes 的 Deployment.ReplicaSet 和 DaemonSet 都用于管理服务类容器:对于工作类容器,我们用 Job. 先看一个简单的 Job 配置文件 myjob.yml: ① batch/v1 是当前 Job 的 apiVersion. ② 指明当前资源

再次实践 MySQL chart - 每天5分钟玩转 Docker 容器技术(166)

学习了 chart 结构和模板的知识后,现在重新实践一次 MySQL chart,相信会有更多收获. chart 安装前的准备 作为准备工作,安装之前需要先清楚 chart 的使用方法.这些信息通常记录在 values.yaml 和 README.md 中.除了下载源文件查看,执行 helm inspect values 可能是更方便的方法. 输出的实际上是 values.yaml 的内容.阅读注释就可以知道 MySQL chart 支持哪些参数,安装之前需要做哪些准备.其中有一部分是关于存储的