一文搞懂 Docker 鏡像的常用操作?。ㄒ晃母愣瞪捣植磺宓氖謾C攝像頭CMOS)
鏡像作為 docker 三大核心概念中,最重要的一個關(guān)鍵詞,它有很多操作,是您想學(xué)習(xí)容器技術(shù)不得不掌握的。本文將帶您一步一步,圖文并重,上手操作來學(xué)習(xí)它。操作之前請確保你已經(jīng)安裝Docker,安裝Docker的過程本文并不涉及,可以查看官網(wǎng)或者Google一下相關(guān)操作系統(tǒng)的安裝,比較簡單。
如果之前沒有了解過Docker可以看一下這篇文章:《可能是把Docker的概念講的最清楚的一篇文章》
Docker官網(wǎng):https://www.docker.com/
Docker官方文檔:https://docs.docker.com/
目錄
一 Docker 下載鏡像
1.1 下載鏡像
1.2 驗證
1.3 下載鏡像相關(guān)細(xì)節(jié)
1.4 PULL 子命令
二 Docker 查看鏡像信息
2.1 images 命令列出鏡像
2.2 使用 tag 命令為鏡像添加標(biāo)簽
2.3 使用 inspect 命令查看鏡像詳細(xì)信息
2.4 使用 history 命令查看鏡像歷史
三 Docker 搜索鏡像
3.1 search 命令
3.2 search 子命令
四 Docker 刪除鏡像
4.1 通過標(biāo)簽刪除鏡像
4.2 通過 ID 刪除鏡像
4.3 刪除鏡像的限制
4.4 清理鏡像
五 Docker 創(chuàng)建鏡像
5.1 基于已有的鏡像創(chuàng)建
5.2 基于 Dockerfile 創(chuàng)建
六 Docker 導(dǎo)出&加載鏡像
6.1 導(dǎo)出鏡像
6.2 加載鏡像
七 Docker 上傳鏡像
7.1 獲取 Docker ID
7.2 創(chuàng)建鏡像倉庫
7.3 上傳鏡像
八 總結(jié)
一 Docker 下載鏡像
如果我們想要在本地運行容器,就必須保證本地存在對應(yīng)的鏡像。所以,第一步,我們需要下載鏡像。當(dāng)我們嘗試下載鏡像時,Docker 會嘗試先從默認(rèn)的鏡像倉庫(默認(rèn)使用 Docker Hub 公共倉庫)去下載,當(dāng)然了,用戶也可以自定義配置想要下載的鏡像倉庫。
1.1 下載鏡像
鏡像是運行容器的前提,我們可以使用?docker pull[IMAGE_NAME]:[TAG]命令來下載鏡像,其中?IMAGE_NAME?表示的是鏡像的名稱,而?TAG?是鏡像的標(biāo)簽,也就是說我們需要通過 “鏡像 + 標(biāo)簽” 的方式來下載鏡像。
注意:?您也可以不顯式地指定 TAG, 它會默認(rèn)下載 latest 標(biāo)簽,也就是下載倉庫中最新版本的鏡像。這里并不推薦您下載 latest 標(biāo)簽,因為該鏡像的內(nèi)容會跟蹤鏡像的最新版本,并隨之變化,所以它是不穩(wěn)定的。在生產(chǎn)環(huán)境中,可能會出現(xiàn)莫名其妙的 bug, 推薦您最好還是顯示的指定具體的 TAG。
舉個例子,如我們想要下載一個 Mysql 5.7 鏡像,可以通過命令來下載:
docker?pull?mysql:5.7
會看到控制臺輸出內(nèi)容如下:
Docker 下載鏡像
注意:?由于官方 DockerHub 倉庫服務(wù)器在國外,下載速度較慢,所以我將倉庫的地址更改成了國內(nèi)的?docker.io?的鏡像倉庫,所以在上圖中,鏡像前面會有?docker.io?出現(xiàn)。
當(dāng)有?Downloaded?字符串輸出的時候,說明下載成功了??!
1.2 驗證
讓我們來驗證一下,本地是否存在 Mysql5.7 的鏡像,運行命令:
docker?images
驗證本地鏡像是否存在
可以看到本地的確存在該鏡像,確實是下載成功了!
1.3 下載鏡像相關(guān)細(xì)節(jié)
再說說上面下載鏡像的過程:
Docker 鏡像下載
通過下載過程,可以看到,一個鏡像一般是由多個層(?layer) 組成,類似?f7e2b70d04ae這樣的串表示層的唯一 ID(實際上完整的 ID 包括了 256 個 bit, 64 個十六進制字符組成)。
您可能會想,如果多個不同的鏡像中,同時包含了同一個層( layer),這樣重復(fù)下載,豈不是導(dǎo)致了存儲空間的浪費么?
實際上,Docker 并不會這么傻會去下載重復(fù)的層(?layer),Docker 在下載之前,會去檢測本地是否會有同樣 ID 的層,如果本地已經(jīng)存在了,就直接使用本地的就好了。
另一個問題,不同倉庫中,可能也會存在鏡像重名的情況發(fā)生, 這種情況咋辦?
嚴(yán)格意義上,我們在使用?docker pull?命令時,還需要在鏡像前面指定倉庫地址(?Registry), 如果不指定,則 Docker 會使用您默認(rèn)配置的倉庫地址。例如上面,由于我配置的是國內(nèi)?docker.io?的倉庫地址,我在?pull?的時候,docker 會默認(rèn)為我加上?docker.io/library?的前綴。
如:當(dāng)我執(zhí)行?docker pull mysql:5.7?命令時,實際上相當(dāng)于?docker pull docker.io/mysql:5.7,如果您未自定義配置倉庫,則默認(rèn)在下載的時候,會在鏡像前面加上 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: 是否獲取倉庫中所有鏡像,默認(rèn)為否;
--disable-content-trust: 跳過鏡像內(nèi)容的校驗,默認(rèn)為 true;
二 Docker 查看鏡像信息
2.1 images 命令列出鏡像
通過使用如下兩個命令,列出本機已有的鏡像:
docker?images
或:
docker?image?ls
如下圖所示:
Docker 查看鏡像信息
對上述紅色標(biāo)注的字段做一下解釋:
REPOSITORY: 來自于哪個倉庫;
TAG: 鏡像的標(biāo)簽信息,比如 5.7、latest 表示不同的版本信息;
IMAGE ID: 鏡像的 ID, 如果您看到兩個 ID 完全相同,那么實際上,它們指向的是同一個鏡像,只是標(biāo)簽名稱不同罷了;
CREATED: 鏡像最后的更新時間;
SIZE: 鏡像的大小,優(yōu)秀的鏡像一般體積都比較小,這也是我更傾向于使用輕量級的 alpine 版本的原因;
注意:圖中的鏡像大小信息只是邏輯上的大小信息,因為一個鏡像是由多個鏡像層(?layer)組成的,而相同的鏡像層本地只會存儲一份,所以,真實情況下,占用的物理存儲空間大小,可能會小于邏輯大小。
2.2 使用 tag 命令為鏡像添加標(biāo)簽
通常情況下,為了方便在后續(xù)工作中,快速地找到某個鏡像,我們可以使用?docker tag?命令,為本地鏡像添加一個新的標(biāo)簽。如下圖所示:
Docker tag 添加標(biāo)簽
為?docker.io/mysql?鏡像,添加新的鏡像標(biāo)簽?allen_mysql:5.7。然后使用?docker images?命令,查看本地鏡像:
Docker tag 添加標(biāo)簽
可以看到,本地多了一個?allen_mysql:5.7?的鏡像。細(xì)心的你一定還會發(fā)現(xiàn),?allen_mysql:5.7?和?docker.io/mysql:5.7?的鏡像 ID 是一模一樣的,說明它們是同一個鏡像,只是別名不同而已。
docker tag?命令功能更像是, 為指定鏡像添加快捷方式一樣。
2.3 使用 inspect 命令查看鏡像詳細(xì)信息
通過?docker inspect?命令,我們可以獲取鏡像的詳細(xì)信息,其中,包括創(chuàng)建者,各層的數(shù)字摘要等。
docker?inspect?docker.io/mysql:5.7
Docker inspect 查看鏡像詳細(xì)信息
docker inspect?返回的是?JSON?格式的信息,如果您想獲取其中指定的一項內(nèi)容,可以通過?-f?來指定,如獲取鏡像大?。?/p>
docker?inspect?-f?{{".Size"}}?docker.io/mysql:5.7
Docker inspect 查看鏡像詳細(xì)信息
2.4 使用 history 命令查看鏡像歷史
前面的小節(jié)中,我們知道了,一個鏡像是由多個層(layer)組成的,那么,我們要如何知道各個層的具體內(nèi)容呢?
通過?docker history?命令,可以列出各個層(layer)的創(chuàng)建信息,如我們查看?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?相關(guān)的鏡像,可以輸入如下命令:
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: 過濾輸出的內(nèi)容;
--limitint:指定搜索內(nèi)容展示個數(shù);
--no-index: 不截斷輸出內(nèi)容;
--no-trunc:不截斷輸出內(nèi)容;
舉個列子,比如我們想搜索官方提供的 mysql 鏡像,命令如下:
docker?search?--filter=is-offical=true?mysql
Docker 搜索官方鏡像
再比如,我們想搜索 Stars 數(shù)超過 100 的 mysql 鏡像:
docker?search?--filter=stars=100?mysql
Docker 搜索鏡像
四 Docker 刪除鏡像
4.1 通過標(biāo)簽刪除鏡像
通過如下兩個都可以刪除鏡像:
docker?rmi?[image]
或者:
docker?image?rm?[image]
支持的子命令如下:
-f,-force: 強制刪除鏡像,即便有容器引用該鏡像;
-no-prune: 不要刪除未帶標(biāo)簽的父鏡像;
Docker 查看鏡像信息
Docker 查看鏡像信息
例如,我們想刪除上章節(jié)創(chuàng)建的?allen_mysql:5.7?鏡像,命令如下:
docker?rmi?allen_mysql:5.7
Docker 刪除鏡像
從上面章節(jié)中,我們知道?allen_mysql:5.7?和?docker.io/mysql:5.7?實際上指向的是同一個鏡像,那么,您可以能會有疑問,我刪除了?allen_mysql:5.7, 會不會將?docker.io/mysql:5.7?鏡像也給刪除了?
實際上,當(dāng)同一個鏡像擁有多個標(biāo)簽時,執(zhí)行?docker rmi?命令,只是會刪除了該鏡像眾多標(biāo)簽中,您指定的標(biāo)簽而已,并不會影響原始的那個鏡像文件。
不信的話,我們可以執(zhí)行?docker images?命令,來看下?docker.io/mysql:5.7?鏡像還在不在:
Docker 查看鏡像信息
可以看到,?docker.io/mysql:5.7?鏡像依然存在!
那么,如果某個鏡像不存在多個標(biāo)簽,當(dāng)且僅當(dāng)只有一個標(biāo)簽時,執(zhí)行刪除命令時,您就要小心了,這會徹底刪除鏡像。
例如,這個時候,我們再執(zhí)行?docker rmi docker.io/mysql:5.7?命令:
Docker 刪除鏡像
從上圖可以看到,我們已經(jīng)刪除了?docker.io/mysql:5.7?鏡像的所有文件層。該鏡像在本地已不復(fù)存在了!
4.2 通過 ID 刪除鏡像
除了通過標(biāo)簽名稱來刪除鏡像,我們還可以通過制定鏡像 ID, 來刪除鏡像,如:
docker?rmi?ee7cbd482336
一旦制定了通過 ID 來刪除鏡像,它會先嘗試刪除所有指向該鏡像的標(biāo)簽,然后在刪除鏡像本身。
4.3 刪除鏡像的限制
刪除鏡像很簡單,但也不是我們何時何地都能刪除的,它存在一些限制條件。
當(dāng)通過該鏡像創(chuàng)建的容器未被銷毀時,鏡像是無法被刪除的。為了驗證這一點,我們來做個試驗。首先,我們通過?docker pull alpine?命令,拉取一個最新的?alpine?鏡像, 然后啟動鏡像,讓其輸出?hello,docker!:
Docker run alpine
接下來,我們來刪除這個鏡像試試:
Docker 刪除鏡像
可以看到提示信息,無法刪除該鏡像,因為有容器正在引用他!同時,這段信息還告訴我們,除非通過添加?-f?子命令,也就是強制刪除,才能移除掉該鏡像!
docker?rmi?-f?docker.io/alpine
但是,我們一般不推薦這樣暴力的做法,正確的做法應(yīng)該是:
先刪除引用這個鏡像的容器;
再刪除這個鏡像;
也就是,根據(jù)上圖中提示的,引用該鏡像的容器 ID (?9d59e2278553), 執(zhí)行刪除命令:
docker?rm?9d59e2278553
然后,再執(zhí)行刪除鏡像的命令:
docker?rmi?5cb3aa00f899
Docker 刪除鏡像
Docker 刪除鏡像
這個時候,就能正常刪除了!
4.4 清理鏡像
我們在使用 Docker 一段時間后,系統(tǒng)一般都會殘存一些臨時的、沒有被使用的鏡像文件,可以通過以下命令進行清理:
docker?image?prune
它支持的子命令有:
-a,--all: 刪除所有沒有用的鏡像,而不僅僅是臨時文件;
-f,--force:強制刪除鏡像文件,無需彈出提示確認(rèn);
五 Docker 創(chuàng)建鏡像
此小節(jié)中,您將學(xué)習(xí) Docker 如何創(chuàng)建鏡像?Docker 創(chuàng)建鏡像主要有三種:
基于已有的鏡像創(chuàng)建;
基于 Dockerfile 來創(chuàng)建;
基于本地模板來導(dǎo)入;
我們將主要介紹常用的 1,2 兩種。
5.1 基于已有的鏡像創(chuàng)建
通過如下命令來創(chuàng)建:
docker?container?commit
支持的子命令如下:
-c,--change=[]: 可以在提交的時候執(zhí)行 Dockerfile 指令,如 CMD、ENTRYPOINT、ENV、EXPOSE、LABEL、ONBUILD、USER、VOLUME、WORIR 等;
-m,--message="": 提交信息;
-p,--pause=true: 提交時,暫停容器運行。
接下來,基于本地已有的 Ubuntu 鏡像,創(chuàng)建一個新的鏡像:
Docker 創(chuàng)建鏡像
首先,讓我將它運行起來,并在其中創(chuàng)建一個 test.txt 文件:
Docker 創(chuàng)建鏡像
命令如下:
docker?run?-it?docker.io/ubuntu:latest?/bin/bashroot@a0a0c8cfec3a:/#?touch?test.txtroot@a0a0c8cfec3a:/#?exit
創(chuàng)建完 test.txt 文件后,需要記住標(biāo)注的容器 ID:?a0a0c8cfec3a, 用它來提交一個新的鏡像(PS: 你也可以通過名稱來提交鏡像,這里只演示通過 ID 的方式)。
執(zhí)行命令:
docker?container?commit?-m?"Added?test.txt?file"?-a?"Allen"?a0a0c8cfec3a?test:0.1
提交成功后,會返回新創(chuàng)建的鏡像 ID 信息,如下圖所示:
Docker 提交新創(chuàng)建的鏡像
再次查看本地鏡像信息,可以看到新創(chuàng)建的?test:0.1?鏡像了:
Docker 查看鏡像信息
5.2 基于 Dockerfile 創(chuàng)建
通過 Dockerfile 的方式來創(chuàng)建鏡像,是最常見的一種方式了,也是比較推薦的方式。Dockerfile 是一個文本指令文件,它描述了是如何基于一個父鏡像,來創(chuàng)建一個新鏡像的過程。
下面讓我們來編寫一個簡單的 Dockerfile 文件,它描述了基于 Ubuntu 父鏡像,安裝 Python3 環(huán)境的鏡像:
FROM?docker.io/ubuntu:latest
LABEL?version="1.0"?maintainer="Allen?
RUN?apt-get?update?&&?\????apt-get?install?-y?python3?&&?\????apt-get?clean?&&?\????rm?-rf?/var/lib/apt/lists/*
創(chuàng)建完成后,通過這個 Dockerfile 文件,來構(gòu)建新的鏡像,執(zhí)行命令:
docker?image?build?-t?python:3?.
注意:?命令的最后有個點,如果不加的話,會構(gòu)建不成功 !
Docker 通過 Dockerfile 構(gòu)建鏡像
編譯成功后,再次查看本地鏡像信息,就可以看到新構(gòu)建的 python:3 鏡像了。
Docker 查看鏡像信息
六 Docker 導(dǎo)出&加載鏡像
此小節(jié)中,您將學(xué)習(xí) Docker 如何導(dǎo)出&加載鏡像。
通常我們會有下面這種需求,需要將鏡像分享給別人,這個時候,我們可以將鏡像導(dǎo)出成 tar 包,別人直接通過加載這個 tar 包,快速地將鏡像引入到本地鏡像庫。
要想使用這兩個功能,主要是通過如下兩個命令:
docker save
docker load
6.1 導(dǎo)出鏡像
查看本地鏡像如下:
Docker 查看鏡像信息
例如,我們想要將 python:3 鏡像導(dǎo)出來,執(zhí)行命令:
docker?save?-o?python_3.tar?python:3
執(zhí)行成功后,查看當(dāng)前目錄:
Docker 導(dǎo)出文件
Docker 導(dǎo)出文件
可以看到?python_3.tar?鏡像文件已經(jīng)生成。接下來,你可以將它通過復(fù)制的方式,分享給別人了!
6.2 加載鏡像
別人拿到了這個?tar?包后,要如何導(dǎo)入到本地的鏡像庫呢?
通過執(zhí)行如下命令:
docker?load?-i?python_3.tar
或者:
docker?load?
導(dǎo)入成功后,查看本地鏡像信息,你就可以獲得別人分享的鏡像了!怎么樣,是不是很方便呢!
七 Docker 上傳鏡像
我們將以上傳到 Docker Hub 上為示例,演示 Docker 如何上傳鏡像。
7.1 獲取 Docker ID
想要上傳鏡像到 Docker Hub 上,首先,我們需要注冊 Docker Hub 賬號。打開 Docker Hub 網(wǎng)址 https://hub.docker.com,開始注冊:
Docker Hub 注冊賬號
填寫您的 Docker ID (也就是賬號),以及密碼,Email, 點擊繼續(xù)。
接下來,Docker Hub 會發(fā)送驗證郵件,到您填寫的郵箱當(dāng)中:
Docker Hub 驗證郵件
點擊驗證即可,接下來,再次返回 Docker Hub 官網(wǎng),用您剛剛注冊的 Docker ID 和密碼來登錄賬號!
Docker Hub 登錄頁面
7.2 創(chuàng)建鏡像倉庫
登錄成功后,會出現(xiàn)如下頁面:
歡迎來到 Docker Hub
選擇創(chuàng)建一個鏡像倉庫:
創(chuàng)建 Python 倉庫
填寫倉庫名稱、描述信息、是否公開后,點擊創(chuàng)建。
倉庫鏡像展示頁
倉庫鏡像展示頁
我們看到,倉庫已經(jīng)創(chuàng)建成功了,但是里面還沒有任何鏡像,接下來開始上傳鏡像,到此新創(chuàng)建的倉庫中。
7.3 上傳鏡像
進入命令行,用我們剛剛獲取的 Docker ID 以及密碼登錄,執(zhí)行命令:
docker?login
命令行登錄 Docker ID
命令行登錄 Docker ID
登錄成功后,我們開始準(zhǔn)備上傳本地的?python:3?鏡像:
python:3 鏡像
首先,我們對其打一個新的標(biāo)簽,前綴與我們新創(chuàng)建的 Docker ID 、倉庫名保持一致:
docker?tag?python:3?weiwosuoai1991/python:3
python:3 鏡像打標(biāo)簽
查看本地信息,可以看到,標(biāo)簽打成功了。接下開,開始上傳!執(zhí)行命令:
docker?push?weiwosuoai1991/python:3
上傳 python:3 鏡像
上傳成功!去 Docker Hub 官網(wǎng),新創(chuàng)建的倉庫的信息頁面驗證一下,是否真的成功了:
倉庫鏡像展示頁
大工告成?。?!
八 總結(jié)
本文中,我們著重學(xué)習(xí)了 Docker 中下載鏡像,、查看鏡像信息、搜索鏡像、刪除鏡像,、創(chuàng)建鏡像、導(dǎo)出&加載鏡像以及向 Docker Hub 上傳鏡像的相關(guān)操作。
Docker 鏡像服務(wù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。