文章首發於微信公眾號: 小哈學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
會看到控制台輸出內容如下:
注意:由於官方 DockerHub 倉庫服務器在國外,下載速度較慢,所以我將倉庫的地址更改成了國內的
docker.io
的鏡像倉庫,所以在上圖中,鏡像前面會有docker.io
出現。
當有 Downloaded 字符串輸出的時候,說明下載成功了!!
1.2 驗證
讓我們來驗證一下,本地是否存在 Mysql5.7 的鏡像,運行命令:
docker images
可以看到本地的確存在該鏡像,確實是下載成功了!
1.3 下載鏡像相關細節
再說說上面下載鏡像的過程:
通過下載過程,可以看到,一個鏡像一般是由多個層(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
如下圖所示:
對上述紅色標注的字段做一下解釋:
- REPOSITORY: 來自於哪個倉庫;
- TAG: 鏡像的標簽信息,比如 5.7、latest 表示不同的版本信息;
- IMAGE ID: 鏡像的 ID, 如果您看到兩個 ID 完全相同,那么實際上,它們指向的是同一個鏡像,只是標簽名稱不同罷了;
- CREATED: 鏡像最后的更新時間;
- SIZE: 鏡像的大小,優秀的鏡像一般體積都比較小,這也是我更傾向於使用輕量級的 alpine 版本的原因;
注意:圖中的鏡像大小信息只是邏輯上的大小信息,因為一個鏡像是由多個鏡像層(
layer
)組成的,而相同的鏡像層本地只會存儲一份,所以,真實情況下,占用的物理存儲空間大小,可能會小於邏輯大小。
2.2 使用 tag 命令為鏡像添加標簽
通常情況下,為了方便在后續工作中,快速地找到某個鏡像,我們可以使用 docker tag
命令,為本地鏡像添加一個新的標簽。如下圖所示:
為 docker.io/mysql
鏡像,添加新的鏡像標簽 allen_mysql:5.7
。然后使用 docker images
命令,查看本地鏡像:
可以看到,本地多了一個 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
返回的是 JSON
格式的信息,如果您想獲取其中指定的一項內容,可以通過 -f
來指定,如獲取鏡像大小:
docker inspect -f {{".Size"}} docker.io/mysql:5.7
2.4 使用 history 命令查看鏡像歷史
前面的小節中,我們知道了,一個鏡像是由多個層(layer)組成的,那么,我們要如何知道各個層的具體內容呢?
通過 docker history
命令,可以列出各個層(layer)的創建信息,如我們查看 docker.io/mysql:5.7
的各層信息:
docker history docker.io/mysql:5.7
可以看到,上面過長的信息,為了方便展示,后面都省略了,如果您想要看具體信息,可以通過添加 --no-trunc
選項,如下面命令:
docker history --no-trunc docker.io/mysql:5.7
三、Docker 搜索鏡像
3.1 search 命令
您可以通過下面命令進行搜索:
docker search [option] keyword
比如,您想搜索倉庫中 mysql
相關的鏡像,可以輸入如下命令:
docker search mysql
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
再比如,我們想搜索 Stars 數超過 100 的 mysql 鏡像:
docker search --filter=stars=100 mysql
四、總結
本文中,我們着重學習了 Docker 中下載鏡像, 查看鏡像信息,以及搜索鏡像的相關操作。本文是上篇,下篇的文章中,將帶領您學習更多的鏡像操作,也祝您學習愉快!