Docker-01-使用映象
從 Docker 倉庫獲取映象的命令是docker pull
。其命名格式為:
docker pull [選項] [Docker Registry 地址[:埠]/] 倉庫名[:標籤] 複製程式碼
具體的選項可以通過docker pull --help
命令檢視。
映象名稱的格式為:
- Docker 倉庫地址: <域名/IP>[:埠]。預設地址是Docker Hub
- 倉庫名:分為兩段式,<使用者名稱>/<軟體名>。對於 Docker Hub 而言預設為library,也就是官方映象。
比如:
$ docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu bf5d46315322: Pull complete 9f13e0ac480c: Pull complete e8988b5b3097: Pull complete 40af181810e7: Pull complete e6f7c7e5c03e: Pull complete Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b49298 3ae97c3d643fbbe Status: Downloaded newer image for ubuntu:18.04 複製程式碼
執行
有了映象後,我們就能夠以這個映象為基礎啟動並執行一個容器。以上面的ubuntu:18.04 為例,如果我們打算啟動裡面的 bash 並且進行互動式操作的話,可以執行下面的命令。
xin@xin:~$ docker run -it --rm \ > ubuntu:18.04 \ > bash root@d4b54a08d26f:/# cat /etc/os-release NAME="Ubuntu" VERSION="18.04.1 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.1 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic root@d4b54a08d26f:/# 複製程式碼
docker run
就是容器執行的命令。
-
-it
:這兩個引數,一個是-i
:互動式操作,一個是-t
終端。這裡打算進入 bash 執行一些命令並檢視返回結果,因此需要互動式終端。 -
--rm
:這個引數是容器退出後隨之將其刪除。預設情況下,為了排除故障需求,退出的容器並不會立即刪除,除非手動docker rm
。這裡只是誰便知曉個命令,檢視結果,不需要排除故障和保留結果,所以使用--rm
可以避免浪費空間。 -
ubuntu:18.04
:這是指用unbuntu:18.04
映象為基礎來啟動容器。 -
bash
:放在映象後面的是命令,希望有個互動式shell,因此用的是bash。
進入容器後,執行了cat /etc/os-release
,這是檢視當前系統版本的命令,這裡返回的是Ubuntu 18.04.1 LTS
系統。最後,使用exit
命令退出這個容器。
列出映象
想要列出一件下載下來的映象,可以使用docker image ls
命令:
xin@xin:~$ docker image ls REPOSITORYTAGIMAGE IDCREATEDSIZE ubuntu18.0493fd78260bd14 weeks ago86.2MB hello-worldlatest4ab4c602aa5e3 months ago1.84kB 複製程式碼
列表包含了 倉庫名稱、標籤、映象ID、建立時間、以及所佔用的空間大小。
映象體積
docker image ls
列表中的映象體積綜合並非是所有映象實際硬碟消耗,由於Docker映象是多層儲存結果,並且可以繼承和複用,因此不同映象可能會因為使用相同的映象基礎,從而擁有共同的層。由於Docker使用UnionFS,相同的層字需要儲存一份即可,因此實際映象佔用空間很可能要比這個列表映象大小的綜合要小很多。
可以通過以下命令來檢視映象、容器、資料卷所佔用的空間大小。
xin@xin:~$ docker system df TYPETOTALACTIVESIZERECLAIMABLE Images2186.18MB86.18MB (99%) Containers300B0B Local Volumes000B0B Build Cache000B0B 複製程式碼
虛懸映象
所謂的虛懸映象也就是沒有倉庫名也沒有標籤的映象,通過docker image ls
列出來的映象列表展示出來的均為<none>
。
REPOSITORYTAGIMAGE IDCREATEDSIZE <none><none>00285df0df875days ago12 MB 複製程式碼
這個映象原本是又映象名稱和標籤的,隨著映象的維護,釋出了新版本後,重新進行了docker pull 倉庫名:標籤
時,這個映象名被轉移到了新下載的映象上,而舊的映象上的這個名稱則被取消了,從而成為了<nonce>
。除了docker pull
可能會導致這種情況。docker build
也同樣會導致這種情況。這類無標籤的映象也就被稱為了虛懸映象(dangling image)
,可以用下面的命令專門顯示這類的映象:
xin@xin:~$ docker image ls -f dangling=true REPOSITORYTAGIMAGE IDCREATEDSIZE <none><none>00285df0df875days ago12 MB 複製程式碼
一般來說,虛懸映象已經沒有存在的價值了,是可以隨意刪除的,可以用下面的命令刪除:
xin@xin:~$ docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] y Total reclaimed space: 0B 複製程式碼
由於我的docker中已經沒有了虛懸映象,所以顯示回收的空間為0B。
中間層映象
Docker為了加速映象的構建以及重複利用資源,它會利用中間層映象。所以在使用一段時間後,可能會看到一些以來的中間層映象,預設的docker image ls
列表中只會顯示頂層映象,如果希望顯示中間層映象在內的所有映象的話,需要加上-a
引數。
docker image ls -a 複製程式碼
列出部分映象
在使用docker image ls
這條命令時,會列出所有頂級映象,但是有時候我們只希望列出一部分的映象。docker image ls
有好幾個引數可以幫助我們做到這個事情。
更具倉庫名列出映象:
xin@xin:~$ docker image ls ubuntu REPOSITORYTAGIMAGE IDCREATEDSIZE ubuntu18.0493fd78260bd14 weeks ago86.2MB 複製程式碼
也可以更具倉庫名和標籤名,列出特定的某個映象:
xin@xin:~$ docker image ls ubuntu:18.04 REPOSITORYTAGIMAGE IDCREATEDSIZE ubuntu18.0493fd78260bd14 weeks ago86.2MB 複製程式碼
除此之外,docker image ls
還支援強大的過濾器引數,--filter
,或者簡寫成-f
。
我們希望看到hello-world:latest
之後建立的映象,可以用下面的命令:
xin@xin:~$ docker image ls -f since=hello-world:latest REPOSITORYTAGIMAGE IDCREATEDSIZE ubuntu18.0493fd78260bd14 weeks ago86.2MB 複製程式碼
因為,docker在初始化的時候,第一個映象就是hello-world
,之後再拉取了一個ubuntu:18.04
的映象,所以在hello-world:latest
之後的映象就是它了。
如果,想要看ubuntu:18.04
之前構建的映象,只需要把since
換成before即可:
xin@xin:~$ docker image ls -f before=ubuntu:18.04 REPOSITORYTAGIMAGE IDCREATEDSIZE hello-worldlatest4ab4c602aa5e3 months ago1.84kB 複製程式碼
如果,映象構建時,定義了LABEL
,還可以通過LABEL
來過濾:
$ docker image ls -f label=com.example.version=0.1 ... 複製程式碼
以特定格式顯示
預設情況下,docker image ls
會輸出一個完整的表格,但是我們並非所有的時候都會需要這些內容。比如,剛才刪除虛懸映象的時候,我們需要利用docker image ls
把所有的虛懸映象的ID列出來,然後才可以交給docker image rm
命令作為引數來刪除指定的這些映象,這個時候就用到了-q
引數。
xin@xin:~$ docker image ls -q 93fd78260bd1 4ab4c602aa5e 複製程式碼
--filter
配合-q
產生出指定範圍的ID列表來,然後傳給另外一個docker
命令作為引數,從而針對這組實體成批的經行某種操作的做法在Docker命令使用過程中是非常常見的,不僅僅是映象,將來我們會在各種命令看到這類搭配來完成很強大的功能。
有些時候,我們可能只是對錶格的結構不滿意,希望自己組織列;或者不希望有標題,這樣方便其他程式解析結果等,這就用到了GO的模板語法。
比如,下面的命令會直接列出映象結果,並且只包含映象ID和倉庫名:
xin@xin:~$ docker image ls --format "{{.ID}}: {{.Repository}}" 93fd78260bd1: ubuntu 4ab4c602aa5e: hello-world 複製程式碼
是不是感覺到很強大呢!或者,你也可以打打算以表格等距顯示,並且有標題行,和預設的一樣,不過需要自己自定義列:
xin@xin:~$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" IMAGE IDREPOSITORYTAG 93fd78260bd1ubuntu18.04 4ab4c602aa5ehello-worldlatest 複製程式碼
刪除本地映象
如果想要刪除笨的的映象,可以使用docker image rm
命令,其格式為:
docker image rm [選項] <映象1> [<映象2> ...] 複製程式碼
用ID、映象名、摘要刪除映象
其中,<映象>可以是映象短ID、映象長ID、映象名 或者 映象摘要。
比如我們現在就有一些映象:
xin@xin:~$ docker image ls REPOSITORYTAGIMAGE IDCREATEDSIZE ubuntu18.0493fd78260bd14 weeks ago86.2MB hello-worldlatest4ab4c602aa5e3 months ago1.84kB 複製程式碼
我們可用映象的完整id,可以用映象的短ID,一般來說我們都是使用短ID的,因為短ID只要取映象ID的前3個字元以上,就可以區分別的映象了。
比如,我想刪除hello-world:latest
,它的映象ID是4ab4c602aa5e
,然後執行命令:
xin@xin:~$ docker image rm 4ab Untagged: hello-world:latest Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b 複製程式碼
就這樣,一個映象就被刪除了。想要刪除映象當然是不止這一種方式,還可以通過<倉庫名>:<標籤名>
,來刪除映象。
xin@xin:~$ docker image rm hello-world:latest Untagged: hello-world:latest Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b 複製程式碼
如果,你覺得上面刪除的方式都不夠精確,我們可以使用映象摘要
來刪除映象。
xin@xin:~$ docker image ls --digests REPOSITORYTAGDIGESTIMAGE IDCREATEDSIZE ubuntu18.04sha256:6d0e0c26489e33f5a6f0020edface2727db9489744ecc9b4f50c7fa671f23c4993fd78260bd14 weeks ago86.2MB hello-worldlatestsha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e4997884ab4c602aa5e3 months ago1.84kB xin@xin:~$ docker image rm hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 複製程式碼
就這樣,我們可以不同的方式進行映象的刪除。
用 docker image ls 命令來配合
有時候,我們需要刪掉多個映象的時候,一個一個的通過映象ID來刪除,這樣的效率太慢了。所以,我們可以使用docker image ls -q
來配合使用docker image rm
進行批量刪除希望刪除的映象。
比如,我們想刪掉倉庫名為hello-world
的映象:
xin@xin:~$ docker image rm $(docker image ls -q hello-world) Untagged: hello-world:latest Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b 複製程式碼
或者刪除在hello-world:latest
之後的映象:
xin@xin:~$ docker image rm $(docker image ls -q -f since=hello-world:latest) Untagged: redis:latest Untagged: redis@sha256:bf65ecee69c43e52d0e065d094fbdfe4df6e408d47a96e56c7a29caaf31d3c35 ... Untagged: ubuntu:18.04 Untagged: ubuntu@sha256:6d0e0c26489e33f5a6f0020edface2727db9489744ecc9b4f50c7fa671f23c49 ... 複製程式碼
是否感覺很爽呢,短短的一行命令就可以完成這麼多繁瑣的步驟呢。