Docker鏡像詳解
前面講到docker包括image,container.....等組件
docker image包含啟動容器所需的文件系統及內容,所以它才能用於創建並啟動docker容器
docker鏡像采用分層構建機制,至少包含兩層,底層是bootfs,其上是rootfs。
我們通過交互式命令進入docker容器時,看起來就像一個操作系統。這有賴於bootfs來引導系統,包括bootloader和kernel,容器啟動完成后它就會被卸載以節約內存資源;
rootfs 位於bootfs之上,它表現為docker容器的根文件系統;
在傳統的系統啟動模式中,內核掛載rootfs時會先將其掛載為“只讀”模式,等到完整性檢查完成后在將其掛載為讀寫模式;而在docker中,rootfs由內核掛載為“只讀”模式,然后通過“聯合掛載”技術再掛載一個“可寫”層,這就是container。

container層作為可寫層,那必定是構建在一個文件系統基礎上,現在新版本的docker中,container是通過overlay2來實現的,並且其底層是xfs格式。通過docker info可以查看到

早期版本docker使用的是aufs或dm等其它存儲驅動(文件系統)
docker鏡像從哪里獲取?Registry 倉庫,即repository。(就像yum倉庫一樣,可以自己搭建也可以使用互聯網上的倉庫,這個后續再講解。docker默認使用的互聯網倉庫是docker hub)
docker容器啟動時會從本地下載鏡像中找指定名字的鏡像,如果沒找到就會直接從網上下載並運行。並且docker service程序docer daemon是通過https從registry倉庫中獲取鏡像的。關於repository需要知道的一些知識:


鏡像生成途徑

這里測試基於容器制作的方式來生成鏡像
1> 創建容器,並做出一些修改。這里使用busybox鏡像,並在它的基礎上啟用httpd服務,配置好httpd的工作目錄並寫入主頁。
#docker run --name bboxhttp -it busybox:latest

2> 確認容器分配到的IP

3> 新開一個會話終端並測試http服務可訪問


4> 在新終端上使用docker container commit命令創建鏡像

注意,生成鏡像的瞬間container在-p參數的作用下暫停了,但是鏡像制作完成后container還是會繼續運行的,不用手動去unpause
5> 如果對倉庫名和標簽進行二次修改,可使用docker tag命令

注意:當同一個image有多個repository:tag時,使用docker image rm只是刪除標簽。如果只有一個repository:tag時,此時再刪除repository:tag會連同鏡像一起被刪掉

6> 驗證生成的鏡像。通過新鏡像啟動的container包含之前創建的httpd服務的家目錄及主頁

7> 在以上步驟基礎上,再進一步制作出讓容器一啟動即運行httpd服務的鏡像,而不是啟動后運行sh。使用docker commit -c 參數實現。

8> 測試驗證。

完成鏡像制作后,就可以將鏡像推送到共有或者自己的私人鏡像倉庫中。這里使用阿里雲自建的倉庫測試,登錄阿里雲容器鏡像倉庫中創建鏡像唱K,並獲取公共地址:

然后修改生成的鏡像倉庫

在倉庫管理界面找到推送鏡像的說明(這里每個人都不一樣一定要根據自己的情況做):

實際操作:

推送:

回到阿里雲鏡像倉庫查看:

鏡像導入導出。不通過網絡上的鏡像倉庫,而直接通過文件傳輸來分發鏡像。使用docker save命令實現。

到mini8服務器上導入鏡像

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">