Docker存儲驅動
1. Docker存儲驅動歷史
Docker目前支持的greph driver包括:
- AUFS
- device-mapper
- btrfs
- overlayfs(重點)
關於各存儲驅的詳細介紹參照Docker五種存儲驅動原理及應用場景和性能測試對比
2. Docker overlayfs driver
1) 介紹
docker使用overlaysf的介紹如下:
- lowerdir指向image layer;
- upperdir指向container layer;
- merged整合lowerdir與upperdir提統統一視圖給容器作為根文件系統
如下圖:
2)容器內文件的讀寫優先級情況
I. read file
- upperdir存在,從container layer讀取;
- upperdir不存在,從lowerdir,即 image layer讀取;
II. write file
- upperdir存在,直接在upperdir寫;
- upperdir不存在,overlay發起copy_up操作,從lowerdir拷貝文件到upperdir進行寫,拷貝只會在第一次打開時發生。
III. deleting files and directories
- 刪除文件時,upperdir會創建一個witheout文件,會隱藏lowerdir的文件(非刪除);
- 刪除目錄時,upperdir會創建一個opaque diectory,隱藏lowerdir的目錄;
3). overlayfs driver實踐
- 指定overlay driver啟動:
$dockerd --storage-driver=overlay
$docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.06.0-ce
Storage Driver: overlay
Backing Filesystem: extfs
Supports d_type: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: cfb82a876ecc11b5ca0977d1733adbe58599088a
runc version: 2d41c047c83e09a6d61d464906feb2a2f3c52aa4
init version: 949e6fa
- 下載一個鏡像:
$docker pull centos:centos6
$docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
centos centos6 7ea307891843 4 weeks ago 194MB
- 查看鏡像的對應目錄
$ls /var/lib/docker/overlay/
8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7
$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/
bin etc home lib lib64 lost+found media mnt opt root sbin selinux srv tmp usr var
- 創建容器
$docker run -it centos:centos6 /bin/bash
#在host里查看
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/
lower-id merged/ upper/ work/
cat /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/lower-id
8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7
$cat /proc/mounts
overlay /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/merged overlay rw,relatime,lowerdir=/var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root,upperdir=/var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper,workdir=/var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/work 0 0
可以看到,容器對應的目錄有三個(merged, upper, work), work用於overlayfs實現copy_up操作, lower-id保存images ID。
- 容器內創建文件
$echo "hello" > /root/f1.txt
$ls /root/
anaconda-ks.cfg f1.txt install.log install.log.syslog
Host上overlay目錄變化
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/merged/root/
anaconda-ks.cfg f1.txt install.log install.log.syslog
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/
f1.txt
$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/root/
anaconda-ks.cfg install.log install.log.syslog
- 容器內刪除文件
$rm /root/install.log
$ls /root/
Host上overlay目錄變化
$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/root/
anaconda-ks.cfg install.log install.log.syslog
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/merged/root/
anaconda-ks.cfg f1.txt install.log.syslog
$ls /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/* -l
-rw-r--r-- 1 root root 6 Sep 3 22:17 /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/f1.txt
#發現upperdir多了一下instll.log文件
c--------- 1 root root 0, 0 Sep 3 22:24 /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/upper/root/install.log
$cat /var/lib/docker/overlay/12e6cab3449f07e2eeb8441ec366c214a9550130ea1367bd5e58b6375b00d9e8/lower-id
8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7
$ls /var/lib/docker/overlay/8c2dc4e8a8bb0bca70b6304984089f9f6fcf6e093ce9cf9818af3316ad7fb0d7/root/root/
anaconda-ks.cfg install.log install.log.syslog