Closed vieyahn2017 closed 6 years ago
当前docker支持的storage driver包括:aufs,brtfs,devicemap,OverlayFs,ZFS 5种存储驱动。参考: https://docs.docker.com/engine/userguide/storagedriver/和 https://success.docker.com/Get_Help/Compatibility_Matrix_and_Maintenance_Lifecycle种的说明,当前生产环境中建议如下: rhel,centos,fedora:devicemapper direct-lvm ubuntu:aufs suse:brtfs 当前,生产环境中不建议使用zfs及overlayfs。
docker info可以查看: 比如:
docker info
Containers: 4
Images: 861
Storage Driver: aufs
Root Dir: /home/docker/aufs
Backing Filesystem: extfs
Dirs: 869
Dirperm1 Supported: false
Execution Driver: native-0.2
Kernel Version: 3.13.0-24-generic
Operating System: Ubuntu 14.04 LTS
CPUs: 8
Total Memory: 47.15 GiB
Name: CTU1000031617
ID: ZHEZ:YTGV:XCKB:LIRW:WJNY:XZQT:CS5G:DEFJ:VQEN:2D74:HRH6:IVH5
【转载】Docker基础技术:AUFS 日期:2015-08-28 09:04浏览:97评论:0 http://coolshell.cn/articles/17061.html
AUFS是一种Union File System,所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。UnionFS的一个最主要的应用是,把一张CD/DVD和一个硬盘目录给联合 mount在一起,然后,你就可以对这个只读的CD/DVD上的文件进行修改(当然,修改的文件存于硬盘上的目录里)。
AUFS又叫Another UnionFS,后来叫Alternative UnionFS,后来可能觉得不够霸气,叫成Advance UnionFS。是个叫Junjiro Okajima(岡島順治郎)在2006年开发的,AUFS完全重写了早期的UnionFS 1.x,其主要目的是为了可靠性和性能,并且引入了一些新的功能,比如可写分支的负载均衡。AUFS在使用上全兼容UnionFS,而且比之前的UnionFS在稳定性和性能上都要好很多,后来的UnionFS 2.x开始抄AUFS中的功能。但是他居然没有进到Linux主干里,就是因为Linus不让,基本上是因为代码量比较多,而且写得烂(相对于只有3000行的union mount和10000行的UnionFS,以及其它平均下来只有6000行代码左右的VFS,AUFS居然有30000行代码),所以,岡島不断地改进代码质量,不断地提交,不断地被Linus拒掉,所以,到今天AUFS都还进不了Linux主干(今天你可以看到AUFS的代码其实还好了,比起OpenSSL好N倍,要么就是Linus对代码的质量要求非常高,要么就是Linus就是不喜欢AUFS)。
不过,好在有很多发行版都用了AUFS,比如:Ubuntu 10.04,Debian6.0, Gentoo Live CD支持AUFS,所以,也OK了。
DOCKER存储驱动之AUFS简介 https://www.cnblogs.com/styshoo/p/6442041.html
Docker基础技术:DeviceMapper 日期:2015-08-31 08:47浏览:64评论:0 http://coolshell.cn/articles/17200.html 在上一篇介绍AUFS的文章中,大家可以看到,Docker的分层镜像是怎么通过UnionFS这种文件系统做到的,但是,因为Docker首选的AUFS并不在Linux的内核主干里,所以,对于非Ubuntu的Linux分发包,比如CentOS,就无法使用AUFS作为Docker的文件系统了。于是作为第二优先级的DeviceMapper就被拿出来做分层镜像的一个实现。
Device Mapper 简介 DeviceMapper自Linux 2.6被引入成为了Linux最重要的一个技术。它在内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,它包含三个重要的对象概念,Mapped Device、Mapping Table、Target device。
Mapped Device 是一个逻辑抽象,可以理解成为内核向外提供的逻辑设备,它通过Mapping Table描述的映射关系和 Target Device 建立映射。Target device 表示的是 Mapped Device 所映射的物理空间段,对 Mapped Device 所表示的逻辑设备来说,就是该逻辑设备映射到的一个物理设备。
Mapping Table里有 Mapped Device 逻辑的起始地址、范围、和表示在 Target Device 所在物理设备的地址偏移量以及Target 类型等信息(注:这些地址和偏移量都是以磁盘的扇区为单位的,即 512 个字节大小,所以,当你看到128的时候,其实表示的是128*512=64K)。
DeviceMapper 中的逻辑设备Mapped Device不但可以映射一个或多个物理设备Target Device,还可以映射另一个Mapped Device,于是,就是构成了一个迭代或递归的情况,就像文件系统中的目录里除了文件还可以有目录,理论上可以无限嵌套下去。
DeviceMapper在内核中通过一个一个模块化的 Target Driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的插件包括软 Raid、加密、多路径、镜像、快照等,这体现了在 Linux 内核设计中策略和机制分离的原则。如下图所示。从图中,我们可以看到DeviceMapper只是一个框架,在这个框架上,我们可以插入各种各样的策略(让我不自然地想到了面向对象中的策略模式),在这诸多“插件”中,有一个东西叫Thin Provisioning Snapshot,这是Docker使用DeviceMapper中最重要的模块。
Thin Provisioning要怎么翻译成中文,真是一件令人头痛的事,我就不翻译了。这个技术是虚拟化技术中的一种。它是什么意思呢?你可以联想一下我们计算机中的内存管理中用到的——“虚拟内存技术”——操作系统给每个进程N多N多用不完的内址地址(32位下,每个进程可以有最多2GB的内存空间),但是呢,我们知道,物理内存是没有那么多的,如果按照进程内存和物理内存一一映射来玩的话,那么,我们得要多少的物理内存啊。所以,操作系统引入了虚拟内存的设计,意思是,我逻辑上给你无限多的内存,但是实际上是实报实销,因为我知道你一定用不了那么多,于是,达到了内存使用率提高的效果。(今天云计算中很多所谓的虚拟化其实完全都是在用和“虚拟内存”相似的Thin Provisioning的技术,所谓的超配,或是超卖)
好了,话题拉回来,我们这里说的是存储。看下面两个图(图片来源),第一个是Fat Provisioning,第二个是Thin Provisioning,其很好的说明了是个怎么一回事(和虚拟内存是一个概念)
thin-provisioning-1thin-provisioning-2
那么,Docker是怎么使用Thin Provisioning这个技术做到像UnionFS那样的分层镜像的呢?答案是,Docker使用了Thin Provisioning的Snapshot的技术。下面我们来介绍一下Thin Provisioning的Snapshot。
docker 镜像与容器存储目录结构精讲 https://blog.csdn.net/wanglei_storage/article/details/50299491 很多朋友在初学 docker 的时候非常迷茫,不清楚 docker 是怎样的一种存储方式,并且也不清楚 docker 到底存储在什么地方。其实 docker 的镜像与容器都存储在 /var/lib/docker 下面,那么基于不同的系统又有不同的存储方式,在 ubuntu 下面存储方式为 AUFS;在 Centos 下面存储方式又是 device mapper,下面我们先来看一下 /var/lib/docker 目录,分别有三个阶段,看看在不同阶段都新增了那些东西及镜像与容器存储结构的变化:
前面我们说过,centos 下面 docker 使用 devicemapper 的存储方式,所以在 /var/lib/docker 下面出现了 devicemapper 目录
[略]
总结(每个文件及作用):
1、/var/lib/docker/devicemapper/devicemapper/data #用来存储相关的存储池数据
2、/var/lib/docker/devicemapper/devicemapper/metadata #用来存储相关的元数据。
3、/var/lib/docker/devicemapper/metadata/ #用来存储 device_id、大小、以及传输_id、初始化信息
4、/var/lib/docker/devicemapper/mnt #用来存储挂载信息
5、/var/lib/docker/container/ #用来存储容器信息
6、/var/lib/docker/graph/ #用来存储镜像中间件及本身详细信息和大小 、以及依赖信息
7、/var/lib/docker/repositores-devicemapper #用来存储镜像基本信息
8、/var/lib/docker/tmp #docker临时目录
9、/var/lib/docker/trust #docker信任目录
10、/var/lib/docker/volumes #docker卷目录
我们来查看下 /var/lib/docker/graph 目录下到底有什么鬼?:
[root@docker-100 graph]# tree /var/lib/docker/graph/
/var/lib/docker/graph/
├── 168a69b6220279e6d5bd8dafd2edf71434a08e32b60a7060f7a705f64857169d
│ ├── json
│ ├── layersize
│ └── tar-data.json.gz
├── 4234bfdd88f8ed2bc4607bd2ebba2d41d61e2693ad0d184e7b05e1b57f8b8b33
│ ├── json
│ ├── layersize
│ └── tar-data.json.gz
├── 47d44cb6f252ea4f6aecf8a447972de5d9f9f2e2bec549a2f1d8f92557f4d05a
│ ├── json
│ ├── layersize
│ └── tar-data.json.gz
├── 812e9d9d677f15c39277b2edc8f9bc07354c899483409bb07d1c13c2b9c33ec8
│ ├── json
│ ├── layersize
│ └── tar-data.json.gz
├── ce20c473cd8ac1fab6601529ce6a075743f2cf7a8f4cfed2216f8cfcb53bfc4e
│ ├── json
│ ├── layersize
│ └── tar-data.json.gz
└── _tmp
原来是在每个images 本身及中间件下面多了三个文件,分别为(json、layersize、tar-data.json.gz),那我们来分别查看下这三个文件是干嘛的!
1、json (json 文件是用来描述 images 本身或者中间件的详细信息)
[root@docker-100 graph]# cat /var/lib/docker/graph/168a69b6220279e6d5bd8dafd2edf71434a08e32b60a7060f7a705f64857169d/json | python -mjson.tool
{
"Size": 172284372,
"architecture": "amd64",
"author": "The CentOS Project <cloud-ops@centos.org>",
"config": {
"AttachStderr": false,
"AttachStdin": false,
"AttachStdout": false,
"Cmd": null,
"Domainname": "",
"Entrypoint": null,
"Env": null,
"ExposedPorts": null,
"Hostname": "7aa5783a47d5",
"Image": "47d44cb6f252ea4f6aecf8a447972de5d9f9f2e2bec549a2f1d8f92557f4d05a",
"Labels": null,
"MacAddress": "",
"NetworkDisabled": false,
"OnBuild": null,
"OpenStdin": false,
"PublishService": "",
"StdinOnce": false,
"Tty": false,
"User": "",
"VolumeDriver": "",
"Volumes": null,
"WorkingDir": ""
},
"container": "7aa5783a47d56a1dd5b9f60dfa3dcc7ad83479f380137272e7493aa2e317d1cc",
"container_config": {
"AttachStderr": false,
"AttachStdin": false,
"AttachStdout": false,
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ADD file:125fe45519717bec39f64a67dfc5cd0ac1c8733963d71510ba770817d9466fcb in /"
],
"Domainname": "",
"Entrypoint": null,
"Env": null,
"ExposedPorts": null,
"Hostname": "7aa5783a47d5",
"Image": "47d44cb6f252ea4f6aecf8a447972de5d9f9f2e2bec549a2f1d8f92557f4d05a",
"Labels": null,
"MacAddress": "",
"NetworkDisabled": false,
"OnBuild": null,
"OpenStdin": false,
"PublishService": "",
"StdinOnce": false,
"Tty": false,
"User": "",
"VolumeDriver": "",
"Volumes": null,
"WorkingDir": ""
},
"created": "2015-10-13T23:29:00.133774303Z",
"docker_version": "1.8.2",
"id": "168a69b6220279e6d5bd8dafd2edf71434a08e32b60a7060f7a705f64857169d",
"os": "linux",
"parent": "47d44cb6f252ea4f6aecf8a447972de5d9f9f2e2bec549a2f1d8f92557f4d05a"
}
docker inspect # 查看容器信息
docker inspect 10.183.118.211:5000/dj_simu:base
docker的storagedriver 包括aufs和DeviceMapper