﻿# 如何快速刪除所有已經無用的 Docker 資源 (容器,容器映像,網路)

每隔一段時間，我本機的 Docker 容器映像就會佔用我不少硬碟空間，所以我會定時清理，但這個清理動作不常執行，所以指令都會記不住。這篇文章我打算來整理幾個常見的命令，方便我日後查詢命令。

![docker prune](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/e5820d6965821c042112-202742729-f6b896fc-d5de-410a-baab-5258e38a31c0.png)

-   列出所有無用的容器映像 (List all dangling images)
    
    所謂 **dangling images** 是指那些在每一次 `docker build` 的過程中遺留下來的容器映像。如果你已經先 build 過一次，使用 `demo:latest` 這個 tag，然後再 build 一次，再次使用 `demo:latest` 這個 tag 的話，那麼前一次的 image 並不會被刪掉，而只會被 Untag 而已，而這些 Untag 的 images 就是 **dangling images**！
    
    以下命令可以列出所有 Untag 的容器映像：
    
    ```bash
    docker images --filter "dangling=true"
    ```
    
    > 這裡的 `--filter` 很好用，建議可以看 [docker images 官方文件](https://docs.docker.com/engine/reference/commandline/images/#filtering)查看更多用法！
    
    以下命令可以列出所有 Untag 的容器映像，但只顯示 Image ID 而已：
    
    ```bash
    docker images --filter "dangling=true" -q
    ```
    
    ![image](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/47fbb1a70b1a32ccb954-202736057-fa9e45c7-a5de-4bee-93a2-8ccff53da931.png)
    
-   快速移除所有無用的容器映像 (Remove all dangling images)
    
    以下命令很神奇的剛好同時適用於 **Bash** 與 **PowerShell**，請不要跑在 **Command Prompt** 命令提示字元喔！
    
    ```bash
    docker rmi $(docker images -f "dangling=true" -q)
    ```
    
    這個命令其實有點複雜，一般人記不起來，其實你也可以用以下命令，做到完全一樣的事，好記多了！👍
    
    ```bash
    docker image prune
    ```
    
    ![docker image prune](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/f81381a12dc9bf0a317f-202739419-6f4a09ec-9f86-4dbf-9b3a-65e30da08118.png)
    
-   移除所有沒用到的容器映像 (Remove all unused images)
    
    如果你執行 `docker pull nginx` 拉取 `nginx` 容器映像回來，但是尚未使用這個 image 執行任何容器(Container)，這些不能稱為 **dangling images**，而是 **unused images** (未使用中的容器映像) 而已，如果你想一口氣清楚所有這類 images 的話，可以執行以下命令：
    
    ```bash
    docker image prune -a
    ```
    
    ![docker image prune -a](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/9909a3120b3eadd13655-202739792-7dcacfc3-9221-46df-8066-9797c3b16c54.png)
    
-   移除所有沒用到的 Docker 物件 (Docker System Prune)
    
    以下這個命令不僅僅刪除容器映像而已，而是連同「停用的容器」(stopped containers)、「無用的網路」(dangling networks)、「無用的容器映像」(dangling images)、「無用的建置快取」(dangling build cache) 全部都刪除！
    
    ```bash
    docker system prune -a
    ```
    

### 相關連結

-   [Docker – Removing Dangling and Unused Images | Baeldung](https://www.baeldung.com/ops/docker-remove-dangling-unused-images)
-   [docker images | Docker Documentation](https://docs.docker.com/engine/reference/commandline/images/)
-   [docker system prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/system_prune/)
-   [docker image prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/image_prune/)
