Docker-如何清理磁盤(pán)占用

最近開(kāi)始打包我們的一些應(yīng)用,不得不說(shuō),我已經(jīng)愛(ài)上了Docker這個(gè)工具。在AWS EC2上,它的存在使我們的工作方便了許多。然而,我們遇到的唯一問(wèn)題是Docker的磁盤(pán)占用問(wèn)題。我們?cè)贏mazon Linux的主機(jī)上運(yùn)行Docker,另外我們有一個(gè)擴(kuò)展服務(wù)器用來(lái)建立Docker鏡像作為我們的build pipeline。一旦建立成功,就會(huì)將鏡像通過(guò)ansible-playbook推送到我們的服務(wù)器上。如果可能的話(huà)我會(huì)在我的blog上介紹更多關(guān)于它的內(nèi)容。

我們注意到隨著時(shí)間的推移,Docker似乎占用了主機(jī)的所有磁盤(pán)空間。輸入df -h 顯示 /var/lib/docker 目錄增長(zhǎng)到幾乎覆蓋整個(gè)磁盤(pán)的程度。所以我們四處尋找,得到了以下的解決辦法。

1.確保已退出的容器被刪除

如果一個(gè)docker 容器存在時(shí),這個(gè)容器不能被自動(dòng)刪除。你可以通過(guò)

docker ps -a

命令查看所有的容器。如果要清理所有已退出的容器,可以使用

docker rm -v $(docker ps -a -q -f status=exited)

這條指令會(huì)刪除所有已經(jīng)退出的容器。

-v

指刪除任何不再需要的docker容器。如果沒(méi)有這樣的容器會(huì)返回

docker: “rm” requires a minimum of 1 argument. See ‘docker rm –help’.

這意味著沒(méi)有什么可以被刪去。

2.刪除不需要的“空”圖像。

docker會(huì)保存所有的鏡像文件在你的磁盤(pán),即使不經(jīng)常運(yùn)行。

這樣做好處是為了讓它在本地的“緩存”中有必要的鏡像文件。因?yàn)楫?dāng)你想pull一個(gè)依賴(lài)于那些鏡像文件的鏡像,或者當(dāng)你創(chuàng)建一個(gè)鏡像文件時(shí),你可以使用本地緩存中的鏡像文件。壞處是這極大地占用了磁盤(pán)空間!

移除這些不需要的圖像的命令是:

docker rmi $(docker images -f "dangling=true" -q)

同樣,您可能會(huì)收到一條錯(cuò)誤消息,如果您沒(méi)有任何這樣的圖像。

3.還是沒(méi)有足夠的空間?VFS目錄是什么?

如果你的docker目錄仍然占據(jù)著大量空間,那可能是因?yàn)槎嘤嗟木碚加昧四愕拇疟P(pán)。RM命令的-v命令通常會(huì)處理這個(gè)問(wèn)題。但有時(shí),如果你關(guān)閉容器不會(huì)自動(dòng)刪除容器,VFS目錄將增長(zhǎng)很快。我們可以通過(guò)刪除不需要的卷來(lái)恢復(fù)這個(gè)空間。要做到這一點(diǎn),有一個(gè)Docker鏡像,你可以使用如下命令來(lái)運(yùn)行它:

docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker --rm martin/docker-cleanup-volumes

如果你想要安全,可以來(lái)看看它刪除了什么。

當(dāng)程序運(yùn)行時(shí),它將會(huì)刪除所有不需要的卷,并且釋放空間。

4.一切都好,我仍然需要運(yùn)行嗎?

然后,下一個(gè)問(wèn)題是,盡管一切都很好,但當(dāng)我們的服務(wù)器填滿(mǎn)時(shí),我們必須手動(dòng)運(yùn)行它。這樣很麻煩!

所以我們要讓主機(jī)自動(dòng)運(yùn)行它。

把上面所有的命令到一個(gè)文件在/ etc / cron.daily/目錄。我們創(chuàng)建了一個(gè)名為docker-clean的文件在該目錄下,并且賦予其執(zhí)行權(quán)限。該文件包含以下內(nèi)容:

docker rm -v $(docker ps -a -q -f status=exited)

docker rmi $(docker images -f "dangling=true" -q)

docker run -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker --rm martin/docker-cleanup-volumes

Linux將會(huì)自動(dòng)運(yùn)行這個(gè)任務(wù)在每次docker執(zhí)行之后。我個(gè)人認(rèn)為,這應(yīng)該就像嵌入到docker進(jìn)程的管家一樣。

最后,還是要感謝Docker Team 團(tuán)隊(duì)建立了如此好用的工具

翻譯人:Shedray大數(shù)據(jù)專(zhuān)欄,該成員來(lái)自云+社區(qū)翻譯社

原文鏈接:https://dzone.com/articles/docker-clean-after-yourself

原文作者:Yohan Liyanage

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容