《Docker进阶与实战》——3.2节使用Docker image
本節書摘來自華章社區《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"會顯示所有“懸掛”鏡像?!皯覓臁辩R像沒有對應的名稱和tag,并且其最上層不會被任何鏡像所依賴。docker commit在一些情況下會產生這種“懸掛”鏡像。下面第一條命令產生了一個“懸掛”鏡像,第二條命令則根據其特點過濾出該鏡像了。圖3-2中的d08407d841f3就是這種鏡像。
$ docker commit 0d6cbf57f660 $ docker images --filter "dangling=true" REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE <none> <none> d08407d841f3 3 hours ago 2.43 MB在上面的命令中,--no-trunc參數可以列出完整長度的Image ID。若添加參數-q則會只輸出Image ID,該參數在管道命令中很有用處。一般來說懸掛鏡像并不總是我們所需要的,并且會浪費磁盤空間??梢允褂萌缦鹿艿烂顒h除所有的“懸掛”鏡像。
$ docker images --filter "dangling=true" -q | xargs docker rmi Deleted: 8a39aa048fe3f2e319651b206073b2a2e437dcf85c15fedb6f437cfe86105145這里的--digests比較特別,這個參數是伴隨著新版本的Docker Registry V2(即Distribution)產生的,在本書接下來的第4章會詳細說明。
按照Docker官方路標和最近的動作,Docker只會保留最核心的image相關命令和功能,因此那些非核心功能就會被刪除。比如--tree和--dot已經從Docker 1.7中刪掉。官方推薦使用dockerviz工具分析Docker image。執行以下命令,可以圖形化地展示Docker image的層次關系。
dockviz images -d | dot -Tpng -o images.png
執行結果如圖3-2所示,可以看到,同一個倉庫中的鏡像并不一定要有特別的關系,比如ubuntu: 14.04和ubuntu:14.04.2之間就沒有共享任何層。
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 image的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Flume日志收集与MapReduce
- 下一篇: 《数据科学与大数据分析——数据的发现 分