Docker存储驱动

1. Docker存储驱动历史

Docker目前支持的greph driver包括:

  • AUFS
  • device-mapper
  • btrfs
  • overlayfs(重点)

关于各存储驱的详细介绍参照Docker五种存储驱动原理及应用场景和性能测试对比

2. Docker overlayfs driver

1) 介绍

docker使用overlaysf的介绍如下:

  • lowerdir指向image layer;
  • upperdir指向container layer;
  • merged整合lowerdir与upperdir提统统一视图给容器作为根文件系统

如下图:

2)容器内文件的读写优先级情况

I. read file
  • upperdir存在,从container layer读取;
  • upperdir不存在,从lowerdir,即 image layer读取;
II. write file
  • upperdir存在,直接在upperdir写;
  • upperdir不存在,overlay发起copy_up操作,从lowerdir拷贝文件到upperdir进行写,拷贝只会在第一次打开时发生。
III. deleting files and directories
  • 删除文件时,upperdir会创建一个witheout文件,会隐藏lowerdir的文件(非删除);
  • 删除目录时,upperdir会创建一个opaque diectory,隐藏lowerdir的目录;

3). overlayfs driver实践

  • 指定overlay driver启动:
$dockerd --storage-driver=overlay
$docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.06.0-ce
Storage Driver: overlay
Backing Filesystem: extfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: cfb82a876ecc11b5ca0977d1733adbe58599088a
runc version: 2d41c047c83e09a6d61d464906feb2a2f3c52aa4
init version: 949e6fa
  • 下载一个镜像:
$docker pull centos:centos6
$docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos6 7ea307891843 4 weeks ago 194MB
  • 查看镜像的对应目录
$ls /var/lib/docker/overlay/
8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7
$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/
bin etc home lib lib64 lost+found media mnt opt root sbin selinux srv tmp usr var
  • 创建容器
$docker run -it centos:centos6 /bin/bash
#在host里查看
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/
lower-id merged/ upper/ work/
cat /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/lower-id
8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7
$cat /proc/mounts
overlay /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/merged overlay rw,relatime,lowerdir=/var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root,upperdir=/var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper,workdir=/var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/work 0 0

可以看到,容器对应的目录有三个(merged, upper, work), work用于overlayfs实现copy_up操作, lower-id保存images ID。

  • 容器内创建文件
$echo "hello" > /root/f1.txt
$ls /root/
anaconda-ks.cfg f1.txt install.log install.log.syslog

Host上overlay目录变化

$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/merged/root/
anaconda-ks.cfg f1.txt install.log install.log.syslog
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/
f1.txt
$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/root/
anaconda-ks.cfg install.log install.log.syslog
  • 容器内删除文件
$rm /root/install.log
$ls /root/

Host上overlay目录变化

$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/root/
anaconda-ks.cfg install.log install.log.syslog $ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/merged/root/
anaconda-ks.cfg f1.txt install.log.syslog $ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/* -l
-rw-r--r-- 1 root root 6 Sep 3 22:17 /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/f1.txt
#发现upperdir多了一下instll.log文件
c--------- 1 root root 0, 0 Sep 3 22:24 /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/install.log $cat /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/lower-id
8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7 $ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/root/
anaconda-ks.cfg install.log install.log.syslog

Docker系统八:Docker的存储驱动的更多相关文章

  1. Docker(十八)-Docker配置DNS

    Linux系统配置DNS的时候有一个问题,就是你在/ect/resolv.conf文件中添加上nameserver XXX.XXX.XXX.XXX的时候,当时是生效的,但是机器重启之后就失效了,所以我 ...

  2. Docker存储驱动之ZFS简介

    ZFS是下一代的文件系统,支持了很多存储高级特性,如卷管理.快照.和校验.压缩和重复删除技术.拷贝等. ZFS由Sun公司创建,现属于Oracle,ZFS是开源的,并基于CDDL license.因为 ...

  3. Docker存储驱动之总览

    简介 本文会介绍Docker存储驱动的特性,别列出现在已经支持的存储驱动,最后,会介绍如果选型适合你的存储驱动. 可插拔的存储驱动架构 Docker的存储驱动架构是可插拔的,可以让你很方便的将适合你环 ...

  4. 有容云-【原理】Docker存储驱动之AUFS

    编者按:今天聊一聊Docker的Image(镜像)与Container(容器)的存储以及存储驱动之AUFS.   Docker存储驱动简介 Docker内置多种存储驱动,每种存储驱动都是基于Linux ...

  5. Docker存储驱动之OverlayFS简介

    简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...

  6. Docker存储驱动之Device Mapper简介

    Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...

  7. CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较

    写在前面: 由于红帽在Linux界的影响力,相信很多朋友在测试和生产系统用的是RedHat或者CentOS系统,这次我在CentOS系统上遇到了一个很有意思的故障,通过这次故障的原因分析及解决,特意写 ...

  8. Docker存储驱动之AUFS简介

    简介 AUFS是曾是Docker默认的首选存储驱动.它非常稳定.有很多真实场景的部署.很强的社区支持.它有以下主要优点: 极短的容器启动时间. 有效的存储利用率. 有效的内存利用率. 虽然如此,但由于 ...

  9. Docker存储驱动之Btrfs简介

    简介 Btrfs是下一代的copy-on-write文件系统,它支持很多高级特性,使其更加适合Docker.Btrfs合并在内核主线中,并且它的on-disk-format也逐渐稳定了.不过,它的很多 ...

随机推荐

  1. 自己用的一套reset.css,打算整理一下方便以后用,持续更新中,各位大神,不喜勿喷

    *{margin: 0; padding: 0;border:none;}img{vertical-align: top;width: 100%;border: none;}ul,li{list-st ...

  2. AQS 框架之 Unsafe 源码详解

    ■ 前言 之前 LockSupport那篇已经叙述了是线程阻塞工具类,其底层由 Unsafe 实现,即 park(), unpark() 方法,获取指针偏移量,并操纵内存.本篇主要介绍 Unsafe ...

  3. 使用hexo搭建个人博客

    安装前提 node.js git 如果缺少以上条件,则前往相应的官网下载安装即可.. 安装hexo $ npm install hexo-cli -g 待安装完成后,执行相关命令查看hexo的信息. ...

  4. 03_Linux文件和目录

    一.Linux目录结构 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录.所有的东西都是从这里开始.当你在终端里输入"/home",你其实是在告诉电脑,先从/( ...

  5. python threading queue模块中join setDaemon及task_done的使用方法及示例

    threading:     t.setDaemon(True)  将线程设置成守护线程,主进行结束后,此线程也会被强制结束.如果线程没有设置此值,则主线程执行完毕后还会等待此线程执行.     t. ...

  6. MySQL笔记-union

    union语法 select ... union [all | distinct] selct ... union用于把来自多个select语句的结果组合在一个结果集中. 两次查询的列表必须相同,否则 ...

  7. xBIM 基本的模型操作

    目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...

  8. BZOJ 1969: [Ahoi2005]LANE 航线规划 [树链剖分 时间倒流]

    题意: 一张图,删除边,求两点之间的割边数量.保证任意时刻图连通 任求一棵生成树,只有树边可能是割边 时间倒流,加入一条边,就是两点路径上的边都不可能是割边,区间覆盖... 然后本题需要把边哈希一下, ...

  9. BZOJ 4078: [Wf2014]Metal Processing Plant [放弃了]

    以后再也不做$World Final$的题了................ 还我下午 bzoj上TLE一次后就不敢交了然后去uva交 Claris太神了代码完全看不懂 还有一个代码uva上竟然WA了 ...

  10. BZOJ 3907: 网格 [Catalan数 高精度]

    3907: 网格 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 402  Solved: 180[Submit][Status][Discuss] De ...