《Docker进阶与实战》——3.2节使用Docker image
本節(jié)書摘來自華章社區(qū)《Docker進(jìn)階與實(shí)戰(zhàn)》一書中的第3章,第3.2節(jié)使用Docker image,作者華為Docker實(shí)踐小組,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“華章社區(qū)”公眾號(hào)查看
3.2 使用Docker image
Docker內(nèi)嵌了一系列命令制作、管理、上傳和下載鏡像。可以調(diào)用REST API給Docker daemon發(fā)送相關(guān)命令,也可以使用client端提供的CLI命令完成操作。本書的第7章會(huì)詳細(xì)闡述Docker REST API的細(xì)節(jié),本節(jié)則主要根據(jù)功能對(duì)涉及image的命令進(jìn)行說明。下面就從Docker image的生命周期角度說明Docker image的相關(guān)使用方法。
3.2.1 列出本機(jī)的鏡像
下面的命令可以列出本地存儲(chǔ)中鏡像,也可以查看這些鏡像的基本信息。
其中,--filter用于過濾docker images的結(jié)果,過濾器采用key=value的這種形式。目前支持的過濾器為dangling和label。 --filter "dangling=true"會(huì)顯示所有“懸掛”鏡像。“懸掛”鏡像沒有對(duì)應(yīng)的名稱和tag,并且其最上層不會(huì)被任何鏡像所依賴。docker commit在一些情況下會(huì)產(chǎn)生這種“懸掛”鏡像。下面第一條命令產(chǎn)生了一個(gè)“懸掛”鏡像,第二條命令則根據(jù)其特點(diǎn)過濾出該鏡像了。圖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參數(shù)可以列出完整長(zhǎng)度的Image ID。若添加參數(shù)-q則會(huì)只輸出Image ID,該參數(shù)在管道命令中很有用處。一般來說懸掛鏡像并不總是我們所需要的,并且會(huì)浪費(fèi)磁盤空間。可以使用如下管道命令刪除所有的“懸掛”鏡像。
$ docker images --filter "dangling=true" -q | xargs docker rmi Deleted: 8a39aa048fe3f2e319651b206073b2a2e437dcf85c15fedb6f437cfe86105145這里的--digests比較特別,這個(gè)參數(shù)是伴隨著新版本的Docker Registry V2(即Distribution)產(chǎn)生的,在本書接下來的第4章會(huì)詳細(xì)說明。
按照Docker官方路標(biāo)和最近的動(dòng)作,Docker只會(huì)保留最核心的image相關(guān)命令和功能,因此那些非核心功能就會(huì)被刪除。比如--tree和--dot已經(jīng)從Docker 1.7中刪掉。官方推薦使用dockerviz工具分析Docker image。執(zhí)行以下命令,可以圖形化地展示Docker image的層次關(guān)系。
dockviz images -d | dot -Tpng -o images.png
執(zhí)行結(jié)果如圖3-2所示,可以看到,同一個(gè)倉庫中的鏡像并不一定要有特別的關(guān)系,比如ubuntu: 14.04和ubuntu:14.04.2之間就沒有共享任何層。
3.2.2 Build:創(chuàng)建一個(gè)鏡像
創(chuàng)建鏡像是一個(gè)很常用的功能,既可以從無到有地創(chuàng)建鏡像,也可以以現(xiàn)有的鏡像為基礎(chǔ)進(jìn)行增量開發(fā),還可以把容器保存為鏡像。下面就詳細(xì)介紹這些方法。
1.直接下載鏡像
我們可以從鏡像倉庫下載一個(gè)鏡像,比如,以下為下載busybox鏡像的示例。
具體使用鏡像倉庫的方法,本書會(huì)在后續(xù)章節(jié)詳細(xì)描述,這里暫不做說明。
2.導(dǎo)入鏡像
還可以導(dǎo)入一個(gè)鏡像,對(duì)此,Docker提供了兩個(gè)可用的命令docker import和docker load。docker load一般只用于導(dǎo)入由docker save導(dǎo)出的鏡像,導(dǎo)入后的鏡像跟原鏡像完全一樣,包括擁有相同的鏡像ID和分層等內(nèi)容。下面的第一行命令可以導(dǎo)出busybox為busybox.tar,第二條命令則是導(dǎo)入該鏡像:
不同于docker load,docker import不能用于導(dǎo)入標(biāo)準(zhǔn)的Docker鏡像,而是用于導(dǎo)入包含根文件系統(tǒng)的歸檔,并將之變成Docker鏡像。
3.制作新的鏡像
前面說過,docker import用于導(dǎo)入包含根文件系統(tǒng)的歸檔,并將之變成Docker鏡像。因此,docker import常用來制作Docker基礎(chǔ)鏡像,如Ubuntu等鏡像。與此相對(duì),docker export則是把一個(gè)鏡像導(dǎo)出為根文件系統(tǒng)的歸檔。
提
示 讀者可以使用Debian提供的Debootstrap制作Debian或Ubuntu的Base image,可以在Docker官網(wǎng)找到教程。
Docker提供的docker commit命令可以增量地生成一個(gè)鏡像,該命令可把容器保存為一個(gè)鏡像,還能注明作者信息和鏡像名稱,這與git commit類似。當(dāng)鏡像名稱為空時(shí),就會(huì)形成“懸掛”鏡像。當(dāng)然,使用這種方式每新增加一層都需要數(shù)個(gè)步驟(比如,啟動(dòng)容器、修改、保存修改等),所以效率是比較低的,因此這種方式適合正式制作鏡像前的嘗試。當(dāng)最終確定制作的步驟后,可以使用docker build 命令,通過Dockerfile文件生成鏡像。
3.2.3 Ship:傳輸一個(gè)鏡像
鏡像傳輸是連接開發(fā)和部署的橋梁。可以使用Docker鏡像倉庫做中轉(zhuǎn)傳輸,還可以使用docker export/docker save生成的tar包來實(shí)現(xiàn),或者使用Docker鏡像的模板文件Dockerfile做間接傳輸。目前托管在Github等網(wǎng)站上的項(xiàng)目,已經(jīng)越來越多地包含有Dockerfile文件;同時(shí)Docker官方鏡像倉庫使用了github.com的webhook功能,若代碼被修改就會(huì)觸發(fā)流程自動(dòng)重新制作鏡像。
3.2.4 Run:以image為模板啟動(dòng)一個(gè)容器
啟動(dòng)容器時(shí),可以使用docker run命令,該命令在相關(guān)章節(jié)會(huì)詳細(xì)描述,本節(jié)不做深入說明。
圖3-3總結(jié)了上文提到的Docker鏡像生命周期管理的相關(guān)命令。現(xiàn)階段Docker鏡像相關(guān)的命令存在一些問題,包括:
命令間邏輯不一致,比如列出容器使用的是docker ps,列出鏡像使用的是docker images。
混用命令導(dǎo)致命令語義不清晰,比如查看容器和鏡像詳細(xì)信息的命令都是 docker inspect。
所以基于這些考慮,Docker項(xiàng)目的路標(biāo)中提到會(huì)把相關(guān)命令歸類,并使用二級(jí)命令來管理。因此讀者可以著重學(xué)習(xí)命令的用法和其實(shí)現(xiàn)的功能,不用過分關(guān)心命令的形式。
總結(jié)
以上是生活随笔為你收集整理的《Docker进阶与实战》——3.2节使用Docker image的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Flume日志收集与MapReduce
- 下一篇: 《Access 2007开发指南(修订版