Docker 基礎 : 鏡像

目錄
html

鏡像是 Docker 的三大核心概念之一。Docker 運行容器前須要本地存在對應的鏡像,若是本地沒有對應的鏡像,Docker 會嘗試從默認的鏡像倉庫下載。固然用戶也能夠經過配置,使用自定義的鏡像倉庫。
本文將介紹鏡像的具體操做,包括使用 pull 命令從 Docker Hub 的鏡像倉庫中拉取(下載)公共鏡像;查看本地已有的鏡像信息;使用 search 命令搜索鏡像;刪除鏡像標籤和鏡像文件;建立用戶自定義鏡像並上傳到 Docker Hub 鏡像倉庫。
與鏡像相關的操做都被定義在 docker image 子命令中,雖然不帶 image 的格式依然被兼容,但帶上 image 後會讓命令更容易理解,也會有更好的自動補全效果。mysql

獲取鏡像sql

本地鏡像是運行容器的前提,因此在運行容器前咱們須要使用 docker image pull 命令從網絡上的鏡像倉庫把鏡像拉取到本地。該命令的格式爲:
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]docker

若是隻指定了鏡像的名稱,默認會選擇拉取 latest 標籤標記的鏡像。好比咱們要拉取最新的 ubuntu 鏡像:ubuntu

$ docker image pull ubuntu

該命令實際拉取的是 ubuntu:latest 鏡像,當前的最新版本爲 16.04。從上圖中能夠看到,docker 的鏡像其實被分紅了不少的層,每層保存一些特定的文件。上面的命令實際至關於:bash

$ 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.0四、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 技術入門與實戰》

相關文章
相關標籤/搜索