现在就开始今天的分享~

M老师:docker 的很多特性都表现在它所使用的文件系统上,比如大家都知道docker的文件系统是分层的,所以它可以快速迭代,可以回滚。这个回滚机制跟github很像,每次提交的时候都会有一个id, 回滚就是跟据这个id来操作的。

M老师:docker所支持的文件系统有以下几种:Aufs、devicemapper、btrfs和Vfs,其中前三种是联合文件系统,可以支持分层,VFS 不支持。平时用的最多的是aufs 和devicemapper。

M老师:先介绍一下Aufs,Aufs(advanced multi layered unification filesystem), 直译过来就是高级分层联合文件系统,做为一种Union FS ,它支持将不同的目录挂载到同一个虚拟文件系统下。

M老师:这个怎么理解呢,通过一条命令我们来看一下:

mount -t aufs -o br=/tmp/dir1=ro:/tmp/dir2=rw none /tmp/newfs

M老师:大家有条件的可以一起做下实验,方便理解,-o 指定mount传递给文件系统的参数;br 指定需要挂载的文件夹,这里包括dir1和dir2;ro/rw 指定文件的权限只读和可读写;none 这里是挂载的设备,而没有设备用none表示。

M老师:为什么要有只读和可读写两种呢,因为docker在启动容器的时候就会用到这两种,而上面这个例子是模拟这个docker文件系统模型。

问:启动docker的时候,对硬盘使用只读,意义在于什么?

答:这个问题很好,一个image可以启动多个container,这时候会有一个问题,如果每个container对大家共有的部分都有可写的权限,就会出问题。所以docker启动的时候会加载镜像的文件系统那层是只读的,然后每个contianer 获取自己的可读写的层,如果container要修改只读层的文件,那么该文件就会从只读层提取到读写层。只读层的文件就被读写层的文件覆盖了,但只读层的那个文件依然存在 这个就实现了文件系统上的隔离。

问:就像我们写程序抵触共享的东西不变,只是利用这个共性来底层共享?

答:是的。

问:加那个none是干什么用的?

答:none 这里没有设备,用none表示,其实是没有意义的。但命令要求要有一个设备,这条命令中设备是none

问:这个命令是在容器里执行的吗?还是在宿主机?

答:容器。

M老师:继续咱们的分享,刚才实验的结果是什么样子呢,就是把/tmp/dir1和/tmp/dir2 合并之后挂载到/tmp/newfs,如果这时在/tmp/dir1 下创建一个文件a,/tmp/dir2下创建一个文件b 则 在/tmp/newfs 会看到a,b 这两个文件,这就是联合,并且a文件是只读的。

M老师:如果有相同的文件则以先挂载的为准,后面挂载的操作会被忽略掉。大家可以想像一下,我每做一次操作都相当于去挂载一个新的目录,这样所有的操作就保存下来了。当然实际情况并不是每次操作都去挂载。当container 发生改变的时候,并且我提交commit 才会重新挂载一层。

问:比如mkdir test 这也算是重新挂载了一层?

答:docker有一个命令docker commit,执行这个的时候会重新挂载一层。

M老师: 可能还会有一些不理解,下面用实际的docker 镜像来举个例子。大家启动一个container 之后,执行 docker save,可以把container保存成镜像。

例如:

docker save

cloud_jiankongbao:01.tar

cloud_jiankongbao:01

其中cloud_jiankongbao:01.tar是镜像的名字,后面的cloud_jiankongbao:01是这个container的ID,可以看到,保存下来的是tar 包。 不是.iso文件^_^

M老师:镜像解压之后是什么呢,我们来看一下:

ls .

a005304e4e74c1541988d3d1abb170e338c1d45daee7151f8e82f8460634d329

d9bde94c518a16a886514758b6b4431200145ecd58e30c5633ac3c0256544d77

f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639

fb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f

里面有四个目录,其实分别是4个docker的ID,每次使用docker commit 提交对docker的修改之后就会产生一个新的id,就是通过这个ID实现对镜像的回滚。

M老师:这4个目录之间是有关系的。这个关系可以通过docker image --tree 来查看。

docker images --tree

└─f1b10cd84249 Virtual Size: 0 B

└─fb9cc58bde0c Virtual Size: 203.1 MB

└─a005304e4e74 Virtual Size: 203.1 MB

└─d9bde94c518a Virtual Size: 1.957 GB Tags: cloud_jiankongbao:01

M老师:每个目录下有json layer.tar VERSION 这三个文件,我们现在只研究他们的结构,所以只看layer.tar 这个文件。

M老师:我们到一个目录下把layer.tar 解压一下

dfb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f;tar -xflayer.tar;ls

ls fb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f/

binetcjsonliblost+foundmntprocsbinsrvtmpvar

devhomelayer.tar lib64 mediaopt root selinux sys usr VERSION

问:为什么会提交四次?

答:提交4次是我们自己提交的.

M老师:在使用docker的过程中我们需要保存自己的修改,docker commit 执行完之后就把container中的内容回写到镜像中了,就相当于加了一层文件系统,每次提交后就生成了一个新的镜像。4个ID是4次提交的镜像的ID,这4个ID 其实相当于一个镜像的4个tag。我们再看一下4个镜像ID的系统:

f1b10cd84249 这个镜像是初始镜像,大小为0

fb9cc58bde0c 这个镜像是在f1b10cd84249基础上创建新的镜像;

a005304e4e74是以fb9cc58bde0c为基础创建新的镜像,是树状继承的关系;

M老师:我们再看一下不同ID目录下的bin 目录。

ls a005304e4e74c1541988d3d1abb170e338c1d45daee7151f8e82f8460634d329/bin/

gtar tar

a005304e4e74只有两个文件,fb9cc58bde0c包括了大部分bin下的文件,对应的场景是 fb9cc58bde0c,是装好操作系统, 然后我又装了tar这个工具。docker commit提交之后,就是a005304e4e。

问:可以认为fb9cc58bde0c是一个最小化的OS

答:可以这么理解。

M老师:最后简单说一下devicemapper,回到最开始说的,docker支持多种文件系统。devicemapper是利用了Snapshot 和Thinly-Provisioned Snapshot两种原理,将多个快照挂在同一个卷下从而实现文件系统的分层。这里的快照技术其实就是vm中的快照。

M老师:刚才说的autofs 是将不同的目录挂到一个虚拟目录,devicemapper 就是把多个快照挂载到同一个卷下,不过使用devicemapper 的话,一个container的大小最大只能是10G,启动docker daemon时用参数-s 指定:

docker -d -s devicemapper

M老师:当容器基于镜像启动之后,每个容器都会获得自己的写读可写的文件系统层。原镜像的那部分文件系统是只读的,从而实现每个容器的在文件系统上的隔离。

问:autofs 最大一个container是多大?

答:没有限制,直到物理服务器没有资源,但通常不会将数据库和LOG保存在镜像中,所以也不会写的太大,因为docker本身是轻量级的。

M老师:平时大家都在说dokcer 是弱隔离的,因为他没有隔离的很彻底,比如内核是跟大家共用的,跟宿主机共用同一个内核。SELinux、 Cgroups以及/sys、/proc/sys、/dev/sd*等目录下的资源是与宿主机共用的。如果要隔离的彻底那就是VM了,而且如果dockers要想实现这些隔离就必然要牺牲一下现在轻量级的特性。

M老师:好吧,今天的分享就到这里了,谢谢大家!

云智慧官网:www.cloudwise.com

干货 | Docker文件系统的分层与隔离的更多相关文章

  1. docker文件系统分层存储原理

    一,前言 众所周知,docker镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的,那它的分层机制是什么样的呢?共分为几种层呢?又是怎么工作的呢? 目前docker支持的联合文件系统有 ...

  2. Docker文件系统实战

    关键词:Docker 联合文件系统 镜像 容器 云信私有化 在本文中,我们来实战构建一个Docker镜像,然后实例化容器,在Docker的生命周期中详细分析一下Docker的文件存储情况和Docker ...

  3. docker学习系列(三):docker镜像的分层结构

    docker的镜像分层 docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构. 实验 比如说使用dockerfile去创建一个最简单的hello镜像.创建好对应的d ...

  4. docker镜像的分层结构三

    docker的镜像分层 docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构. 实验 比如说使用dockerfile去创建一个最简单的hello镜像.创建好对应的d ...

  5. docker理论 Cgroup namespace 各种隔离

    耦合 是指两个或两个以上的体系或者两种运动形式间通过相互作用而批次影响以至联合起来的现象. Nginx与apache 在同一台服务器运行都占用80端口,起冲突这是我们修改其中一个端口为8080 半解耦 ...

  6. 【Docker】镜像分层存储与镜像精简

    Linux操作系统 Linux操作系统由内核空间和用户空间组成. 内核空间是kernel,用户空间是rootfs, 不同Linux发行版的区别主要是rootfs.比如 Ubuntu 14.04 使用 ...

  7. 剖析Docker文件系统:Aufs与Devicemapper

    http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper Docker镜像 典型的Li ...

  8. Docker系列(四):Docker容器互联

    基于Volume的互联 为什么需要Volume docker文件系统是分层的,下面的是全部是只读的,最上面的是可写层,容器中的进程如果修改了某个文件,比如修改了下层的某个文件,其实是在最顶层复制下层文 ...

  9. Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)

    作为一种容器虚拟化技术,Docker深度应用了操作系统的多项底层支持技术. 早期版本的Docker是基于已经成熟的Linux Container(LXC)技术实现的.自Docker 0.9版本起,Do ...

随机推荐

  1. jsoncpp初使用

    一 前言 由于最近一个c++项目需要使用json这种数据格式来传输数据, so上网去寻找合适的类库,毕竟对于这种不是很新的技术, 自己造轮子有点得不偿失. 从百度上翻了翻, 基本上就boost跟jso ...

  2. 转《UNIX编程艺术》读书心得

    花了一段时间看完了<UNIX编程艺术>,但不是看得特别仔细,尤其是后面作者通过对工具的讲解来阐述其设计思想,因为很多工具能未曾接触过,难免就会产生一些乏味的感觉.其实就像译者姜宏在译序里说 ...

  3. 【原】redis插件安装

    wget -c https://github.com/nicolasff/phpredis/archive/2.2.4.tar.gz -O phpredis-2.2.4.tar.gz tar xzf ...

  4. 关于Python的数据分析工具

    Python - 核心编程环境NumPy/SciPy - 用于快速.高效的数组和矩阵运算IPython - 用于Python的可视化交互开发matplotlib - 用于数据的图形可视化pandas ...

  5. linux svn 提交文件时强制填写备注

    很多程序员不爱写注释,特别是svn提交的时候,文件做了什么修改都没有一个简单的备注,往往都是直接提交,这样是非常不利于团队开发的.所以就有了svn提交的时候,强制修改文件的备注. 步骤如下: 1.先找 ...

  6. :before和 :after

    :before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example:before { conte ...

  7. .vimrc vim 配置大全

    map <F9> :call SaveInputData()<CR>func! SaveInputData() exec "tabnew" exec 'no ...

  8. Javaweb命名规则

    一.类命名命名规范:以大写字母开头,如果有多个单词,每个单词头字母大写.例如:StudentInfo 二.接口命名命名规范:以大写字母"I"开头,如果有多个单词,每个单词头字母大写 ...

  9. Spark Streaming源码解读之State管理之UpdataStateByKey和MapWithState解密

    本期内容 : UpdateStateByKey解密 MapWithState解密 Spark Streaming是实现State状态管理因素: 01. Spark Streaming是按照整个Bach ...

  10. 好的sql

    select count(2) from vw_pmcthtdj A WHERE a.HTBL_ID not in (select jg.jgjs_htid from PMCTJGJS jg wher ...