文章首發於微信公衆號: 小哈學Javamysql
鏡像做爲 Docker 三大核心概念中最重要的一個關鍵詞,它有不少操做,是您想學習容器技術不得不掌握的。本文將帶您一步一步,圖文並重,上手操做來學習它。面試
目錄:sql
若是咱們想要在本地運行容器,就必須保證本地存在對應的鏡像。因此,第一步,咱們須要下載鏡像。當咱們嘗試下載鏡像時,Docker 會嘗試先從默認的鏡像倉庫(默認使用 Docker Hub 公共倉庫)去下載,固然了,用戶也能夠自定義配置想要下載的鏡像倉庫。docker
鏡像是運行容器的前提,咱們可使用 docker pull [IMAGE_NAME]:[TAG]
命令來下載鏡像,其中 IMAGE_NAME
表示的是鏡像的名稱,而 TAG
是鏡像的標籤,也就是說咱們須要經過 「鏡像 + 標籤」 的方式來下載鏡像。bash
注意:您也能夠不顯式地指定 TAG, 它會默認下載 latest 標籤,也就是下載倉庫中最新版本的鏡像。這裏並不推薦您下載 latest 標籤,由於該鏡像的內容會跟蹤鏡像的最新版本,並隨之變化,因此它是不穩定的。在生產環境中,可能會出現莫名其妙的 bug, 推薦您最好仍是顯示的指定具體的 TAG。服務器
舉個例子,如咱們想要下載一個 Mysql 5.7 鏡像,能夠經過命令來下載:微信
docker pull mysql:5.7
複製代碼
會看到控制檯輸出內容以下:ide
注意:因爲官方 DockerHub 倉庫服務器在國外,下載速度較慢,因此我將倉庫的地址更改爲了國內的
docker.io
的鏡像倉庫,因此在上圖中,鏡像前面會有docker.io
出現。學習
當有 Downloaded 字符串輸出的時候,說明下載成功了!!ui
讓咱們來驗證一下,本地是否存在 Mysql5.7 的鏡像,運行命令:
docker images
複製代碼
能夠看到本地的確存在該鏡像,確實是下載成功了!
再說說上面下載鏡像的過程:
經過下載過程,能夠看到,一個鏡像通常是由多個層(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 經過前綴地址的不一樣,來保證不一樣倉庫中,重名鏡像的惟一性。
命令行中輸入:
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 images
複製代碼
或:
docker image ls
複製代碼
以下圖所示:
對上述紅色標註的字段作一下解釋:
注意:圖中的鏡像大小信息只是邏輯上的大小信息,由於一個鏡像是由多個鏡像層(
layer
)組成的,而相同的鏡像層本地只會存儲一份,因此,真實狀況下,佔用的物理存儲空間大小,可能會小於邏輯大小。
一般狀況下,爲了方便在後續工做中,快速地找到某個鏡像,咱們可使用 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
命令功能更像是, 爲指定鏡像添加快捷方式同樣。
經過 docker inspect
命令,咱們能夠獲取鏡像的詳細信息,其中,包括建立者,各層的數字摘要等。
docker inspect docker.io/mysql:5.7
複製代碼
docker inspect
返回的是 JSON
格式的信息,若是您想獲取其中指定的一項內容,能夠經過 -f
來指定,如獲取鏡像大小:
docker inspect -f {{".Size"}} docker.io/mysql:5.7
複製代碼
前面的小節中,咱們知道了,一個鏡像是由多個層(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 search [option] keyword
複製代碼
好比,您想搜索倉庫中 mysql
相關的鏡像,能夠輸入以下命令:
docker search mysql
複製代碼
命令行輸入 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 中下載鏡像, 查看鏡像信息,以及搜索鏡像的相關操做。本文是上篇,下篇的文章中,將帶領您學習更多的鏡像操做,也祝您學習愉快!
最近在網上發現一個不錯的 PDF 資源《Java 核心面試知識.pdf》分享給你們,不光是面試,學習,你都值得擁有!!!
獲取方式: 關注公衆號: 小哈學Java, 後臺回覆 資源,既可獲取資源連接,下面是目錄以及部分截圖:
重要的事情說兩遍,獲取方式: 關注公衆號: 小哈學Java, 後臺回覆 資源,既可獲取資源連接 !!!