为了更好的理解docker,除了namespace和cgroups之外,在docker中如何进行存储文件也是需要进行进一步理解的。在docker中叫做storage driver,在本文中将会介绍一下docker最早支持的storage driver的AUFS,并在ubuntu上简单模拟AUFS是如何工作的。
Storage driver
docker除了支持AUFS,还支持DeviceMapper等多种storage driver。
StorageDriver |
---|
OverlayFS: overlay or overlay2 |
AUFS : aufs |
Btrfs : btrfs |
Device Mapper: devicemapper |
VFS : vfs |
ZFS : zfs |
什么是AUFS
AUFS是一种Union File System, 它是Docker最早支持的storage driver。因为使用的时间也较长了,虽然还是不太习惯这个所谓的长的概念,docker从最初只支持AUFS一种,目前已经到支持上面6种FS,成长的速度飞快。最初使用docker的实践者们已经在实际环境中开始使用AUFS了,而且也有较强的社区支持。
Linux的文件系统
Linux的文件系统一般由bootfs和rootfs组成。
类型 | 说明 |
---|---|
bootfs | bootfs主要用于引导和加载内核,为什么和filesystem有关呢,在引导之前需要mount文件系统,kernel加载之后就可以功成身退了。在作linux的系统引导盘或者进行恢复的时候,你能清晰地看到这一点,在前面其他的文章中已经有过讲解,不再赘述。 |
rootfs | 典型的linux启动之后标准的/dev /proc /bin /etc /usr/ /tmp等等都被包含在rootfs中 |
简单总结为bootfs在用linux的时候不出问题是意识不到的,rootfs在linux启动之后我们无时无刻不在与之打交道。
AUFS的特点
简单的来说,AUFS能将一台机器上的多个目录或文件,以联合的方式提供统一视图进行管理。下面是它的一些特点
- 最早docker所支持的storage driver
- 使用这种方式,container启动速度较快
- 存储和内存的使用效率较高
- 支持COW(copy-on-write)
- 所有的文件和目录以及挂载点都必须在同一台机器上
- AUFS迟迟不能加入到linux内核主线之中,目前流行的发型版只有ubuntu支持AUFS
- docker的layer较深时效率较为低下
- 因为AUFS是文件级别的动作方式,单个文件很大时,性能和效率不是特别理想
AUFS在docker中的使用
下面这张图显示了ubuntu的镜像是如何用AUFS联合到一起的。
AUFS把每个目录都作为一个AUFS branch,整整齐齐的垛在一起,在最上面提供了一个统一的视图union mount point进行管理。
Ubuntu下AUFS的演示
演示用ubuntu版本
root@ubuntu:~# uname -a
Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
root@ubuntu:~#
- 1
- 2
- 3
事前准备
准备联合用的目录bootfs
root@ubuntu:~# mkdir -p /tmp/testrootfs/etc /tmp/testrootfs/bin /tmp/testrootfs/tmp /tmp/testrootfs/proc
root@ubuntu:~#
- 1
- 2
root@ubuntu:~# mkdir -p /tmp/testaufs/readonlydir
root@ubuntu:~# mkdir -p /tmp/testaufs/readwritedir/
root@ubuntu:~# touch /tmp/testaufs/readonlydir/readonlyfile.txt
root@ubuntu:~# touch /tmp/testaufs/readwritedir/readwritefile.txt
root@ubuntu:~#
- 1
- 2
- 3
- 4
- 5
准备挂载点
root@ubuntu:~# mkdir -p /tmp/aufsmnt
- 1
挂载点事前确认
root@ubuntu:~# ll /tmp/aufsmnt
total 8
drwxr-xr-x 2 root root 4096 Sep 22 09:30 ./
drwxrwxrwt 17 root root 4096 Sep 22 09:30 ../
root@ubuntu:~#
- 1
- 2
- 3
- 4
- 5
挂载
使用AUFS进行挂载
root@ubuntu:/# mount -t aufs -o br=/tmp/testaufs/readonlydir=ro:/tmp/testrootfs=ro:/tmp/testaufs/readwritedir/=rw none /tmp/aufsmnt
root@ubuntu:/#
- 1
- 2
Option | Option说明 |
---|---|
-t | filesystem类型 |
-o | mount传递给文件系统的参数 |
br | 挂载对象的文件夹 |
ro/rw | 指定文件的权限只读和可读写 |
device | 没有设备所以用none表示 |
挂载后确认
total 24
drwxr-xr-x 8 root root 4096 Sep 22 09:29 ./
drwxrwxrwt 17 root root 4096 Sep 22 09:30 ../
drwxr-xr-x 2 root root 4096 Sep 22 09:26 bin/
drwxr-xr-x 2 root root 4096 Sep 22 09:26 etc/
drwxr-xr-x 2 root root 4096 Sep 22 09:26 proc/
-rw-r--r-- 1 root root 0 Sep 22 09:29 readonlyfile.txt
-rw-r--r-- 1 root root 0 Sep 22 09:29 readwritefile.txt
drwxr-xr-x 2 root root 4096 Sep 22 09:26 tmp/
[email protected]:/#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
确认只读
root@ubuntu:/# echo "hello world" >/tmp/aufsmnt/readonlyfile.txt
-su: /tmp/aufsmnt/readonlyfile.txt: Read-only file system
root@ubuntu:/#
- 1
- 2
- 3
ro方式的文件,是不能写的
确认可写
root@ubuntu:/# echo "hello world" > /tmp/aufsmnt/readwritefile.txt
root@ubuntu:/# cat /tmp/aufsmnt/readwritefile.txt
hello world
root@ubuntu:/#
- 1
- 2
- 3
- 4
rw方式的文件,是可写的
耐着性子看完本篇之后,结合前面的一些namespace和cgroups的例子,再结合busybox这把小巧的武器,是不是突然发现只用linux内核功能也能做到docker雏形的特性了。虽然重复造轮子不是我们的目的,研究一下人家轮子的原理能拆能装才是一个蓝领工人应有的技能。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed
原文地址:https://www.cnblogs.com/firsttry/p/10159913.html