Docker storage driver(十四)

一、storage driver 作用

正常情况下,只有很少量的数据被写入到容器最上层的写入层,并且通过 volume 来写数据,然而我们也会遇到一些情况需要我们可以直接写入到容器的写入层,这我们就需要到了 storage driver 来帮忙。

Docker 使用一些列不同的 storage driver 来管理镜像层和容器层,这些 storage driver 不同于前面说到的 volume。

为了有效的使用 storage drivers,我们可以简单温习一下 storage driver 管理的镜像层和容器层的工作情况。

1、Images and layers

我们可以通过下面的 Dockerfile 文件来理解镜像的分层。

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
  • 一个镜像是有若干镜像层组成。
  • Dockerfile 中的每条指令都会生成一个镜像层,除了最上面的一层之外,其他的都是只读的。
  • 最上一层主要是镜像运行时的一些命令。
  • 每一层只是与它之前的层有一些不同,层层堆叠在一起。
  • 创建容器的时候,只是在底层上添加一个新的可写层。这一层通常称为“容器层”。

2、Container and layers

容器和镜像最大的区别在于最上层的可写层,所有对容器的新增或者修改,都会存在在可写层,当容器被删除的时候,可写层的数据也就随之被删除了,然后镜像的不会改变。

这是因为每个容器都有自己的可写层,所有的更改都会存储在容器的可写层,多个容器可以共享对同一底层映像的访问,但他们都拥有自己的数据状态,如下图所示:

Copy-on-Write

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

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

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

3、Data volumes and the storage driver

Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。Data Volume 有以下特点:

  • Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
  • 容器可以读写 volume 中的数据。
  • volume 数据可以被永久的保存,即使使用它的容器已经销毁。
  • Data volumes 不被 storage driver 所管理。
  • 对 data volume 的读写操作绕过 storage driver,以本地主机速度运行。

二、如何选择 storage driver

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

下表是官方根据不同的发行版支持推荐的 storage driver。

Linux 发行版 推荐的storage drivers
Docker CE on Ubuntu aufs, devicemapper, overlay2 (Ubuntu 14.04.4 or later, 16.04 or later), overlay, zfs, vfs
Docker CE on Debian aufs, devicemapper, overlay2 (Debian Stretch), overlay, vfs
Docker CE on CentOS devicemapper, vfs
Docker CE on Fedora devicemapper, overlay2 (Fedora 26 or later, experimental), overlay (experimental), vfs

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

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

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

root@ubuntu:~# docker info

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 19
Server Version: 17.09.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs

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

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

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

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

参考文档:https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/
https://docs.docker.com/engine/userguide/storagedriver/selectadriver/

(0)

相关推荐

  • Portainer

    一.基本介绍 (1)Portainer 是一款轻量级的图形化管理工具,通过它我们可以轻松管理不同的 docker 环境.Portainer 部署和使用都非常的简单,它由一个可以运行在任何 docker ...

  • docker容器备份、恢复和迁移volume方案

    volume作为数据的载体,在很多情况下需要对其中的数据进行备份.迁移或是恢复.下面一docker容器的volume为例,说一下备份的技巧. 我们先建立一个容器vol_simple,该容器在/date ...

  • Docker学习笔记之--安装mysql 并持久化数据到本地,最后使用Navicat连接测试(环境:centos7)

    在docker中 安装 mysql 8.0版本,参考文档:https://www.runoob.com/docker/docker-install-mysql.html 第一步:安装 docker p ...

  • docker容器与宿主机的数据交互

    在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作.方式一.Docker cp命令 docker cp :用于容器与主机之间的 ...

  • docker学习前述

    什么东西都不懂直接来学习docker是有点难的,学习docker需要哪些技术基础做支撑? Linux(相关常用的命令要会) springboot docker学习大纲如下: Docker概述 Dock ...

  • Docker 数据持久化Volume

    Docker镜像是基于联合文件系统(Union File System)的一种层式结构,由一系列指令一步一步构建出来.Docker镜像被存储在一系列的只读层中.当我们创建一个容器时,Docker会读取 ...

  • 为知笔记私有部署,每年省360软妹 ?

    2019-10-20 20:01:37 18点赞 270收藏 58评论 > 2019年10月20日,星期日 > 编写人:01Tech-Ray > 版本:1.0 1. 概述 作为云笔记 ...

  • 二十四山用通天透地日禄到山的期辰

    例:子山唯有用癸日,方能通天头,又子为癸之禄,所以子山用癸日为日禄到山,最吉 所以: 子山用癸日: 丑山用己日.辛日.癸日: 寅山用甲日.丙日.戊日: 卯山用乙日: 辰山用乙日.戊日.癸日: 巳山用庚 ...

  • 函数考点全突破(十四)二次函数中特殊平行四边形的存在性问题

    春熙初中数学 25篇原创内容 公众号 初中数学解题思路 本号致力于初中数学学习的钻研和探索.全面覆盖初中数学典型题集.解题模型.动点最值.思路方法.超级易错.几何辅助线.压轴破解等方面,欢迎关注! 1 ...

  • 中医小知识:认识十四经络

    中医之声 医学资讯 公众号 十四经络由十二经络和任脉.督脉构成,在内部隶属于脏腑,在外部分布于四肢.头面.躯干,分为手足.阴阳.脏腑三部分. 具有的疏通作用如下: 1.遍布内外,网络全身. 2.相互联 ...

  • 侵华十四年,日本共从中国掠夺了多少财富?

    从1931年入侵中国开始到1945年日本投降为止,14年中日本侵略者给中国政府和中国人民带来了沉重的灾难,他们的罪行罄竹难书,除了奴役和屠杀被占领区的人民之外,日本鬼子还从中国掠夺了数量惊人的财富,主 ...

  • 十万个冷知识(四百二十四)

    老挝的男子每个人都要经历一次剃发出家,基本上都是在小时候,时间的长短不同,有的一个礼拜,有的三年左右. 在日本不要一边走路一边吃东西,如果你发现了有自己喜欢的小吃,那么你可以买下来,站在摊位面前,吃完 ...

  • 封建礼乐话西周(十四)——西周的政体官制

    政治体制是指以国家政权组织为中心的,各种具体政治制度和政治行为规范的总和.就是使国家机器能正常运转所采取的组织形式.权限划分.工作方式等具体制度和规范. 86.1西周等级制度下各层级的主要社会作用 西 ...

  • 甲骨文上的辉煌(十四)——围观商人的衣食住行(上)

    夏商时期的文明程度是否很高?高到什么程度?这是很多人在读夏商历史时总会有的疑问. 53.1河南鹤壁鹿台阁(仿商代鹿台建筑) 如果只看古代文献和文物图片,绝大多数人都会惊叹,没想到夏商时期中国就有如此高 ...

  • 第十四回四海归心诞登帝位三军效命直捣元都

    却说杨璟.周德兴.张彬等,自湖广出师,南达永州,守将邓祖胜拒战,当即败退,元全州平章阿思兰赴援,亦被击走.祖胜敛兵固守,璟分营筑垒,就西江造了浮桥,渡兵攻城.计历数旬,城中食尽,祖胜仰药死,永州遂下. ...

  • 二十四山峰砂吉凶秘旨

    一.壬山丙向 巳峰朝来,犯官非口舌,兄弟不和.有凹主人刀伤吐血死. 艮峰高起出文人; 壬峰不起,二房不平. 坤锋高起,而大者,主换妻妾. 前峰高起,房房出人平分均匀. 亥峰独高,人丁不旺,浅内.生外, ...