Docker容器技術(三)——鏡像的分層結構及構建
1. 鏡像的分層結構
- 共享宿主機的kernel
- base鏡像提供的是最小的Linux發行版
- 同一docker主機支持運行多種Linux發行版
- 採用分層結構的最大好處是:共享資源
比如當你已經拉取Nginx 1.17版本的鏡像之後,若再次拉取Nginx 1.16 版本時,只需要下載不同的層即可,相同的層可以共享使用,這樣就可以節省資源和網絡帶寬。當你刪除其中某個鏡像版本時,也只會刪除掉不一樣的層,因爲其中共享的層另一個版本需要使用。
-
Copy-on-Write 可寫容器層
-
容器層以下所有鏡像層都是隻讀的
-
docker從上往下依次查找文件
-
容器層保存鏡像變化的部分,並不會對鏡像本身進行任何修改
-
一個鏡像最多127層
2. 鏡像的構建
docker commit 構建新鏡像三部曲
- 運行容器
- 修改容器
- 將容器保存爲新的鏡像
缺點:
- 效率低、可重複性弱、容易出錯
- 使用者無法對鏡像進行審計,存在安全隱患
2.1 導入本地已經下載好的鏡像
docker load -i rhel7.tar
docker history rhel7:latest
2.2 運行容器
docker run -it --rm rhel7 bash # --rm退出之後就會自動刪除
docker ps #顯示運行容器
docker ps -a #顯示所有容器(包括停止的容器)
docker pull busybox #拉取一個bysybox鏡像
docker history busybox:latest #查看busybox在開啓的時候執行什麼
docker run -it busybox #運行容器
2.3 修改容器
上面在busybox容器中創建了幾個文件,已經修改過容器,修改完畢後退出保存即可。
使用ctrl+d 退出容器,但是這樣退出容器就被停止了
#可以通過容器ID再次啓動
docker start 4b39bedf3340
docker ps
docker attach 4b39bedf3340 #再次連接
ctrl+pq #這樣退出表示讓容器在後臺運行
2.4 將容器保存爲新的鏡像
docker commit 4b39bedf3340 busybox:v1 #保存新的鏡像
docker images #查看所有鏡像
docker history busybox:latest #查看原始鏡像
docker history busybox:v1 #查看新的鏡像
可以看出,新保存的V1鏡像只是在原始鏡像上面又追加了一層,其餘鏡像層和原始鏡像是完全一樣的,一層一層往上疊加。
docker rm -f 4b39bedf3340 #刪除容器(正在運行的容器需要使用 -f 強制刪除)
docker run -it --rm busybox:v1
可以看到,通過這種打包鏡像的方法,可以將我們修改後的數據得以保存,但是這種方法不推薦,因爲將數據存到鏡像層裏面,它的文件系統讀取速度效率非常低下,將數據存儲到宿主機物理磁盤中更加高效,這個後面會說。