關於 Docker 映象的操作,看完這篇就夠啦 !(上)

犬小哈發表於2019-03-30

Docker 映象學習上
Docker 映象學習上

文章首發於微信公眾號: 小哈學Java

映象作為 Docker 三大核心概念中最重要的一個關鍵詞,它有很多操作,是您想學習容器技術不得不掌握的。本文將帶您一步一步,圖文並重,上手操作來學習它。

目錄:

  • 一、Docker 下載映象
    • 1.1 下載映象
    • 1.2 驗證
    • 1.3 下載映象相關細節
    • 1.4 PULL 子命令
  • 二、Docker 檢視映象資訊
    • 2.1 images 命令列出映象
    • 2.2 使用 tag 命令為映象新增標籤
    • 2.3 使用 inspect 命令檢視映象詳細資訊
    • 2.4 使用 history 命令檢視映象歷史
  • 三、Docker 搜尋映象
    • 3.1 search 命令
    • 3.2 search 子命令
  • 四、總結

一、Docker 下載映象

如果我們想要在本地執行容器,就必須保證本地存在對應的映象。所以,第一步,我們需要下載映象。當我們嘗試下載映象時,Docker 會嘗試先從預設的映象倉庫(預設使用 Docker Hub 公共倉庫)去下載,當然了,使用者也可以自定義配置想要下載的映象倉庫。

1.1 下載映象

映象是執行容器的前提,我們可以使用 docker pull [IMAGE_NAME]:[TAG]命令來下載映象,其中 IMAGE_NAME 表示的是映象的名稱,而 TAG 是映象的標籤,也就是說我們需要通過 “映象 + 標籤” 的方式來下載映象。

注意:您也可以不顯式地指定 TAG, 它會預設下載 latest 標籤,也就是下載倉庫中最新版本的映象。這裡並不推薦您下載 latest 標籤,因為該映象的內容會跟蹤映象的最新版本,並隨之變化,所以它是不穩定的。在生產環境中,可能會出現莫名其妙的 bug, 推薦您最好還是顯示的指定具體的 TAG。

舉個例子,如我們想要下載一個 Mysql 5.7 映象,可以通過命令來下載:

docker pull mysql:5.7
複製程式碼

會看到控制檯輸出內容如下:

Docker 下載映象
Docker 下載映象

注意:由於官方 DockerHub 倉庫伺服器在國外,下載速度較慢,所以我將倉庫的地址更改成了國內的 docker.io 的映象倉庫,所以在上圖中,映象前面會有 docker.io 出現。

當有 Downloaded 字串輸出的時候,說明下載成功了!!

1.2 驗證

讓我們來驗證一下,本地是否存在 Mysql5.7 的映象,執行命令:

docker images
複製程式碼

驗證本地映象是否存在
驗證本地映象是否存在

可以看到本地的確存在該映象,確實是下載成功了!

1.3 下載映象相關細節

再說說上面下載映象的過程:

Docker 映象下載
Docker 映象下載

通過下載過程,可以看到,一個映象一般是由多個層(layer) 組成,類似 f7e2b70d04ae這樣的串表示層的唯一 ID。

PS: 實際上完整的 ID 包括了 256 個 bit, 64 個十六進位制字元組成的。

您可能會想,如果多個不同的映象中,同時包含了同一個層(layer),這樣重複下載,豈不是導致了儲存空間的浪費麼?

實際上,Docker 並不會這麼傻會去下載重複的層(layer),Docker 在下載之前,會去檢測本地是否會有同樣 ID 的層,如果本地已經存在了,就直接使用本地的就好了。

另一個問題,不同倉庫中,可能也會存在映象重名的情況發生, 這種情況咋辦?

嚴格意義上,我們在使用 docker pull 命令時,還需要在映象前面指定倉庫地址(Registry), 如果不指定,則 Docker 會使用您預設配置的倉庫地址。例如上面,由於我配置的是國內 docker.io 的倉庫地址,我在 pull 的時候,docker 會預設為我加上 docker.io/library 的字首。

如:當我執行 docker pull mysql:5.7 命令時,實際上相當於 docker pull docker.io/mysql:5.7,如果您未自定義配置倉庫,則預設在下載的時候,會在映象前面加上 DockerHub 的地址。

Docker 通過字首地址的不同,來保證不同倉庫中,重名映象的唯一性。

1.4 PULL 子命令

命令列中輸入:

docker pull --help
複製程式碼

會得到如下資訊:

[root@iZbp1j8y1bab0djl9gdp33Z ~]# docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --help                    Print usage
複製程式碼

我們可以看到主要支援的子命令有:

  1. -a, --all-tags=true|false: 是否獲取倉庫中所有映象,預設為否;
  2. --disable-content-trust: 跳過映象內容的校驗,預設為 true;

二、Docker 檢視映象資訊

2.1 images 命令列出映象

通過使用如下兩個命令,列出本機已有的映象:

docker images
複製程式碼

或:

docker image ls
複製程式碼

如下圖所示:

Docker 檢視映象資訊
Docker 檢視映象資訊

對上述紅色標註的欄位做一下解釋:

  • REPOSITORY: 來自於哪個倉庫;
  • TAG: 映象的標籤資訊,比如 5.7、latest 表示不同的版本資訊;
  • IMAGE ID: 映象的 ID, 如果您看到兩個 ID 完全相同,那麼實際上,它們指向的是同一個映象,只是標籤名稱不同罷了;
  • CREATED: 映象最後的更新時間;
  • SIZE: 映象的大小,優秀的映象一般體積都比較小,這也是我更傾向於使用輕量級的 alpine 版本的原因;

注意:圖中的映象大小資訊只是邏輯上的大小資訊,因為一個映象是由多個映象層(layer)組成的,而相同的映象層本地只會儲存一份,所以,真實情況下,佔用的物理儲存空間大小,可能會小於邏輯大小。

2.2 使用 tag 命令為映象新增標籤

通常情況下,為了方便在後續工作中,快速地找到某個映象,我們可以使用 docker tag 命令,為本地映象新增一個新的標籤。如下圖所示:

Docker tag 新增標籤
Docker tag 新增標籤

docker.io/mysql 映象,新增新的映象標籤 allen_mysql:5.7。然後使用 docker images 命令,檢視本地映象:

Docker tag 新增標籤
Docker tag 新增標籤

可以看到,本地多了一個 allen_mysql:5.7 的映象。細心的你一定還會發現,allen_mysql:5.7docker.io/mysql:5.7 的映象 ID 是一模一樣的,說明它們是同一個映象,只是別名不同而已。

docker tag 命令功能更像是, 為指定映象新增快捷方式一樣。

2.3 使用 inspect 命令檢視映象詳細資訊

通過 docker inspect 命令,我們可以獲取映象的詳細資訊,其中,包括建立者,各層的數字摘要等。

docker inspect docker.io/mysql:5.7
複製程式碼

Docker inspect 檢視映象詳細資訊
Docker inspect 檢視映象詳細資訊

docker inspect 返回的是 JSON 格式的資訊,如果您想獲取其中指定的一項內容,可以通過 -f 來指定,如獲取映象大小:

docker inspect -f {{".Size"}} docker.io/mysql:5.7
複製程式碼

Docker inspect 檢視映象詳細資訊
Docker inspect 檢視映象詳細資訊

2.4 使用 history 命令檢視映象歷史

前面的小節中,我們知道了,一個映象是由多個層(layer)組成的,那麼,我們要如何知道各個層的具體內容呢?

通過 docker history 命令,可以列出各個層(layer)的建立資訊,如我們檢視 docker.io/mysql:5.7 的各層資訊:

docker history docker.io/mysql:5.7
複製程式碼

Docker history 各層資訊
Docker history 各層資訊

可以看到,上面過長的資訊,為了方便展示,後面都省略了,如果您想要看具體資訊,可以通過新增 --no-trunc 選項,如下面命令:

docker history --no-trunc docker.io/mysql:5.7
複製程式碼

三、Docker 搜尋映象

3.1 search 命令

您可以通過下面命令進行搜尋:

docker search [option] keyword
複製程式碼

比如,您想搜尋倉庫中 mysql 相關的映象,可以輸入如下命令:

docker search mysql
複製程式碼

Docker 搜尋映象
Docker 搜尋映象

3.2 search 子命令

命令列輸入 docker search --help, 輸出如下:

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --help            Print usage
      --limit int       Max number of search results (default 25)
      --no-index        Don't truncate output
      --no-trunc        Don't truncate output
複製程式碼

可以看到 search 支援的子命令有:

  • -f, --filter filter: 過濾輸出的內容;
  • --limit int:指定搜尋內容展示個數;
  • --no-index: 不截斷輸出內容;
  • --no-trunc:不截斷輸出內容;

舉個列子,比如我們想搜尋官方提供的 mysql 映象,命令如下:

docker search --filter=is-offical=true mysql
複製程式碼

Docker 搜尋官方映象
Docker 搜尋官方映象

再比如,我們想搜尋 Stars 數超過 100 的 mysql 映象:

docker search --filter=stars=100 mysql
複製程式碼

Docker 搜尋映象
Docker 搜尋映象

四、總結

本文中,我們著重學習了 Docker 中下載映象, 檢視映象資訊,以及搜尋映象的相關操作。本文是上篇,下篇的文章中,將帶領您學習更多的映象操作,也祝您學習愉快!

贈送 | 面試&學習福利資源

最近在網上發現一個不錯的 PDF 資源《Java 核心面試知識.pdf》分享給大家,不光是面試,學習,你都值得擁有!!!

獲取方式: 關注公眾號: 小哈學Java, 後臺回覆 資源,既可獲取資源連結,下面是目錄以及部分截圖:

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

福利資源截圖
福利資源截圖

重要的事情說兩遍,獲取方式: 關注公眾號: 小哈學Java, 後臺回覆 資源,既可獲取資源連結 !!!

歡迎關注個人公眾號: 小哈學Java

小哈學Java

相關文章