Docker容器Container鏡像Image如何存儲詳解
容器如何讀寫文件
鏡像(Image)是由若干個層(Layer)所組成的,當(dāng)用戶使用image運行了一個container之后,就會在這個image的最上面再加上一個可讀可寫的layer,如下圖所示:
除了最上面那一個layer是可讀寫的之外,下面的所有l(wèi)ayer都是屬于image的,都是只讀的。
在container運行時,任何在container文件系統(tǒng)中寫入和修改的數(shù)據(jù)都會被寫入到最上層的可讀寫layer(這里不包括volume、bind mount和tmpfs這些持久化存儲手段),并不會影響到下面的那些只讀layer。當(dāng)container運行結(jié)束的時候,最上層的可讀寫layer就會被丟棄,而下面的那些只讀layer是屬于image的,并不會受到影響。
這也就是為什么使用同一個image運行container,該container結(jié)束之后,重新使用該image啟動一個新的container,上一個container寫入和修改的數(shù)據(jù)全都不見了,用戶能看見的依舊是當(dāng)初編寫Dockerfile時寫入該image的那些數(shù)據(jù)的原因。
如果使用同一個image啟動了多個container,那么這些container會有各自的最上層的可讀寫layer,但是下面的那些只讀layer是共用的,如下圖所示:
鏡像的layer管理
一個image的多個layer并不是綁定和存儲在一起的,它們之間是低耦合的。
使用docker pull
命令拉取一個image的時候,并不是一次性拉取的,而是一個layer一個layer地拉取,然后存儲在本機(在linux上默認(rèn)是/var/lib/docker/<storage-driver>/
下)。
一臺主機中存在多個image時,有可能會出現(xiàn)多個image的某些layer相同的情況,那么此時在主機中就只會存儲一份該layer,而不是存儲多個。
那么問題來了:既然多個layer是分開存儲的,那么用戶在container中卻可以看到所有的layer中存儲的文件,這又是怎么做到的呢?這就涉及到了union file system和union mount。
可以通過docker image history
以及docker image inspect
來查看某個image的所有l(wèi)ayer。
Copy On Write
當(dāng)container想要更改原本就存在于image中的那些數(shù)據(jù)的時候該怎么辦呢?那些數(shù)據(jù)是位于下面那些屬于image的只讀層的,因此肯定不能直接修改。Docker采用的解決方案一般是copy-on-write。
當(dāng)container想要讀取原本就存在于image中的數(shù)據(jù)時,直接從數(shù)據(jù)所在的只讀layer讀取即可。而如果想要修改原本就存在于image中的數(shù)據(jù)時,Docker就會先把要被修改的文件拷貝到最上層的屬于container的可讀寫layer中,然后再在這個可讀寫的layer中進(jìn)行數(shù)據(jù)的修改即可。
值得一提的是,哪怕是對文件的元數(shù)據(jù)(meta data)的修改(例如修改文件權(quán)限、所屬用戶等等),也會觸發(fā)copy-on-write機制。
Docker有多種存儲引擎(storage driver),不同的storage driver對copy-on-write的具體實現(xiàn)是不一樣的。
注意:并不是所有的Docker存儲引擎都支持copy on write的,例如vfs就不支持!
查看容器占用磁盤大小
使用docker ps -s
來查看一個container在運行時占用的磁盤大小,例如:
SIZE
指的是該container最上層的可讀寫layer的大小,而virtual
指的是啟動了該container的image的那些只讀layer的大小。
需要注意的是,通過這個命令得到的container磁盤空間大小是不包括以下這些的:
- log文件所使用的磁盤空間
- volume和bind mount所使用的磁盤空間
- container的配置文件所使用的磁盤空間
- 內(nèi)存交換所使用的磁盤空間
- Checkpoints所使用的磁盤空間
Docker存儲引擎
Docker在linux下提供了如下的存儲引擎選項:
存儲引擎 | 描述 |
---|---|
overlay2 | 在linux上首選的存儲引擎,不需要額外的配置 |
fuse-overlayfs | 推薦在運行rootless的Docker時使用 |
btrfs和zfs | 可以提供更多的功能,例如快照等等,但是需要額外的配置 |
vfs | 目前仍處于測試中,用于不支持copy on write的文件系統(tǒng)中,性能堪憂,不推薦使用在生產(chǎn)環(huán)境中 |
devicemapper | 在生產(chǎn)環(huán)境中需要direct-lvm的支持 |
可以通過docker info
命令來查看自己使用的Docker用的是哪一個storage driver:
上圖中使用的storage driver是overlay2。
參考資料 https://docs.docker.com/storage/storagedriver/
以上就是Docker容器Container鏡像Image如何存儲詳解的詳細(xì)內(nèi)容,更多關(guān)于Docker容器鏡像存儲的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用Celery和Docker處理Django中的定期任務(wù)
這篇文章主要介紹了使用Celery和Docker處理Django中的定期任務(wù)的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Docker+Jupyter 部署算力服務(wù)的解決方案
Docker+Jupyter部署算力服務(wù)為AI學(xué)習(xí)框架提供了一種高效的發(fā)布和使用方案,本文以Windows環(huán)境為例,介紹了如何下載安裝Docker工具,以及如何根據(jù)AI框架所需的Python版本拉取合適的Jupyter鏡像,本文介紹了Docker+Jupyter 部署算力服務(wù)的相關(guān)知識,一起看看吧2024-11-11基于docker Desktop一鍵式搭建k8s環(huán)境的步驟
在docker desktop中一鍵啟動k8s環(huán)境很簡單,下面介紹如何啟動dashboard,dashboard儀表盤是新手學(xué)習(xí)k8s至關(guān)重要的一個工具,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2023-11-11