在docker中,image的意思是“鏡像”,是一個文件系統;image可以將幾層目錄掛載到一起,形成一個與linux目錄結構一樣的虛擬文件系統,docker通過這些文件再加上宿主機的內核提供了一個linux的虛擬環境。
本教程操作環境:linux7.3系統、docker-1.13.1版、Dell G3電腦。
docker中image是什么意思
image 里面是一層層文件系統,叫做 union FS(聯合文件系統)。
聯合文件系統,可以將幾層目錄掛載到一起,形成一個虛擬文件系統。虛擬文件系統的目錄結構就像普通 linux 的目錄結構一樣,docker 通過這些文件再加上宿主機的內核提供了一個 linux 的虛擬環境。
每一層文件系統我們叫做一層 layer,聯合文件系統可以對每一層文件系統設置三種權限,只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able),但是 docker 鏡像中每一層文件系統都是只讀的。
構建鏡像的時候,從一個最基本的操作系統開始,每個構建的操作都相當于做一層的修改,增加了一層文件系統。一層層往上疊加,上層的修改會覆蓋底層該位置的可見性,這也很容易理解,就像上層把底層遮住了一樣。
當你使用的時候,你只會看到一個完全的整體,你不知道里面有幾層,也不清楚每一層所做的修改是什么。結構類似這樣:
從基本的看起,一個典型的 Linux 文件系統由 bootfs 和 rootfs 兩部分組成,bootfs(boot file system) 主要包含bootloader 和 kernel,bootloader 主要用于引導加載 kernel,當 kernel 被加載到內存中后 bootfs 會被 umount 掉。
rootfs (root file system) 包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc 等標準目錄和文件。下圖就是 docker image 中最基礎的兩層結構,不同的 linux 發行版(如 ubuntu 和 centos ) 在 rootfs 這一層會有所區別,體現發行版本的差異性。
傳統的 Linux 加載 bootfs 時會先將 rootfs 設為 read-only,然后在系統自檢之后將 rootfs 從 read-only 改為 read-write,然后我們就可以在 rootfs 上進行讀寫操作了。
但 Docker 在 bootfs 自檢完畢之后并不會把 rootfs 的 read-only 改為 read-write,而是利用 union mount(UnionFS 的一種掛載機制)將 image 中的其他的 layer 加載到之前的 read-only 的 rootfs層之上,每一層 layer 都是 rootfs 的結構,并且是read-only 的。所以,我們是無法修改一個已有鏡像里面的 layer 的!
只有當我們創建一個容器,也就是將 Docker 鏡像進行實例化,系統會分配一層空的 read-write 的 rootfs ,用于保存我們做的修改。一層 layer 所保存的修改是增量式的,就像 git 一樣。
綜上,image其實就是一個文件系統,它與宿主機的內核一起為程序提供一個虛擬的linux環境。在啟動docker container時,依據image,docker會為container構建出一個虛擬的linux環境。
推薦學習:《docker視頻教程》