Docker基礎 文件系統之AUFS
為了更好的理解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/
root@ubuntu:/#
- 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
Docker基礎 文件系統之AUFS