Docker用戶會在使用docker一段時間后發現宿主機的磁盤很容易就快被占滿,並且手動docker rmi [imgName]
似乎並不能釋放磁盤,貌似想刪掉的鏡像依然在宿主機中,下面針對這一問題提出一些解決方案。
Docker空間占用查看
1.13版本后Docker提供給了一些System命令,例如df命令查看Docker占用分布:
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 3 0 5.373GB 5.373GB (100%) Containers 0 0 0B 0B Local Volumes 0 0 0B 0B
$ docker system df -v 命令可以進一步查看空間占用細節,以確定是哪個鏡像、容器或本地卷占用過高空間
清理方法
1 自動清理命令
docker system prune
可對空間進行自動清理。
該命令所清理的對象如下:
已停止的容器
未被任何容器使用的卷
未被任何容器所關聯的網絡
所有懸空的鏡像
對於上面提到的一些鏡像或容器的狀態,需要我們心里有點數:
已使用的鏡像:指所有已被容器(包括stop的)關聯的鏡像,也就是docker ps -a所看到的所有容器對應的image。
未引用鏡像:沒有被分配或使用在容器中的鏡像
懸空鏡像(dangling image):未配置任何Tag(也就是無法被引用)的鏡像。通常是由於鏡像編譯過程中未指定-t參數配置Tag導致的。
docker system prune
后可以加額外的參數,如:docker system prune -a
: 一並清除所有未被使用的鏡像和懸空鏡像。docker system prune -f
: 用以強制刪除,不提示信息。
另外除了system級別的,還有針對容器或是鏡像級別的刪除命令:
docker image prune:刪除懸空的鏡像。
docker container prune:刪除無用的容器。
--默認情況下docker container prune命令會清理掉所有處於stopped狀態的容器 --如果不想那么殘忍統統都刪掉,也可以使用--filter標志來篩選出不希望被清理掉的容器。例子:清除掉所有停掉的容器,但24內創建的除外: --$ docker container prune --filter "until=24h" docker volume prune:刪除無用的卷。 docker network prune:刪除無用的網絡
手動清除
對於懸空鏡像和未使用鏡像可以使用手動進行個別刪除:
1、刪除所有懸空鏡像,不刪除未使用鏡像:docker rmi $(docker images -f "dangling=true" -q)
2、刪除所有未使用鏡像和懸空鏡像docker rmi $(docker images -q)
3、清理卷
如果卷占用空間過高,可以清除一些不使用的卷,包括一些未被任何容器調用的卷(-v 詳細信息中若顯示 LINKS = 0,則是未被調用):
刪除所有未被容器引用的卷:docker volume rm $(docker volume ls -qf dangling=true)
4、容器清理
如果發現是容器占用過高的空間,可以手動刪除一些:
刪除所有已退出的容器:docker rm -v $(docker ps -aq -f status=exited)
刪除所有狀態為dead的容器docker rm -v $(docker ps -aq -f status=dead)