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
- 過濾引數-f:
docker 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 --help
和docker images --help
發現,docker image
命令與docker images
命令效果是一樣的!docker image rm
與docker rmi
效果是一樣的!