Docker系統八:Docker的存儲驅動


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM