1. 程式人生 > >Docker-映象常用命令

Docker-映象常用命令

映象是Docker三大元件之一。Docker執行容器之前需要本地宿主機上存在該映象,如果本地宿主機上不存在該映象,那麼Docker會從映象倉庫中下載該映象!接下來記錄一下如何管理映象,包括下載映象、列出映象等:

獲取映象

Docker Hub上有大量的高質量的映象可以使用,接下來將記錄一下怎麼獲取這些映象。獲取映象的命令格式如下:

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

格式說明:

  • OPTIONS:選項。可以使用如下OPTIONS:
    • -a, –all-tags:從映象倉庫中下載所有被標記的映象
    • –disable-content-trust:跳過驗證
  • NAME:倉庫名
  • TAG:標籤
  • DIGEST:資料摘要

接下來,我們下載一個Ubuntu 16.04版本的映象:

[email protected]:~# docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
b234f539f7a1: Pull complete 
55172d420b43: Pull complete 
5ba5bbeb6b91: Pull complete 
43ae2841ad7a: Pull complete 
f6c9c6de4190: Pull complete 
Digest: sha256:b050c1822d37a4463c01ceda24d0fc4c679b0dd3c43e742730e2884d3c582e3a
Status:
Downloaded newer image for ubuntu:16.04

上面的命令中,未指定具體的地址和埠,因此會在Docker Hub中獲取映象。16.04為標籤名。

從下載過程中,先後下載了5個檔案,是因為映象是由多層儲存所構成,所以,下載也是一層層的去下載,並非單一檔案。下載過程中,給出了每一層ID的前12位,並且下載結束後,給出該映象完整的sha256的摘要,以確保下載的一致性

執行

有了映象之後,我們可以以此為基礎執行一個容器。以上面的ubuntu:16.04為例,我們可以執行如下命令:

docker run -i -t --rm ubuntu:16.04 /bin/bash

引數說明:

  • -i:允許你對容器內的標準輸入進行互動
  • -t:在新容器內指定一個偽終端或終端
  • –rm:容器退出後立即刪除容器。一般情況下,無需指定此引數,指定--rm可以避免浪費空間
  • ubuntu:16.04:以此映象為基礎啟動容器
  • /bin/bash:指定的互動式Shell

此命令還可以進行如下簡寫:

docker run -it --rm ubuntu:16.04 bash

檢視更多docker run的用法,我們可以使用docker run --help來進行檢視

進入容器之後,我們可以在容器內執行任何所需的命令。我們可以使用exit命令獲取ctrl + d來退出容器

列出映象

想要知道本機已經下載了哪幾個映象,我們可以使用docker image ls來列出本機已經下載好了的所有映象:

root@ubuntu:~# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               5e8b97a2a082        3 weeks ago         114MB
centos              latest              49f7960eb7e4        3 weeks ago         200MB

結構說明:

  • REPOSITORY:倉庫名稱
  • TAG:標籤名稱
  • IMAGE ID:映象ID
  • CREATED:建立時間
  • SIZE:所佔用的空間

值得注意的是,一個映象可以物件多個標籤,判斷是否為同一個映象,我們可以檢視它的映象ID,映象ID是映象的唯一標識,如果映象ID一樣,則表示為同一映象!!!

仔細觀察,會注意到,這裡標識的所佔用空間和在Docker Hub上看到的映象大小不同,通常情況下,這裡標識的所佔用空間會比在Docker Hub上看到的大!這是因為Docker Hub顯示的體積是壓縮後的體積,在映象上傳和下載過程中,映象是保持壓縮狀態的,因為Docker Hub中顯示的大小是網路傳輸中更關心的流量大小。而docker image ls顯示的是映象下載到本地,展開的大小,準確說,是展開後各層所佔空間的總和,因為映象到本地之後,檢視控制元件的大小,更關心的是本地磁碟佔用的空間大小。

值得注意的是,docker image ls列表中所有映象體積總和並非是所有映象硬碟實際消耗。由於Docker映象是多層儲存結構,並且可以繼承、複用,因此不同映象因為使用相同的基礎映象,從而擁有共同的層。由於Docker使用Union FS技術,相同的層只需要儲存一份即可,所以所有映象硬碟消耗可能要比這個列表映象大小總和要小的多。

我們可以通過如下命令來檢視映象、容器、資料卷所佔用的空間:

root@ubuntu:~# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              2                   0                   313.6MB             313.6MB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       0                   0                   0B                  0B
Build Cache                                                 0B                  0B

docker image ls命令更多操作如下:

  • 顯示摘要資訊docker image ls預設是不輸出摘要資訊的,我們可以使用--digests來顯示摘要資訊:
root@ubuntu:~# docker image ls --digests
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
ubuntu              16.04               sha256:b050c1822d37a4463c01ceda24d0fc4c679b0dd3c43e742730e2884d3c582e3a   5e8b97a2a082        3 weeks ago         114MB
centos              latest              sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322   49f7960eb7e4        3 weeks ago         200MB
  • 虛懸映象: 當你使用docker image ls命令列出當前宿主機上所有已下載的映象時,有可能會有這樣一類映象,它既沒有倉庫名,也沒有標籤名,皆為<none>。其實,這類映象原來是有倉庫名和標籤的,只不過,隨著官方映象的維護,這個映象被重新發布了,以相同倉庫名和標籤名重新發布了。那麼倉庫名和標籤名被轉移到了新下載的映象身上,而舊的映象上的名稱和標籤都被取消了,從而成為了<none>,這類無標籤的映象我們稱之為虛懸映象,我們可以使用如下命令來列出所有的虛懸映象:
docker image ls -f dangling=true

一般來說,虛懸映象已經失去了價值,可以隨意刪除,可以用以下命令進行刪除:

docker image prune
  • 中間層映象: 為了加速映象構建,重複利用資源,Docker會利用中間層映象。預設的docker image ls列表中只會顯示頂層映象,如果希望顯示包括中間層映象在內的所有映象的話,需要加上-a引數,如:
root@ubuntu:~# docker image ls -a
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               5e8b97a2a082        3 weeks ago         114MB
centos              latest              49f7960eb7e4        3 weeks ago         200MB

這樣,你會看到很多無標籤的映象,這些映象與之前的虛懸映象不同,這些無標籤的映象很多都是中間層映象,是其他映象所依賴的映象。這些無標籤映象不應該被刪除,否則上層映象會因為依賴丟失從而導致報錯

  • 列出部分映象
# 指定倉庫名列出映象
root@ubuntu:~# docker image ls ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               5e8b97a2a082        3 weeks ago         114MB


# 列出某個特定的映象
root@ubuntu:~# docker image ls ubuntu:16.04
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               5e8b97a2a082        3 weeks ago         114MB
  • 過濾引數-fdocker image ls還支援強大的過濾引數--filter,簡寫-f
# 過濾出在此映象之後建立的映象,切記是建立,不是下載!-f為過濾引數,since表示此映象之後
root@ubuntu:~# docker image ls -f since=ubuntu:16.04

# 過濾出在此映象之前建立的映象,切記是建立,不是下載!-f為過濾引數,before表示此映象之前
root@ubuntu:~# docker image ls -f before=ubuntu:16.04

# 如果映象構建時,還定義了Label,我們還可以通過label來進行過濾
root@ubuntu:~# docker image ls -f label=baidu.com.version=0.1
  • 指定格式顯示: 預設情況下,docker image ls會顯示一個完整的表格,裡面有倉庫名、標籤名、建立時間、映象ID和佔用空間大小資料,但是,有時我們並不需要知道這麼多資訊,例如,我們只需要列出所有映象的ID,我們可以加上一個-q引數,如下:
root@ubuntu:~# docker image ls -q
5e8b97a2a082
49f7960eb7e4

-f引數還可以與-q引數結合使用,過濾出我們想要的那些映象的ID。

有些時候,我們並不滿意docker image ls列出的表格結構,我們只需要獲取映象的ID和倉庫名稱,此時使用-q引數,或者不帶引數似乎都不盡滿意。我們可以在使用--format引數來格式化顯示,只顯示我們需要的資訊,如下:

root@ubuntu:~# docker image ls --format "{{.Repository}}:{{.ID}}"
ubuntu:5e8b97a2a082
centos:49f7960eb7e4

如果,你想顯示錶格,並且擁有標題行,標題行等距離相隔,我們可以對上面的命令進行修改,如下:

root@ubuntu:~# docker image ls --format "table {{.Repository}}\t{{.ID}}"
REPOSITORY          IMAGE ID
ubuntu              5e8b97a2a082
centos              49f7960eb7e4

還可以使用.Tag.Size來顯示TAG和SIZE資訊。

刪除映象

如果你要刪除本地已經下載的映象,你可以使用docker image rm命令,其格式為:

docker image rm [OPTIONS] IMAGE [IMAGE...]

首先,我們先列出當前宿主機上所有已經下載好的映象列表:

root@ubuntu:~# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               5e8b97a2a082        3 weeks ago         114MB
ubuntu              14.04               578c3e61a98c        3 weeks ago         223MB
ubuntu              latest              113a43faa138        3 weeks ago         81.2MB
centos              latest              49f7960eb7e4        3 weeks ago         200MB
  • 使用完整ID進行刪除: 使用完整ID進行刪除,完整ID即IMAGE ID的值,例如我們將ubuntu:14.04映象進行刪除,我們可以這樣:
root@ubuntu:~# docker image rm 578c3e61a98c
  • 使用短ID進行刪除: 如果處於一種無法複製的環境之下,我們需要對映象進行刪除,如果使用完整ID進行刪除的話,那麼久需要一個一個進行手動輸入,不僅繁瑣,而且還容易出錯。此時我們可以使用短ID進行刪除映象,例如,我們將ubuntu:14.04映象進行刪除,我們可以這樣:
# 短ID長度不做限制,但是越長越精確,避免刪錯映象
root@ubuntu:~# docker image rm 578c3
  • 使用映象名進行刪除: 使用映象名進行刪除,即<倉庫名>:<標籤名>,如果不帶標籤名,預設為<倉庫名>:latest。例如,我們將ubuntu:latest映象進行刪除,我們可以這樣:
[email protected]:~# docker image rm ubuntu
Untagged: ubuntu:latest
Untagged: [email protected]:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Deleted: sha256:113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6
Deleted: sha256:a9fa410a3f1704cd9061a802b6ca6e50a0df183cb10644a3ec4cac9f6421677a
Deleted: sha256:b21f75f60422609fa79f241bf80044e6e133dd0662851afb12dacd22d199233a
Deleted: sha256:038d2d2aa4fb988c06f04e3af208cc0c1dbd9703aa04905ade206d783e7bc06a
Deleted: sha256:b904d425ea85240d6af5a6c6f145e05d5e0127f547f8eb4f68552962df846e81
Deleted: sha256:db9476e6d963ed2b6042abef1c354223148cdcdbd6c7416c71a019ebcaea0edb
  • 使用摘要資訊進行刪除: 在上面,我們知道可以使用docker image ls --digests來獲取摘要資訊,我們可以根據摘要資訊來進行刪除映象。例如,我們,我們將ubuntu:16.04映象進行刪除,它的摘要資訊為:sha256:b050c1822d37a4463c01ceda24d0fc4c679b0dd3c43e742730e2884d3c582e3a,我們可以輸入以下命令將其刪除:
# ubuntu為倉庫名
root@ubuntu:~# docker image rm ubuntu@sha256:b050c1822d37a4463c01ceda24d0fc4c679b0dd3c43e742730e2884d3c582e3a
Untagged: ubuntu@sha256:b050c1822d37a4463c01ceda24d0fc4c679b0dd3c43e742730e2884d3c582e3a
  • docker image ls配合刪除映象: 像其他可以承接過個實體的命令一樣,可以使用docker image ls -q來配合docker image rm來實現批量刪除我們需要刪除的映象:
# 刪除所有映象
root@ubuntu:~# docker image rm $(docker image ls -q)

# 刪除所有倉庫名為ubuntu的映象
root@ubuntu:~# docker image rm $(docker image ls -q ubuntu)

如果仔細觀察上面幾個刪除映象的輸出資訊,你會注意到刪除行為分為兩類:一類是Untagged,另一類是Deleted。因此當我們按照上面的命令進行刪除映象時,實際上是在要求刪除某個映象的標籤。所以首先需要將所有滿足我們要求的映象標籤取消,這就是我們看到的Untagged資訊。因為一個映象可能對應多個標籤,因此我們刪除了所指定的標籤後,還可能有其他標籤指向了這個映象,那麼Deleted行為就不會發生。所以並非所有的docker rmi都會產生刪除映象的行為,有可能僅僅只是取消了某個標籤而已

更多命令

命令 說明
docker image ls 列出映象
docker images 列出映象
docker image ls -a 列出所有映象
docker images -a 列出所有映象
docker image rm 刪除映象
docker rmi 刪除映象

使用docker image --helpdocker images --help發現,docker image命令與docker images命令效果是一樣的!docker image rmdocker rmi效果是一樣的!