鏡像是Docker的三大核心概念之一。
Docker運作容器前需要本地存在對應的鏡像,如果鏡像不存在本地,Docker會嘗試先從預設鏡像倉庫下載下傳,使用者也可以通過配置,使用自定義的鏡像倉庫。
1、擷取鏡像
鏡像是Docker運作容器的前提。
通常情況下我們可以通過使用docker pull指令從網上下載下傳鏡像。該指令的格式為docker pull NAME[:TAG]。對于Docker鏡像來說,如果不指定TAG,則會預設選擇latest标簽,即下載下傳倉庫中最新版本的鏡像。
從Docker Hub的Ubuntu倉庫下載下傳一個最新的Ubuntu作業系統的鏡像:
該指令實際上下載下傳的就是ubuntu:latest鏡像,目前最新的14.04版本的鏡像。
另外我們也可以通過指定标簽來下載下傳特定版本的某一個鏡像,例如14.04标簽的鏡像。
$sudo docker pull ubuntu:14.04
以上兩條指令實際上都相當于$sudo docker pull registry.hub.docker.com/ubuntu:latest指令,即從預設的注冊伺服器registry.hub.docker.com中的ubuntu倉庫來下載下傳标記為latest的鏡像。
下載下傳鏡像到本地後,即可随時使用該鏡像了,例如利用該鏡像建立一個容器,在其中運作bash應用。
2、檢視鏡像資訊
使用docker p_w_picpaths指令可以列出本地主機上已有的鏡像。
例如,下面的指令列出了本地從官方下載下傳的ubuntu鏡像:
在列出的資訊中,可以看到幾個字段資訊:
來自于哪個倉庫,比如ubuntu倉庫
鏡像的标簽資訊,比如latest
鏡像的ID号(唯一)
建立時間
鏡像大小
其中鏡像的ID資訊十分重要,它唯一辨別了鏡像。
為了友善在後續工作中使用這個鏡像,還可以使用docker tag指令為本地鏡像添加新的标簽。例如添加一個新的ubuntu:latest鏡像标簽如下:
另外,不同标簽額鏡像的ID是完全一緻的,說明它們實際上指向了同一個鏡像檔案,隻是别名不同而已。标簽在這裡起到了引用或快捷方式的作用。
使用docker inspect指令可以擷取該鏡像的詳細資訊。
docker inspect指令傳回的是一個JSON格式的消息,如果我們隻要其中一項内容時,可以使用-f參數來指定,例如,擷取鏡像的Architecture資訊:
在指定鏡像ID的時候,通常使用該ID的前若幹個字元組成的可區分字元串來替代完整的ID。
3、搜尋鏡像
使用docker search指令可以搜尋遠端倉庫中共享的鏡像,預設搜尋Docker Hub官方倉庫中的鏡像。用法為docker search TERM,支援的參數包括:
--automated=flase僅顯示自動建立的鏡像
--no-trunc=flase 輸出資訊不截斷顯示。
-s,--stars=0 指定僅顯示評價為指定星級以上的鏡像。
例如,搜尋帶mysql關鍵字的鏡像如下所示:
可以看到傳回了很多包含關鍵字的鏡像,其中包括鏡像名字,描述,星級(表示該鏡像的受歡迎的程度)、是否官方建立,是否自動建立等。
預設的輸出結果将按照星級評價進行排序。
官方的鏡像說明是官方組建立和維護的,automated資源則允許使用者驗證鏡像的來源和内容。
4、删除鏡像
(1)使用鏡像的标簽删除鏡像
使用docker rmi指令可以删除鏡像,指令格式為docker rmi IMAGE [IMAGE...],其中IMAGE可以為标簽或ID。
例如,要删除掉dl.dockerpool.com:5000/ubuntu:latest鏡像,可以使用如下指令:
這裡可能會有人擔心本地的ubuntu:latest鏡像是否會受到此指令的影響。無需擔心,當同一個鏡像擁有多個标簽的時候,docker rmi指令隻是删除了該鏡像多個标簽中的指定标簽而已,并不影響鏡像檔案。是以上述操作相當于隻是删除了鏡像5506de2b643b的一個标簽而已。
為保險起見,再次檢視本地的鏡像,發現ubuntu:latest鏡像仍然存在:
但當鏡像隻剩下一個标簽的時候就要小心了,此時再使用docker rmi指令會徹底删除該鏡像。
(2)使用鏡像ID删除鏡像
當使用docker rmi指令後面跟上鏡像的ID時,會嘗試删除所有指向該鏡像的标簽,然後删除該鏡像檔案本身。
注意,當有該鏡像建立的容器存在時,鏡像檔案預設是無法被删除的,例如:
先利用ubuntu鏡像建立一個簡單的容器,輸出一句話“hello! I am here!”:
使用docker ps -a指令可以看到本機上存在的所有容器
試圖删除該鏡像,Docker會提示有容器正在運作,無法删除:
如果要強行删除鏡像,可以使用-f參數:
不過不推薦使用-f參數來強制删除一個存在容器依賴的鏡像,因為這樣往往會造成一些遺留的問題。
再次使用docker p_w_picpaths檢視本地的鏡像清單,會發現一個标簽為<none>的臨時鏡像,原來被強制删除的鏡像換了新的ID繼續存在系統中。
是以,正确的做法是,先删除依賴該鏡像的所有容器,再來删除鏡像。