如何列出和刪除 Docker 鏡像?

已發表: 2021-08-03

Docker 是一個眾所周知的平台,它允許您將應用程序作為容器來管理運行和交付,這些容器將操作系統和依賴庫與您的應用程序一起打包。

我們將介紹 Docker 鏡像的管理,主要介紹列出 Docker 鏡像和獲取所需信息的方法,然後在此基礎上學習以有效的方式刪除一個或多個鏡像。

所以讓我們開始吧。

列出 Docker 映像

要列出拉取的 Docker 映像,請使用:

 abhisheknair@geekflare:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis latest aa4d65e670d6 9 days ago 105MB mysql latest c60d96bd2b77 10 days ago 514MB ubuntu latest c29284518f49 2 weeks ago 72.8MB nginx latest 4cdc5dd7eaad 3 weeks ago 133MB hello-world latest d1165f221234 4 months ago 13.3kB redis 4.0 191c4017dcdd 15 months ago 89.3MB abhisheknair@geekflare:~$

與其他docker命令一樣,它支持具有多個選項的images命令。

 $ docker images [OPTIONS] [REPOSITORY[:TAG]]

如果您在沒有任何選項的情況下運行docker images ,它將向您顯示頂級映像,例如docker image ls 、它們的存儲庫和標籤以及它們在磁盤上的大小。

 abhisheknair@geekflare:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest c60d96bd2b77 10 days ago 514MB ubuntu latest c29284518f49 2 weeks ago 72.8MB nginx latest 4cdc5dd7eaad 3 weeks ago 133MB hello-world latest d1165f221234 4 months ago 13.3kB redis 4.0 191c4017dcdd 15 months ago 89.3MB abhisheknair@geekflare:~$

這些映像具有中間層,可提高可用性、加快構建過程並減少上述命令未顯示的磁盤使用量。 SIZE是圖像及其所有父圖像佔用的組合空間。 如果在 docker save圖像時將圖像的內容保存為 Tar 文件,它將等於列出的大小。

如果一個圖像具有多個存儲庫名稱或標籤,則它會被多次列出,儘管由其IMAGE ID標識的單個圖像僅使用一次列出的SIZE

列出最近的圖像

abhisheknair@geekflare:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest c60d96bd2b77 10 days ago 514MB ubuntu latest c29284518f49 2 weeks ago 72.8MB nginx latest 4cdc5dd7eaad 3 weeks ago 133MB hello-world latest d1165f221234 4 months ago 13.3kB redis 4.0 191c4017dcdd 15 months ago 89.3MB abhisheknair@geekflare:~$

按存儲庫和標籤列出圖像

要列出屬於特定存儲庫的所有圖像,請指定存儲庫名稱,例如:

 abhisheknair@geekflare:~$ docker images redis REPOSITORY TAG IMAGE ID CREATED SIZE redis latest aa4d65e670d6 9 days ago 105MB redis 4.0 191c4017dcdd 15 months ago 89.3MB abhisheknair@geekflare:~$

您還可以使用標籤指定存儲庫名稱以獲得更過濾的輸出:

 abhisheknair@geekflare:~$ docker images redis:4.0 REPOSITORY TAG IMAGE ID CREATED SIZE redis 4.0 191c4017dcdd 15 months ago 89.3MB abhisheknair@geekflare:~$

列出完整的圖像 ID

要在不截斷IMAGE ID的情況下列出所有圖像,請使用:

 abhisheknair@geekflare:~$ docker images --no-trunc REPOSITORY TAG IMAGE ID CREATED SIZE redis latest sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7 9 days ago 105MB mysql latest sha256:c60d96bd2b771a8e3cae776e02e55ae914a6641139d963defeb3c93388f61707 10 days ago 514MB ubuntu latest sha256:c29284518f497b8c5f49933e74e43ca5221e69c8251e780427f7d12f716625ff 2 weeks ago 72.8MB nginx latest sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2f 3 weeks ago 133MB hello-world latest sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726 4 months ago 13.3kB redis 4.0 sha256:191c4017dcdd3370f871a4c6e7e1d55c7d9abed2bebf3005fb3e7d12161262b8 15 months ago 89.3MB abhisheknair@geekflare:~$

列出圖像摘要

使用 v2 或更高版本格式的 Docker 映像具有稱為digest的內容可尋址標識符。 要列出圖像摘要值,請使用--digest標誌:

 abhisheknair@geekflare:~$ docker images --digests REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE redis latest sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59 aa4d65e670d6 9 days ago 105MB mysql latest sha256:8b928a5117cf5c2238c7a09cd28c2e801ac98f91c3f8203a8938ae51f14700fd c60d96bd2b77 10 days ago 514MB ubuntu latest sha256:b3e2e47d016c08b3396b5ebe06ab0b711c34e7f37b98c9d37abe794b71cea0a2 c29284518f49 2 weeks ago 72.8MB nginx latest sha256:c5aab9d8e259d54af91e0548abf1fa8188a43079eb86b6ba8df9f482a5380720 4cdc5dd7eaad 3 weeks ago 133MB hello-world latest sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e d1165f221234 4 months ago 13.3kB redis 4.0 sha256:2e03fdd159f4a08d2165ca1c92adde438ae4e3e6b0f74322ce013a78ee81c88d 191c4017dcdd 15 months ago 89.3MB abhisheknair@geekflare:~$

使用2.0註冊表,您可以將這些摘要與pushpullcreaterunrmi命令一起使用。 這也適用於Dockerfile中的FROM命令。

過濾輸出

docker命令支持使用--filter標誌過濾images 。 當前支持的過濾器有:

  • 懸空(布爾值——真或假)
  • 標籤( label=<key>label=<key>=<value>
  • before ( <image-name>[:<tag>] , <image id> or <image@digest> ) – 過濾在給定 id 或引用之前創建的圖像
  • since ( <image-name>[:<tag>] , <image id><image@digest> ) – 過濾自給定 id 或引用創建的圖像
  • 參考(圖像參考的模式)–過濾參考與指定模式匹配的圖像

此外,您可以通過組合使用多個過濾器,例如:

 $ docker images --filter "<key1>=<value1>" --filter"<key2>=<value2>"

例子:

 abhisheknair@geekflare:~$ docker images --filter "before=redis" --filter "since=hello-world" REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest c60d96bd2b77 10 days ago 514MB ubuntu latest c29284518f49 2 weeks ago 72.8MB nginx latest 4cdc5dd7eaad 3 weeks ago 133MB abhisheknair@geekflare:~$

格式化輸出

docker images支持與其他命令、腳本或其他方式嵌套時可能需要的格式化輸出。 這些是--format標誌支持的佔位符:

佔位符描述
.ID 圖像 ID
.Repository 圖像存儲庫
.Tag 圖片標籤
.Digest 圖片摘要
.CreatedSince 自圖像創建以來經過的時間
.CreatedAt 圖像創建時間
.Size 映像磁盤大小

例如,以下命令打印不帶標題的輸出,並為所有圖像輸出由冒號 (:) 分隔的IDRepository

 abhisheknair@geekflare:~$ docker images --format "{{.ID}}: {{.Repository}}" aa4d65e670d6: redis c60d96bd2b77: mysql c29284518f49: ubuntu 4cdc5dd7eaad: nginx d1165f221234: hello-world 191c4017dcdd: redis abhisheknair@geekflare:~$

或者要以表格格式列出所有圖像及其存儲庫和標籤,您可以使用:

 abhisheknair@geekflare:~$ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" IMAGE ID REPOSITORY TAG aa4d65e670d6 redis latest c60d96bd2b77 mysql latest c29284518f49 ubuntu latest 4cdc5dd7eaad nginx latest d1165f221234 hello-world latest 191c4017dcdd redis 4.0 abhisheknair@geekflare:~$

刪除 Docker 映像

要從系統中刪除一個或多個 Docker 映像,我們使用:

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

要刪除單個圖像,只需指定圖像名稱:

 abhisheknair@geekflare:~$ docker image rm redis Untagged: redis:latest Untagged: redis@sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59 Deleted: sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7 Deleted: sha256:3bd00d38f5ca70200050477c527cc60cfdf82911d6fe03932e2bcae31a95cfa2 Deleted: sha256:22722fde392d188cfbe5bbd0c2451cc71cf5b000afc0e5114c1066bb5e113ec9 Deleted: sha256:38212b55ef525e86cd726cd83c1a82a6009c68d24771d6e93d439fdc88e66f0e Deleted: sha256:188c498579cef37b65a93d6448c6b129fa07d5740fc213a18843ff22d80cd10d Deleted: sha256:2117165cd53c98f13ec7af36c9d8acd239fc541c847efaccb49885decf615d68 abhisheknair@geekflare:~$

或者要刪除多個圖像,請指定多個圖像名稱,以空格分隔:

 abhisheknair@geekflare:~$ docker image rm redis mariadb Untagged: redis:latest Untagged: redis@sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59 Deleted: sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7 Deleted: sha256:3bd00d38f5ca70200050477c527cc60cfdf82911d6fe03932e2bcae31a95cfa2 Deleted: sha256:22722fde392d188cfbe5bbd0c2451cc71cf5b000afc0e5114c1066bb5e113ec9 Deleted: sha256:38212b55ef525e86cd726cd83c1a82a6009c68d24771d6e93d439fdc88e66f0e Deleted: sha256:188c498579cef37b65a93d6448c6b129fa07d5740fc213a18843ff22d80cd10d Deleted: sha256:2117165cd53c98f13ec7af36c9d8acd239fc541c847efaccb49885decf615d68 Untagged: mariadb:latest Untagged: mariadb@sha256:3b6f9fa1d406e168998d62501b2ee4f27d53138bebfcdac03540758996c5ff1d Deleted: sha256:fd17f57768027456cc17987058474fb21d3c51e9dd764e4497c1dfe92ff058db Deleted: sha256:a638f04e531b032c81a84bda59a36d1df3c4cec62560c403bc2edb642bce79ba Deleted: sha256:af7a7e7bf72e7ad0c5227995f219d9094fafbe0ac973dbe7eb4ab190a5a58ba5 Deleted: sha256:a0cfd81b291e8da6bca0731c9db70fe1b61d176906b1cf05ade1cd61572ffaaa Deleted: sha256:38b00cb5dab64398092fab2b18563af1ef4a9445dec8a531ac725059dc218f41 Deleted: sha256:6e60d29d2d76125f989f503a78729984f7ba3e26bfbf7038d5ab644b8755b7c2 Deleted: sha256:1dafdd60e471b4c1f5244cfe1d20d79f934f504ef42180b637886be2b0b74370 Deleted: sha256:2fffe8e736cdb99359084e297f4bb54a4cac879366bd3e4333d3dbe966f8e9a6 Deleted: sha256:f728037697805db453111266541c202c74971484ef359ea29b9c60064ed9e47e Deleted: sha256:28155a13db3520201db576bf6d56b68fc08ef27b1c4c49dbfeadef523d35c5f0 Deleted: sha256:7555a8182c42c7737a384cfe03a3c7329f646a3bf389c4bcd75379fc85e6c144 abhisheknair@geekflare:~$

強制移除

可能有正在運行的容器正在使用您嘗試刪除的圖像。 在這種情況下,當您嘗試刪除引用的映像時,Docker 會向您發出警告。

 abhisheknair@geekflare:~$ docker image rm nginx Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container ce908eadf829 is using its referenced image 4cdc5dd7eaad abhisheknair@geekflare:~$

您可以先停止關聯的容器,然後重試,或者使用-f標誌強制刪除圖像(小心)。

 abhisheknair@geekflare:~$ docker image rm nginx -f Untagged: nginx:latest Untagged: nginx@sha256:c5aab9d8e259d54af91e0548abf1fa8188a43079eb86b6ba8df9f482a5380720 Deleted: sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2f abhisheknair@geekflare:~$

修剪圖像

在某些情況下,未使用的圖像會佔用磁盤空間,或者您只需要清理舊的懸空圖像。 您可以使用以下方法清除此類未使用的圖像:

 $ docker image prune

例子:

 abhisheknair@geekflare:~$ docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] y Total reclaimed space: 0B abhisheknair@geekflare:~$

如果您還想清理所有容器未使用的所有圖像,請使用-a標誌:

 abhisheknair@geekflare:~$ docker image prune -a WARNING! This will remove all images without at least one container associated to them. Are you sure you want to continue? [y/N] y Deleted Images: untagged: mariadb:latest untagged: mariadb@sha256:3b6f9fa1d406e168998d62501b2ee4f27d53138bebfcdac03540758996c5ff1d deleted: sha256:fd17f57768027456cc17987058474fb21d3c51e9dd764e4497c1dfe92ff058db deleted: sha256:a638f04e531b032c81a84bda59a36d1df3c4cec62560c403bc2edb642bce79ba deleted: sha256:af7a7e7bf72e7ad0c5227995f219d9094fafbe0ac973dbe7eb4ab190a5a58ba5 deleted: sha256:a0cfd81b291e8da6bca0731c9db70fe1b61d176906b1cf05ade1cd61572ffaaa deleted: sha256:38b00cb5dab64398092fab2b18563af1ef4a9445dec8a531ac725059dc218f41 deleted: sha256:6e60d29d2d76125f989f503a78729984f7ba3e26bfbf7038d5ab644b8755b7c2 deleted: sha256:1dafdd60e471b4c1f5244cfe1d20d79f934f504ef42180b637886be2b0b74370 deleted: sha256:2fffe8e736cdb99359084e297f4bb54a4cac879366bd3e4333d3dbe966f8e9a6 deleted: sha256:f728037697805db453111266541c202c74971484ef359ea29b9c60064ed9e47e deleted: sha256:28155a13db3520201db576bf6d56b68fc08ef27b1c4c49dbfeadef523d35c5f0 deleted: sha256:7555a8182c42c7737a384cfe03a3c7329f646a3bf389c4bcd75379fc85e6c144 untagged: redis:latest untagged: redis@sha256:cd0c68c5479f2db4b9e2c5fbfdb7a8acb77625322dd5b474578515422d3ddb59 deleted: sha256:aa4d65e670d6518e5da96ca9d1a76370a942970a8802e6d5cc6bcf058ab12ca7 deleted: sha256:3bd00d38f5ca70200050477c527cc60cfdf82911d6fe03932e2bcae31a95cfa2 deleted: sha256:22722fde392d188cfbe5bbd0c2451cc71cf5b000afc0e5114c1066bb5e113ec9 deleted: sha256:38212b55ef525e86cd726cd83c1a82a6009c68d24771d6e93d439fdc88e66f0e deleted: sha256:188c498579cef37b65a93d6448c6b129fa07d5740fc213a18843ff22d80cd10d deleted: sha256:2117165cd53c98f13ec7af36c9d8acd239fc541c847efaccb49885decf615d68 Total reclaimed space: 445.2MB abhisheknair@geekflare:~$

您還可以使用--force-f標誌在不確認的情況下繼續清理,或使用--filter標誌為prune命令提供過濾器值(例如,'until=<timestamp>')。

例子:

 $ docker image prune -a --force --filter "until=2021-01-04T00:00:00"

或者

$ docker image prune --filter="label=deprecated"

使用 rmi 命令

您還可以將rmi命令與 docker 一起使用來刪除圖像。

它從 Docker 節點中刪除(並取消標記)一個或多個圖像。 如果一個圖像有多個標籤,使用這個帶有標籤作為參數的命令只會刪除標籤。 如果標籤是圖像的唯一標籤,則圖像和標籤都將被刪除。

此命令不會從註冊表中刪除圖像。 此外,除非像docker image rm命令一樣使用-f選項,否則無法刪除正在運行的容器的映像。

例子:

 abhisheknair@geekflare:~$ docker rmi alpine Untagged: alpine:latest Untagged: alpine@sha256:adab3844f497ab9171f070d4cae4114b5aec565ac772e2f2579405b78be67c96 Deleted: sha256:d4ff818577bc193b309b355b02ebc9220427090057b54a59e73b79bdfe139b83 Deleted: sha256:72e830a4dff5f0d5225cdc0a320e85ab1ce06ea5673acfe8d83a7645cbd0e9cf abhisheknair@geekflare:~$

您還可以使用--no-prune指定不刪除未標記的父級。

停止容器並刪除圖像

在許多情況下,您可能需要停止所有容器並刪除所有關聯的圖像。 您可以通過以下方式簡單地做到這一點:

 $ docker rm -vf $(docker ps -a -q)

上述命令將強制停止並刪除所有正在運行的容器。 然後我們可以繼續使用以下方法刪除鏈接的圖像:

 $ docker rmi -f $(docker images -a -q)

概括

Docker 是一種多功能工具,是當今 DevOps 工程師武器庫的重要組成部分,也是 Kubernetes 等其他熱門技術的一部分。 Docker 映像管理是 Docker 部署管理和故障排除的重要組成部分之一。

您現在應該對docker CLI 命令及其imageimagesrmi等命令提供的功能有了基本的了解。 他們的標誌提供進一步的定制,並提供有助於自動化和高級使用的高級過濾和定制選項。

使用docker [COMMAND] help獲取有關可用選項和相關幫助主題的更多詳細信息。