文档章节

干货 | Docker文件系统的分层与隔离

cloudwiseAPM
 cloudwiseAPM
发布于 2015/09/14 16:12
字数 1947
阅读 456
收藏 7

现在就开始今天的分享~

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


© 著作权归作者所有

cloudwiseAPM
粉丝 26
博文 135
码字总数 278629
作品 0
海淀
私信 提问
Docker 基础知识-入门篇

1. Docker简介和KVM区别 1.1 docker的三大理念 构建 运输 运行 ps:有点类似于java代码,一次构建到处运行 1.2 docker结构 相关说明: image: 和虚拟机的镜像类似 container: 用镜像创建的实例...

wzaqj
2018/06/06
0
0
为什么Docker是云计算必然的现在和未来

Docker所代表的Container技术,是对内核的Cgroups、namespace等内容的使用. Linux Container=lxc 借助BootZdocker可以实现在Mac和Windows上运行 CGroups限制容器的资源使用 Namespace机制,实...

yard521
2018/07/01
0
0
Docker入门教程 Part 1 基础概念 - 镜像、容器、仓库

前言 第一篇笔记,先总体介绍Docker,及它与虚拟机技术的区别,最后再介绍Docker的最基础的三大组件概念。 本文内容主要参考Docker官方网站以及中文书籍Docker — 从入门到实践。 我正在学习...

iotisan
2017/10/19
0
0
Windows Docker的有趣事实

提示 本文最初发表于华来四公众号,请扫描以下二维码关注。给盆盆发微信(微信号:markpah),即可要求加入Windows Docker微信群、或者微软混合云微信群。您还可以加入华来四QQ群(423730487),...

ahpeng
2016/04/16
0
0
Docker基础之一:Docker 的架构

1、Docker的架构 Docker使用的是 C-S架构。Docker的客户端同Docker Daemon进行交互,其中主要的工作是通过 daemon来完成,包括拉取镜像,编译镜像,运行容器,发布容器等。Docker client和d...

TENGQ
2017/05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
21分钟前
4
0
小招喵所在的国家正处于怪兽入侵的战场中,这个国家一共有n+1个城市

import java.util.Arrays; import java.util.Scanner; public class test3 { public static long max=0;public static void main(String[] args) { Scanner sc = new Scanner(System.i......

南桥北木
23分钟前
3
0
活动策划思维导图模板分享,怎样绘制思维导图操作方法介绍

对于一场活动的举办可以事先使用思维导图简略的将整个过程进行总结归纳使用,这样清晰的思维导图即利于工作的进行,也可以清晰明了了熟悉整个过程,下面是为大家分享的几款活动策划思维导图模...

干货趣分享
29分钟前
4
0
Android高级xml布局之输入框EditText设计

今天给大家介绍一下如何实现一款简约时尚的安卓登陆界面。大家先看一下效果图 当用户输入时动态出现删除按钮 现在先罗列一下技术点: 1.如何使用圆角输入框和按钮背景 2.如何实现“手机号”、...

shzwork
54分钟前
4
0
RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
56分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部