首頁 > 軟體

Docker 映象操作使用詳解

2020-06-16 16:52:38

映象是 Docker 的三大核心概念之一。Docker 執行容器前需要本地存在對應的映象,如果本地沒有對應的映象,Docker 會嘗試從預設的映象倉庫下載。當然使用者也可以通過設定,使用自定義的映象倉庫。

本文將介紹映象的具體操作,包括使用 pull 命令從 Docker Hub 的映象倉庫中拉取(下載)公共映象;檢視本地已有的映象資訊;使用 search 命令搜尋映象;刪除映象標籤和映象檔案;建立使用者自定義映象並上傳到 Docker Hub 映象倉庫。

與映象相關的操作都被定義在 docker image 子命令中,雖然不帶 image 的格式依然被相容,但帶上 image 後會讓命令更容易理解,也會有更好的自動補全效果。

獲取映象

本地映象是執行容器的前提,所以在執行容器前我們需要使用 docker image pull 命令從網路上的映象倉庫把映象拉取到本地。該命令的格式為:

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

如果只指定了映象的名稱,預設會選擇拉取 latest 標籤標記的映象。比如我們要拉取最新的 Ubuntu 映象:

$ docker image pull ubuntu



該命令實際拉取的是 ubuntu:latest 映象,當前的最新版本為 16.04。從上圖中可以看到,docker 的映象其實被分成了很多的層,每層儲存一些特定的檔案。上面的命令實際相當於:

$ docker image pull registry.hub.docker.com/ubuntu:latest

即從預設的資料倉儲伺服器 registry.hub.docker.com 中拉取 ubuntu 倉庫中的最新映象。如果我們感覺從 Docker Hub 上拉取映象太慢,可選擇從其它的資料倉儲伺服器上拉取,比如 Docker Hub 在國內部署的伺服器:

$ docker image pull registry.docker-cn.com/library/ubuntu:latest

映象下載到本地後就可執行容器了,比如:

$ docker run --rm ubuntu echo hello docker



檢視映象資訊

使用 docker image ls(或 docker images) 命令可以列出本地儲存的映象:

$ docker image ls



輸出的資訊中包含的內容有:

REPOSITORY:說明映象來自哪個倉庫,比如 ubuntu 或 registry.docker-cn.com/library/ubuntu。

TAG:映象的標籤資訊,比如 14.04 或 latest。

IMAGE ID:標識映象的 ID 號。

CREATED:建立映象的時間。

SIZE:映象大小。

其中映象的 ID 資訊十分重要,它唯一的標識了映象。

TAG 資訊用來標記來自同一個倉庫(比如 ubuntu)的不同映象。例如 ubuntu 倉庫中有多個映象,可以通過 TAG 資訊來區分它們,TAG 13.04、14.04 和 16.04 都代表了不同的發行版本。

使用 docker image tag 命令為原生的映象新增新的標籤還可以方便我們的使用,比如為 ubuntu:14.04 映象新增下面的標籤:

$ docker image tag ubuntu:14.04 oldubuntu

然後就可以通過 oldubuntu 來參照 ubuntu:14.04 映象了。其實從 docker image ls 的輸出中我們可以看到,它們參照的是同一個映象 ID:



我們新增的新標籤就像給映象取了個別名一樣。

使用 docker image inspect 命令可以獲取映象的詳細資訊,比如檢視 ubuntu:latest 映象的資訊:

$ docker image inspect ubuntu:latest



這個命令的輸出很長,上圖只是擷取了一小部分的資訊。它輸出的是一個 JSON 格式的資訊,一般情況下我們會有的放矢的通過 -f 選項取其中的某一部分。比如只獲取映象的 Architecture 資訊:

$ docker image inspect -f {{".Architecture"}} ubuntu:latest

搜尋映象

除了直接在 Docker Hub 的官方網站上搜尋映象資源,還可以通 docker search 命令以命令列的方式進行搜尋,比如搜尋 MySQL 映象:

$ docker search mysql



該圖只擷取了一部分結果。個人感覺這個命令的價值有限,因為我們在選擇映象時還是需要慎重的。往往要在 Docker Hub 的官方網站上檢視映象相關的詳細資訊,然後才會決定是否使用,而 docker search 命令提供的資訊過於有限。

刪除映象

對於不再需要的映象我們可以使用 docker image rm 命令進行刪除,以釋放映象佔用的磁碟空間。我們可以為 docker image rm 命令傳遞映象的標籤或 ID,這兩種方式略微有些區別,下面我們將分別介紹。

使用進行的標籤刪除映象

比如刪除標籤為 mysql:5.6 的映象:

$ docker image rm mysql:5.6



映象的所有內容一下就被刪除了(很多映象層被刪除掉),再來刪除 ubuntu:14.04 試試:

$ docker image rm ubuntu:14.04



為什麼這次只刪除了一點點東西?再去看看進行列表,oldubuntu 還在,並且參照著 ID 為 3b853789146f 的映象:



原來,對於被多個標籤參照的映象 ID,刪除標籤時只是把那個標籤刪掉了,並會真正刪除映象檔案。現在再刪除一次 oldubuntu 試試:



由於 oldubuntu 是最後一個參照該映象的標籤,所以刪除該標籤會同時刪除該映象的所有檔案。

使用映象 ID 刪除映象

對於映象 ID 為 c9d990395902 的映象來說,也有兩個標籤參照著它,分別是 ubuntu:latest 和 newubuntu:



現在讓我們嘗試通過映象 ID 刪除它:

$ docker image rm c9d990395902



此時 docker 檢測到該映象 ID 被參照了多次就機智的報錯了,並且終止了刪除操作。同樣如果由其它的映象參照了該 ID 的映象, docker 同樣會報錯並終止刪除操作。所以,只有當一個映象不被多個標籤參照,也沒其它映象參照它時,才可以被通過映象 ID 刪除。

建立映象

我們可以通過不同的方式建立映象,比如基於已有容器進行建立和基於 Dockerfile 檔案進行建立。筆者在《Docker 基礎 : Dockerfile》一文中介紹過通過 docker build 命令利用 Dockerfile 檔案建立映象,所以這裡只介紹如何通過 docker container commit 命令基於已有容器建立映象。我們先啟動一個以 ubuntu:latest 為映象的容器,然後在當前目錄下建立一個名為 nickfile 的檔案:

$ docker run -it ubuntu:latest bash



在檔案建立後退出容器,但要記住該容器的 ID 為:7e26732e14e6。然後執行下面的命令建立映象:

$ docker container commit -m "add file nickfile." 7e26732e14e6 nickimage



映象建立成功後,你可以在映象列表中看到名稱為 nickimage 的映象:



下面執行一個基於 nickimage 的容器,看看 nickfile 是否存在:

$ docker run --rm nickimage ls



驗明正身!我們在容器中建立的檔案 nickfile 已經被成功的新增到 nickimage 映象中了。

匯出和匯入映象

當碰到沒有網路的環境時,如何獲取映象呢?答案是在能夠獲得映象的環境中把映象匯出為檔案,然後通過 U 盤等裝置拷貝到目標環境中,再進行匯入。

匯出映象

通過 docker image save 命令可以把映象匯出為本地檔案,比如匯出 ubuntu:latest 映象為 ubuntu1604.tar:

$ docker image save -o ubuntu1604.tar ubuntu:latest

一般我們還會再壓縮一下,這樣最終的檔案會小不少:

$ tar -czf ubuntu1604.tar.gz ubuntu1604.tar



檔案大小從 112M 壓縮到了 41M,效果還是很明顯的。

匯入映象

把 ubuntu1604.tar.gz 檔案拷貝到目標系統上後先要解壓出 ubuntu1604.tar 檔案:

$ tar -xf ubuntu1604.tar.gz

然後通過 docker image load 命令執行映象的匯入操作:

$ docker image load -i ubuntu1604.tar

這樣就 OK 了,用 docker image ls 命令看看,是不是已經可以看到 ubuntu:latest 映象了!

上傳映象

可以使用 docker image push 命令把映象上傳到映象倉庫伺服器,預設是上傳到 Docker Hub 的映象倉庫,此時事先需要註冊使用者並進行登入。上傳映象的命令格式為:

docker image push NAME[:TAG]

比如筆者在 Docker Hub 註冊了賬號 ljfpower,並通過 docker login 命令完成了登入操作(需要輸入使用者名稱和密碼進行驗證)。接下來就可把原生的映象上傳到映象倉庫伺服器了。在上傳前需要給映象打上合法的標籤(使用者賬號/倉庫名稱:TAG),比如:

$ docker image tag azcli:1.0 ljfpower/azcli:latest

最後上傳這個標簽就行了:

$ docker image push ljfpower/azcli:latest

上傳後你就可以在 Docker Hub 上看到這個映象了:



總結

映象是使用 docker 的前提,所以本文比較詳細的介紹了 docker 映象相關的操作,包括獲取、檢視、搜尋、建立、刪除、匯出、匯入等。希望對大家了解、學習 docker 有所幫助。

更多Docker相關教學見以下內容: 

Docker安裝應用(CentOS 6.5_x64) https://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 16.04 伺服器上設定使用 Docker  https://www.linuxidc.com/Linux/2017-06/145176.htm
Ubuntu 15.04下安裝Docker  https://www.linuxidc.com/Linux/2015-07/120444.htm
Docker 安裝範例 https://www.linuxidc.com/Linux/2017-04/142666.htm
Docker 建立基礎映象  https://www.linuxidc.com/Linux/2017-05/144112.htm
在 Ubuntu 15.04 上如何安裝Docker及基本用法 https://www.linuxidc.com/Linux/2015-09/122885.htm
Ubuntu 16.04上Docker使用手記 https://www.linuxidc.com/Linux/2016-12/138490.htm
使用Docker分分鐘啟動常用應用  https://www.linuxidc.com/Linux/2017-04/142649.htm
Ubuntu 16.04下Docker修改組態檔不生效解決辦法  https://www.linuxidc.com/Linux/2017-05/143862.htm


IT145.com E-mail:sddin#qq.com