為什麼刪除docker鏡像後依然佔用本地空間?

通過rmi命令刪除本地鏡像之後,硬碟空間並沒有相應空閑出來,這是怎麼回事?


Docker依賴Linux系統的cgroup實現,在mac系統中運行的時候,Docker會啟動一個虛擬機中的Linux內核,並在硬碟上放一個 qcow2 格式的磁碟鏡像文件。這個文件會隨著Docker的使用不斷膨脹,即使刪除不用的Docker Image和Container也不會縮小。

一個叫Théo Chamley的法國人寫了一個腳本釋放Docker.qcow2文件佔用的空間。基本原理是用 docker save 命令保存要保留的image,然後關閉Docker,刪除Docker.qcow2,再啟動Docker,它會自動重建,最後用 docker load 命令恢復保留的image。

From Cleaning up Docker For Mac

#!/bin/bash

# Copyright 2017 Théo Chamley
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in the Software
# without restriction, including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
# to whom the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or
# substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

IMAGES=$@

echo "This will remove all your current containers and images except for:"
echo ${IMAGES}
read -p "Are you sure? [yes/NO] " -n 1 -r
echo # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
exit 1
fi

TMP_DIR=$(mktemp -d)

pushd $TMP_DIR &>/dev/null

open -a Docker
echo "=&> Saving the specified images"
for image in ${IMAGES}; do
echo "==&> Saving ${image}"
tar=$(echo -n ${image} | base64)
docker save -o ${tar}.tar ${image}
echo "==&> Done."
done

echo "=&> Cleaning up"
echo -n "==&> Quiting Docker"
osascript -e "quit app "Docker""
while docker info &>/dev/null 2&>1; do
echo -n "."
sleep 1
done;
echo ""

echo "==&> Removing Docker.qcow2 file"
rm ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2

echo "==&> Launching Docker"
open -a Docker
echo -n "==&> Waiting for Docker to start"
until docker info &>/dev/null 2&>1; do
echo -n "."
sleep 1
done;
echo ""

echo "=&> Done."

echo "=&> Loading saved images"
for image in ${IMAGES}; do
echo "==&> Loading ${image}"
tar=$(echo -n ${image} | base64)
docker load -q -i ${tar}.tar || exit 1
echo "==&> Done."
done

popd &>/dev/null
rm -r ${TMP_DIR}


看到其他答案中吐槽,估計吐槽的是我。那我就改改自己的答案。因為我在 macOS 下大多是測試用,完了就用Linux跑了,所以重置Docker對我來說關係不大,關鍵是操作簡單。

如果大家有重要數據,慎用!慎用!慎用!下面操作相當於重置Docker,會清除所有Docker數據包括:所有的 Contianer,Images。還有下面操作僅限用於macOS~

------下面是原答案------

感覺刪除鏡像後空間不減少的bug,到目前還有解決。

不過刪除所有的images,containers,可以恢復空間。

docker rm $(docker ps -a -q)
docker rmi $(docker images -q)
docker volume rm $(docker volume ls |awk "{print $2}")
rm -rf ~/Library/Containers/com.docker.docker/Data/*


docker system prune -a

docker自己都提供了命令,釋放空間,為什麼不用了?


答案里有個清除的腳本,貿然運行就會發現所有的鏡像都清潔溜溜,再也不會回來了。本人也是受害者,所以改了一下,測試正常,不需要帶參數, 直接跑就好,為了保險,所有導出的tar包在腳本中都沒有刪除,成功後手工刪掉即可。 希望能幫到需要的朋友們。

#!/bin/sh

IMAGES=$(docker images | awk "{print $1":"$2}")

echo "Saving images to tar files."

for image in ${IMAGES}; do
if [ ${image} != "REPOSITORY:TAG" ];then
echo "==&> Saving ${image}......c"
tar=$(echo -n ${image} | base64)
docker save -o ${tar}.tar ${image}
echo "Done."
fi
done

echo "All images saved, ready to exit docker application."

osascript -e "quit app "Docker""

echo "Stopping.c"
while docker info &>/dev/null 2&>1; do
echo ".c"
sleep 1
done;
echo "done.
"

rm ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
echo "Reopen docker application.c"

open -a Docker
until docker info &>/dev/null 2&>1; do
echo ".c"
sleep 1
done;
echo "done.
"

echo "Reload all images."

for image in ${IMAGES}; do
if [ ${image} != "REPOSITORY:TAG" ];then
tar=$(echo -n ${image} | base64)
echo "==&> Loading ${image}......c"
docker load -q -i ${tar}.tar || exit 1
echo "Done."
fi
done

echo "All finished."


docker for mac目前的版本有這個bug, 即使刪除了鏡像和容器系統中的qemu的鏡像的空間不會釋放。現在只能把要用的鏡像push後把docker恢復出廠設置,清空數據再來。

估計等新版出來bug就能被修復了。


docker images -a

你可能看到若干以none命名的鏡像,這些鏡像很可能和你正在用的鏡像產生依賴,因此不能真正刪除。


Docker.qcow2的這個bug,到現在快1年多了。。還沒有解決。我現在感覺不僅僅是這個問題,還有docker的掛載卷文件讀寫速度堪憂。最近在docker上用laravel開發項目,感觸頗多。


現在已經好了,刪除之後重啟一下docker


我的也是 一直在漲漲漲


Mac 版本存在如下目錄,我感覺是不是很多一層一層的軟體包工具,什麼的都幫你緩存了,這些東西有時候一個鏡像刪除了但別的鏡像可能會用到,所以就沒刪,待高手回答!

$HOME/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2


我發現我啟動docker後什麼都不做,一個images都沒有,沒有啟動過任何container,Docker.qcow2也在不停增長


os x么,docker for mac有bug的。

Docker.qcow2 never shrinks


推薦閱讀:

高級語言虛擬機的計算模型?
學生黨的MacBook應該裝什麼系統?
使用G1垃圾收集器是否意味著不需要進行虛擬機性能調優?
Parallels Desktop 10 使用效果如何?
GC 和虛擬機是兩個一定要放在一起的概念嗎?

TAG:機器學習 | 虛擬機 | 鏡像 | 大數據 | Docker |