• 技术文章 >运维 >Docker

    什么是docker最早支持的存储引擎

    青灯夜游青灯夜游2022-06-07 17:01:08原创621

    AUFS是docker最早支持的存储引擎。AUFS是一种Union File System,是文件级的存储驱动,是Docker早期用的存储驱动,是Docker18.06版本之前,Ubuntu14.04版本前推荐的,支持xfs、ext4文件。

    本教程操作环境:linux7.3系统、docker20版、Dell G3电脑。

    AUFS是docker最早支持的存储引擎。

    Docker 的存储引擎

    Docker 的存储引擎设计思路是这样,但是针对不同的文件系统,是由不同的存储驱动去实现的。下面我们来聊聊 Docker 的存储驱动。

    Docker 主要有一下几类存储驱动:

    需要注意的是,overlay2,overlay,aufs 的层是基于文件的,当单文件的写并发较高时需要大内存的支持,且读写层可能因为单个文件而变得很大。devicemapper,btrfs,zfs 的层是基于块存储的,因此对于单个文件的高并发影响不大。但是 btrfs 和 zfs 非常消耗内存。

    docker AUFS

    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了。

    好了,扯完这些闲话,我们还是看一个示例吧(环境:Ubuntu 14.04)

    首先,我们建上两个目录(水果和蔬菜),并在这两个目录中放上一些文件,水果中有苹果和蕃茄,蔬菜有胡萝卜和蕃茄。

    $ tree
    .
    ├── fruits
    │   ├── apple
    │   └── tomato
    └── vegetables
        ├── carrots
        └── tomato

    然后,我们输入以下命令:

    # 创建一个mount目录
    $ mkdir mnt
    
    # 把水果目录和蔬菜目录union mount到 ./mnt目录中
    $ sudo mount -t aufs -o dirs=./fruits:./vegetables none ./mnt
    
    #  查看./mnt目录
    $ tree ./mnt
    ./mnt
    ├── apple
    ├── carrots
    └── tomato

    我们可以看到在./mnt目录下有三个文件,苹果apple、胡萝卜carrots和蕃茄tomato。水果和蔬菜的目录被union到了./mnt目录下了。

    我们来修改一下其中的文件内容:

    $ echo mnt > ./mnt/apple
    $ cat ./mnt/apple
    mnt
    $ cat ./fruits/apple
    mnt

    上面的示例,我们可以看到./mnt/apple的内容改了,./fruits/apple的内容也改了。

    $ echo mnt_carrots > ./mnt/carrots
    $ cat ./vegetables/carrots 
    
    $ cat ./fruits/carrots
    mnt_carrots

    上面的示例,我们可以看到,我们修改了./mnt/carrots的文件内容,./vegetables/carrots并没有变化,反而是./fruits/carrots的目录中出现了carrots文件,其内容是我们在./mnt/carrots里的内容。

    也就是说,我们在mount aufs命令中,我们没有指它vegetables和fruits的目录权限,默认上来说,命令行上第一个(最左边)的目录是可读可写的,后面的全都是只读的。(一般来说,最前面的目录应该是可写的,而后面的都应该是只读的)

    所以,如果我们像下面这样指定权限来mount aufs,你就会发现有不一样的效果(记得先把上面./fruits/carrots的文件删除了):

    $ sudo mount -t aufs -o dirs=./fruits=rw:./vegetables=rw none ./mnt
    
    $ echo "mnt_carrots" > ./mnt/carrots 
    
    $ cat ./vegetables/carrots
    mnt_carrots
    
    $ cat ./fruits/carrots
    cat: ./fruits/carrots: No such file or directory

    现在,在这情况下,如果我们要修改./mnt/tomato这个文件,那么究竟是哪个文件会被改写?

    $ echo "mnt_tomato" > ./mnt/tomato 
    
    $ cat ./fruits/tomato
    mnt_tomato
    
    $ cat ./vegetables/tomato
    I am a vegetable

    可见,如果有重复的文件名,在mount命令行上,越往前的就优先级越高。

    你可以用这个例子做一些各种各样的试验,我这里主要是给大家一个感性认识,就不展开试验下去了。

    那么,这种UnionFS有什么用?

    历史上,有一个叫Knoppix的Linux发行版,其主要用于Linux演示、光盘教学、系统急救,以及商业产品的演示,不需要硬盘安装,直接把CD/DVD上的image运行在一个可写的存储设备上(比如一个U盘上),其实,也就是把CD/DVD这个文件系统和USB这个可写的系统给联合mount起来,这样你对CD/DVD上的image做的任何改动都会在被应用在U盘上,于是乎,你可以对CD/DVD上的内容进行任意的修改,因为改动都在U盘上,所以你改不坏原来的东西。

    我们可以再发挥一下想像力,你也可以把一个目录,比如你的源代码,作为一个只读的template,和另一个你的working directory给union在一起,然后你就可以做各种修改而不用害怕会把源代码改坏了。有点像一个ad hoc snapshot。

    Docker把UnionFS的想像力发挥到了容器的镜像。你是否还记得我在介绍Linux Namespace上篇中用mount namespace和chroot山寨了一镜像。现在当你看过了这个UnionFS的技术后,你是不是就明白了,你完全可以用UnionFS这样的技术做出分层的镜像来。

    下图来自Docker的官方文档Layer,其很好的展示了Docker用UnionFS搭建的分层镜像。

    1.png

    关于docker的分层镜像,除了aufs,docker还支持btrfs, devicemapper和vfs,你可以使用 -s 或 storage-driver= 选项来指定相关的镜像存储。在Ubuntu 14.04下,docker默认Ubuntu的 aufs(在CentOS7下,用的是devicemapper,关于devicemapper,我会以以后的文章中讲解)你可以在下面的目录中查看相关的每个层的镜像:

    /var/lib/docker/aufs/diff/<id>

    AUFS的一些特性

    AUFS有所有Union FS的特性,把多个目录,合并成同一个目录,并可以为每个需要合并的目录指定相应的权限,实时的添加、删除、修改已经被mount好的目录。而且,他还能在多个可写的branch/dir间进行负载均衡。

    上面的例子,我们已经看到AUFS的mount的示例了。下面我们来看一看被union的目录(分支)的相关权限:

    推荐学习:《docker视频教程

    以上就是什么是docker最早支持的存储引擎的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Docker
    上一篇:在docker中内容无关性是指什么 下一篇:有类似docker的软件吗
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• docker的映射是什么• 怎么查看使用的docker是哪个版本• docker是vps吗• docker编译的镜像放在哪个目录• docker局限性有哪些
    1/1

    PHP中文网