天天看點

《Docker進階與實戰》——3.2節使用Docker imagedockviz images -d | dot -Tpng -o images.png

本節書摘來自華章社群《docker進階與實戰》一書中的第3章,第3.2節使用docker image,作者華為docker實踐小組,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

3.2 使用docker image

docker内嵌了一系列指令制作、管理、上傳和下載下傳鏡像。可以調用rest api給docker daemon發送相關指令,也可以使用client端提供的cli指令完成操作。本書的第7章會詳細闡述docker rest api的細節,本節則主要根據功能對涉及image的指令進行說明。下面就從docker image的生命周期角度說明docker image的相關使用方法。

3.2.1 列出本機的鏡像

下面的指令可以列出本地存儲中鏡像,也可以檢視這些鏡像的基本資訊。

其中,--filter用于過濾docker images的結果,過濾器采用key=value的這種形式。目前支援的過濾器為dangling和label。 --filter "dangling=true"會顯示所有“懸挂”鏡像。“懸挂”鏡像沒有對應的名稱和tag,并且其最上層不會被任何鏡像所依賴。docker commit在一些情況下會産生這種“懸挂”鏡像。下面第一條指令産生了一個“懸挂”鏡像,第二條指令則根據其特點過濾出該鏡像了。圖3-2中的d08407d841f3就是這種鏡像。

在上面的指令中,--no-trunc參數可以列出完整長度的image id。若添加參數-q則會隻輸出image id,該參數在管道指令中很有用處。一般來說懸挂鏡像并不總是我們所需要的,并且會浪費磁盤空間。可以使用如下管道指令删除所有的“懸挂”鏡像。

這裡的--digests比較特别,這個參數是伴随着新版本的docker registry v2(即distribution)産生的,在本書接下來的第4章會詳細說明。

按照docker官方路标和最近的動作,docker隻會保留最核心的image相關指令和功能,是以那些非核心功能就會被删除。比如--tree和--dot已經從docker 1.7中删掉。官方推薦使用dockerviz工具分析docker image。執行以下指令,可以圖形化地展示docker image的層次關系。

執行結果如圖3-2所示,可以看到,同一個倉庫中的鏡像并不一定要有特别的關系,比如ubuntu: 14.04和ubuntu:14.04.2之間就沒有共享任何層。

《Docker進階與實戰》——3.2節使用Docker imagedockviz images -d | dot -Tpng -o images.png

3.2.2 build:建立一個鏡像

建立鏡像是一個很常用的功能,既可以從無到有地建立鏡像,也可以以現有的鏡像為基礎進行增量開發,還可以把容器儲存為鏡像。下面就詳細介紹這些方法。

1.直接下載下傳鏡像

我們可以從鏡像倉庫下載下傳一個鏡像,比如,以下為下載下傳busybox鏡像的示例。

具體使用鏡像倉庫的方法,本書會在後續章節較長的描述,這裡暫不做說明。

2.導入鏡像

還可以導入一個鏡像,對此,docker提供了兩個可用的指令docker import和docker load。docker load一般隻用于導入由docker save導出的鏡像,導入後的鏡像跟原鏡像完全一樣,包括擁有相同的鏡像id和分層等内容。下面的第一行指令可以導出busybox為busybox.tar,第二條指令則是導入該鏡像:

不同于docker load,docker import不能用于導入标準的docker鏡像,而是用于導入包含根檔案系統的歸檔,并将之變成docker鏡像。

3.制作新的鏡像

前面說過,docker import用于導入包含根檔案系統的歸檔,并将之變成docker鏡像。是以,docker import常用來制作docker基礎鏡像,如ubuntu等鏡像。與此相對,docker export則是把一個鏡像導出為根檔案系統的歸檔。 

示 讀者可以使用debian提供的debootstrap制作debian或ubuntu的base image,可以在docker官網找到教程。

docker提供的docker commit指令可以增量地生成一個鏡像,該指令可把容器儲存為一個鏡像,還能注明作者資訊和鏡像名稱,這與git commit類似。當鏡像名稱為空時,就會形成“懸挂”鏡像。當然,使用這種方式每新增加一層都需要數個步驟(比如,啟動容器、修改、儲存修改等),是以效率是比較低的,是以這種方式适合正式制作鏡像前的嘗試。當最終确定制作的步驟後,可以使用docker build 指令,通過dockerfile檔案生成鏡像。

3.2.3 ship:傳輸一個鏡像

鏡像傳輸是連接配接開發和部署的橋梁。可以使用docker鏡像倉庫做中轉傳輸,還可以使用docker export/docker save生成的tar包來實作,或者使用docker鏡像的模闆檔案dockerfile做間接傳輸。目前托管在github等網站上的項目,已經越來越多地包含有dockerfile檔案;同時docker官方鏡像倉庫使用了github.com的webhook功能,若代碼被修改就會觸發流程自動重新制作鏡像。

3.2.4 run:以image為模闆啟動一個容器

啟動容器時,可以使用docker run指令,該指令在相關章節會較長的描述,本節不做深入說明。

圖3-3總結了上文提到的docker鏡像生命周期管理的相關指令。現階段docker鏡像相關的指令存在一些問題,包括:

指令間邏輯不一緻,比如列出容器使用的是docker ps,列出鏡像使用的是docker images。

混用指令導緻指令語義不清晰,比如檢視容器和鏡像詳細資訊的指令都是 docker inspect。

是以基于這些考慮,docker項目的路标中提到會把相關指令歸類,并使用二級指令來管理。是以讀者可以着重學習指令的用法和其實作的功能,不用過分關心指令的形式。

《Docker進階與實戰》——3.2節使用Docker imagedockviz images -d | dot -Tpng -o images.png