docker支持多種graphDriver(聯合文件系統),包括vfs,deviceMapper,overlay,overlay2,aufs等,其中最經常使用的是aufs,但隨着linux內核3.18把overlay歸入其中後,overlay的地位就變得更換重,node
目前的docker默認的存儲是哦verlay2,其速度更快,實現更簡單。linux
查看docker使用的存儲文件系統;docker
docker info | grep "Storage Driver"json
修改docker的存儲文件系統類型vim
vim /etc/docker/daemon.json緩存
{app
"storage-driver": "overlay2"ide
}性能
overlay2是如何運做的優化
overlayFS將單個linux主機上的兩個目錄分層,並將他們顯示爲單個目錄。這些目錄稱爲層,統一過程稱爲聯合安裝。overlayFS指向下層目錄lowerdir(鏡像層)和上層目錄upperdir(容器層)。
統一視圖經過其本身的目錄公開merged(mount掛載對外開放,可以使用mount | grep overlay2查看掛載的信息,lowerdir鏡像層信息和upperdir容器層信息和workdir層信息)。
該overlay2驅動程序原生支持多達128個較低的overlayFS層,此功能爲與層相關的docker命令(docker build)提供了更好的性能docker commit,而且在後備文件系統上消耗的inode更少。
要建立容器,overlay驅動程序會組合鏡像層和容器層的目錄。鏡像層(lowerdir)是隻讀的,容器層組合後是最上層的,是可讀寫的。
容器讀寫是如何使用overlay2
讀文件的時候,文件不在upperdir則從lowerdir讀,若是upperdir和lowerdir存在相同名稱的文件,則讀取upperdir中的文件。
在第一次寫某個文件時,該文件只存在lowerdir中,則從lowerdir裏面copy_up到upperdir層,無論文件多大,copy完再寫,以後的操做就只修改upperdir層中文件的副本。
刪除或者重命名鏡像層的文件都只是在容器層生成whiteout文件標誌。
overlay2支持多個容器訪問相同文件時共用page cache,在copy_up的時候overlay2比aufs更快,由於aufs的層級多搜索會有延遲,而overlay2會有緩存機制。
優化方面能夠用ssd,而後頻繁的io操做,能夠經過掛載volumes來作,繞過存儲驅動,並且能夠多個容器共享數據,持久化數據。
經過下面官網介紹圖知道,若是upperdir和lowerdir有同名文件時會用upperdir的文件
docker存儲文件目錄介紹
docker的存儲文件目錄默認爲/var/lib/docker/overlay2
[root@docker2 overlay2]# ll
總用量 4
drwx------ 3 root root 30 7月 29 21:19 07538ad1adc0b3bdfd11715717fafc17a4692095e495b146f3180e46d65987dc
drwx------ 4 root root 55 7月 29 21:19 390f32915aa93e778fc5b407c3765066879d30f86685c45221b110f13aed9b4f
drwx------. 4 root root 55 5月 15 20:22 4cd493e0beb734394ee51db59e0e29e2502399713f62ca84b16c9e8cc2f8d3a0
drwx------. 3 root root 30 5月 15 20:12 4e8f437ef36c77b378b5d56736cde4fca5969dc5f08275b5defc1c45f0983667
drwx------ 3 root root 30 5月 17 21:00 4f581962efbf4666456176106bd4be4ad294a6e43302b3fee94936d397d7f8fb
drwx------. 3 root root 30 5月 15 19:12 591ad68a7004eb28ddd0cea635505850b2b553654ae45ed4cf954146e7b58acb
drwx------ 5 root root 69 7月 29 21:49 976a3aa29fb8f85ed7474b0ab7275511c7b7c2fad54613ec3c220ddc1b93c029
drwx------ 4 root root 55 7月 29 16:54 976a3aa29fb8f85ed7474b0ab7275511c7b7c2fad54613ec3c220ddc1b93c029-init
drwx------. 4 root root 55 5月 15 20:22 99a4115a64a36da147e2ae653f8edfad90049761d95a91a2e8c3107223337405
drwx------ 4 root root 55 7月 29 21:19 af0ca5122ff28863cde46e271728c674bdc1580f43384b6f95cea7d663215663
brw------- 1 root root 253, 0 7月 29 21:44 backingFsBlockDev
drwx------ 4 root root 55 7月 29 21:19 c2761e7607341f4699fa3008f1c49aa3c45594141447959e986072165808acc2
drwx------. 2 root root 4096 7月 29 21:20 l
目錄l(L的小寫)存放縮寫鏈接的目錄,對應overlay2下的每層cachid目錄下的diff目錄,這是爲了掛載命令不會超出長度。
最底層只有diff和link文件,link文件內容是l目錄裏面的縮寫連接名,實際就是對應diff目錄,diff目錄實際存放這一層的文件內容。