docker with devicemapper storage driver
storage driver的選擇依據很多的條件,比如發行版版本,團隊技術積累,穩定性等。
device mapper是redhat/centos中最適合的, 穩定性也可以,核心原生支援,基於塊裝置,對於高負載情況下可以效能較好,支援quota。
缺點是:佔用記憶體較多,啟動同一個映象的多個例項,需要多次載入並在記憶體中儲存多個例項的資訊,在高密度的情況下不適用;在小檔案的情況下效能不如aufs,overlay。
接下里我們就對device mappper做個剖析。
Device Mapper介紹
首先請看:ofollow,noindex" target="_blank">Linux 核心中的 Device Mapper 機制
device mapper中允許有不同的target driver,docker結合使用了thin provisioning 與snapshot 兩種技術,thin provisioning 就是一種對disk超配的機制,snapshot 是COW的機制。
根據device mapper Document ,device mapper thin provisioning snapshot使用方式大概分為以下幾步:
dmsetup create poolname --table "0 20971520 thin-pool $metadata_dev $data_dev $data_block_size $low_water_mark"
建立完成後可以通過dmsetup status
看到相關資訊,docker自己建立的thinpool資訊如下:
[root@gaorong-pc ~]# dmsetup status vg_root-dmdata: 0 419430400 linear vg_root-dmmeta: 0 62914560 linear docker-253:2-812-pool: 0 419430400 thin-pool 65465 11492/4161600 581965/3276800 - rw no_discard_passdown queue_if_no_space - docker-253:2-812-1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b: 0 20971520 thin 236288 20971519 .....
可以看到有data, metadata device, thin pool, thin volume物件,其中thinpool的輸出含義為:start_sector sector_num device_type transaction_id used_metadata_blocks/total_metadata_blocks used_data_blocks/total_data_blocks held_metadata_rootro|rw|out_of_data_space [no_]discard_passdown [error|queue]_if_no_spaceneeds_check|- metadata_low_watermark
各個欄位具體含義參見device mapper thin-provisioning
Device Mapper在docker中的應用
docker使用devicemapper storage driver會自動完成上述物件的建立,將image和conainer layer資訊儲存在thinpool中,並mount到/var/lib/docker/devicemapper/
目錄下暴露給container使用,其中metadata目錄下包含了各個layer的snapshot的資訊,他會為每個layer建立一個檔案來記錄資訊,如下:
[root@gaorong-pc devicemapper]# cat metadata/1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b {"device_id":32867,"size":10737418240,"transaction_id":65437,"initialized":false,"deleted":false}
容器的writable layer是在真正啟動執行的時候active, 對應的thin volume才能被dmsetup status
可見。可以參看這篇文章瞭解更多Docker內部儲存結構(devicemapper)解析(下篇)
data目錄包含了各個container的mountpoint, 可以df
命令看到每個container的mount 資訊。
thinpool的資訊除了使用dmsetup
指令檢視外,也可以通過docker info
直接輸出:
[root@gaorong-pc ~]# docker info Containers: 10 Running: 4 Paused: 0 Stopped: 6 Images: 26 Server Version: 17.03.2-ce Storage Driver: devicemapper Pool Name: docker-253:2-812-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: /dev/vg_root/dmdata Metadata file: /dev/vg_root/dmmeta Data Space Used: 38.14 GB Data Space Total: 214.7 GB Data Space Available: 176.6 GB Metadata Space Used: 47.07 MB Metadata Space Total: 17.05 GB Metadata Space Available: 17 GB Thin Pool Minimum Free Space: 21.47 GB Udev Sync Supported: false Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Library Version: 1.02.82 (2013-10-04) Logging Driver: json-file Cgroup Driver: cgroupfs ........
注意其中Thin Pool Minimum Free Space
欄位就是建立thinp時的$low_water_mark,它表示在當data device容量還剩下該閾值的時候就無法寫入資料了,也就是docker info
中 "Data Space Available","Thin Pool Minimum Free Space"兩個欄位相等時此時就無法寫入資料了。
在docker的官方文件裡有詳細介紹:How the devicemapper storage driver works
refs
docker官方介紹:Use the Device Mapper storage driver
moby repo:devicemapper - a storage backend based on Device Mapper 包含docker info dm 各個欄位含義
DOCKER基礎技術:DEVICEMAPPER 左耳朵耗子出品, 五顆星
剖析Docker檔案系統:Aufs與Devicemapper
device mapper Document 必看其中的thin-provisioning, snapshot兩章,包含一些底層的使用方式,與引數細節
dockercon 各種storage driver的使用: Deep dive into Docker storage drivers:video PPT