跳至主要内容

4.16 清理本機容量

再建置了這麼多的映像檔和運行了一堆容器後,想必大家的電腦裡面應該都充斥著一些不需要的檔案,這時候可以透過以下指令來查看目前各個 Docker 物件在系統中所佔據的容量:

$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 63 0 13.25GB 13.25GB (100%)
Containers 0 0 0B 0B
Local Volumes 22 0 667.8MB 667.8MB (100%)
Build Cache 531 0 10.32GB 10.32GB

可以看到其實映像檔及快取就佔據了本機將近 25 GB 的空間。

清理不需要的容器

這時候有幾個方式可以清除容器,除了前面很常使用,關於強制刪除所有容器的指令 ( 要記得這個是連在運行的容器都會刪除,通常都是我在實驗某些容器時才會使用的指令 )

$ docker container rm --force $(docker container ls --all --quiet)

還有稍微文明一點的指令,docker container prune 可以刪除停止運行的容器。

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

清理不需要的映像檔

關於清理映像檔的指令則和清理容器的雷同:

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:03552d52bd99ade4....

Total reclaimed space: 0B

Docker 有提示只會刪除 dangling 的映像檔,而dangling 則意味著標籤被奪走的映像檔。

以下示範什麼行為會製造出 dangling 的映像檔,這邊隨手建立一個 Dockerfile。

FROM alpine:latest
CMD [ "echo", "Hi" ]

接著建置映像檔:

$ docker image build --tag dangling .
[+] Building 0.2s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 36B 0.1s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.0s
=> CACHED [1/1] FROM docker.io/library/alpine:latest 0.0s
=> exporting to image 0.3s
=> => exporting layers 0.3s
=> => writing image sha256:d7bcae79c0f6fff9fa7620078c122b6a65...... 0.0s
=> => naming to docker.io/library/dangling 0.0s

這時候列出所有映像檔,應該會看到剛剛建立好的映像檔。

$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
dangling latest d7bcae79c0f6 1 minutes ago 5.53MB

接著稍微的修改一下剛剛撰寫的 Dockerfile。

FROM alpine:latest
CMD [ "echo", "Hi, My name is Robert!" ]

在使用相同的標籤名字去建置映像檔。

$ docker image build --tag dangling .
[+] Building 0.2s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 36B 0.1s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 34B 0.0s
=> [internal] load metadata for docker.io/library/alpine:latest 0.0s
=> CACHED [1/1] FROM docker.io/library/alpine:latest 0.0s
=> exporting to image 0.3s
=> => exporting layers 0.3s
=> => writing image sha256:2892a0f830e770814c111d1f0fe1e66d66db2... 0.0s
=> => naming to docker.io/library/dangling 0.0s

在列出所有映像檔時,就會看到 dangling 的映像檔,以 none 的方式顯示。

$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
dangling latest 2892a0f830e7 1 minutes ago 5.53MB
<none> <none> d7bcae79c0f6 2 minutes ago 5.53MB

這裡的 none 就是第一份建置的映像檔,因為標籤相同的關係,被第二次建置的映像檔奪走了標籤,轉變成 dangling 的映像檔,而在使用 docker image prune 的指令時,就會幫助你清除這些沒有標籤的映像檔。

而還有更暴力可以清理映像檔的方式,也就是在後方加上 --all 的參數,此指令將會清除所有沒有運行成容器的映像檔,換句話說,如果你現在沒有在運行任何容器或是暫停的容器,那映像檔就會全部被清空的意思。

$ docker image prune --all
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
.......
Total reclaimed space: 5.691GB

可以看到上方清了 5.691 GB 的空間出來。

清理系統

接下來的 docker system prune 這個指令,可以一次清除停止的容器,無名的映像檔,無名的快取,沒有使用到的虛擬網路也會一併清除。

$ docker system prune
WARNING! This will remove:
- all stopped containers