天天看點

Docker鏡像

鏡像是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鏡像:

Docker鏡像

在列出的資訊中,可以看到幾個字段資訊:

來自于哪個倉庫,比如ubuntu倉庫

鏡像的标簽資訊,比如latest

鏡像的ID号(唯一)

建立時間

鏡像大小

其中鏡像的ID資訊十分重要,它唯一辨別了鏡像。

為了友善在後續工作中使用這個鏡像,還可以使用docker tag指令為本地鏡像添加新的标簽。例如添加一個新的ubuntu:latest鏡像标簽如下:

另外,不同标簽額鏡像的ID是完全一緻的,說明它們實際上指向了同一個鏡像檔案,隻是别名不同而已。标簽在這裡起到了引用或快捷方式的作用。

使用docker inspect指令可以擷取該鏡像的詳細資訊。

Docker鏡像

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關鍵字的鏡像如下所示:

Docker鏡像

可以看到傳回了很多包含關鍵字的鏡像,其中包括鏡像名字,描述,星級(表示該鏡像的受歡迎的程度)、是否官方建立,是否自動建立等。

預設的輸出結果将按照星級評價進行排序。

官方的鏡像說明是官方組建立和維護的,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繼續存在系統中。

是以,正确的做法是,先删除依賴該鏡像的所有容器,再來删除鏡像。

繼續閱讀