關於 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 下載鏡像

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

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

1.2 驗證
讓我們來驗證一下,本地是否存在 Mysql5.7 的鏡像,運行命令:

docker images
驗證本地鏡像是否存在

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

1.3 下載鏡像相關細節
再說說上面下載鏡像的過程:

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

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

-a, --all-tags=true|false: 是否獲取倉庫中所有鏡像,默認爲否;
--disable-content-trust: 跳過鏡像內容的校驗,默認爲 true;
二、Docker 查看鏡像信息
2.1 images 命令列出鏡像
通過使用如下兩個命令,列出本機已有的鏡像:

docker images
或:

docker image ls
如下圖所示:

Docker 查看鏡像信息

對上述紅色標註的字段做一下解釋:

REPOSITORY: 來自於哪個倉庫;
TAG: 鏡像的標籤信息,比如 5.7、latest 表示不同的版本信息;
IMAGE ID: 鏡像的 ID, 如果您看到兩個 ID 完全相同,那麼實際上,它們指向的是同一個鏡像,只是標籤名稱不同罷了;
CREATED: 鏡像最後的更新時間;
SIZE: 鏡像的大小,優秀的鏡像一般體積都比較小,這也是我更傾向於使用輕量級的 alpine 版本的原因;
注意:圖中的鏡像大小信息只是邏輯上的大小信息,因爲一個鏡像是由多個鏡像層(layer)組成的,而相同的鏡像層本地只會存儲一份,所以,真實情況下,佔用的物理存儲空間大小,可能會小於邏輯大小。

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

Docker tag 添加標籤

爲 docker.io/mysql 鏡像,添加新的鏡像標籤 allen_mysql:5.7。然後使用 docker images 命令,查看本地鏡像:

Docker tag 添加標籤

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

docker tag 命令功能更像是, 爲指定鏡像添加快捷方式一樣。

2.3 使用 inspect 命令查看鏡像詳細信息
通過 docker inspect 命令,我們可以獲取鏡像的詳細信息,其中,包括創建者,各層的數字摘要等。

docker inspect docker.io/mysql:5.7
Docker inspect 查看鏡像詳細信息

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

docker inspect -f {{".Size"}} docker.io/mysql:5.7
Docker inspect 查看鏡像詳細信息

2.4 使用 history 命令查看鏡像歷史
前面的小節中,我們知道了,一個鏡像是由多個層(layer)組成的,那麼,我們要如何知道各個層的具體內容呢?

通過 docker history 命令,可以列出各個層(layer)的創建信息,如我們查看 docker.io/mysql:5.7 的各層信息:

docker history docker.io/mysql:5.7
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 搜索鏡像

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 搜索官方鏡像

再比如,我們想搜索 Stars 數超過 100 的 mysql 鏡像:

docker search --filter=stars=100 mysql
Docker 搜索鏡像

四、總結
本文中,我們着重學習了 Docker 中下載鏡像, 查看鏡像信息,以及搜索鏡像的相關操作。本文是上篇,下篇的文章中,將帶領您學習更多的鏡像操作,也祝您學習愉快!
原文地址https://www.cnblogs.com/quanxiaoha/p/10628017.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章