場景描述
事情是這樣的,前兩天客戶的服務(wù)器突然斷電了,導致用Docker部署的服務(wù)也掛了。昨天去現(xiàn)場,重啟了docker,同時準備更新一下服務(wù)。結(jié)果發(fā)現(xiàn)有一臺節(jié)點硬盤滿了…
還是覺得有些奇怪的,畢竟docker的安裝盤有800多個G的空間,之前也只用了100左右,覺得有點奇怪,就開始了排錯。
用下面命令查看哪個文件夾太大:
du -sh *
發(fā)現(xiàn)是 /var/lib/docker/overlay 占滿了
網(wǎng)上查一下這個目錄的作用,說是 overlay/overlay2表示Docker的存儲驅(qū)動。
也就是說容器/鏡像等都會存在這個目錄下,當量大的時候就會占滿硬盤。
繼續(xù)在網(wǎng)上搜資料,說可以看看是不是死掉容器過多的原因,使用 docker ps -a看了下,果然是。于是清理了一下無用的容器,硬盤就恢復正常了……
當Docker的磁盤空間占用超過限制時,可能會導致容器無法創(chuàng)建、存儲和運行。造成磁盤占滿的原因可能包括:
-
容器鏡像層過多:每個容器都有其自己的鏡像層,這些層會占用磁盤空間。如果使用的容器鏡像層過多,就會導致磁盤空間不足。
-
鏡像下載失敗:在下載鏡像時,如果遇到網(wǎng)絡(luò)故障或者其他問題導致下載失敗,Docker可能會嘗試多次下載,從而生成大量的臨時文件和目錄,占用磁盤空間。
-
容器日志文件過大:容器的日志文件會隨著時間的增長而不斷增大,如果日志文件過大,就會占用大量的磁盤空間。
針對以上問題,可以采取以下方式來處理:
-
清理無用的容器和鏡像:使用docker rm和docker rmi命令刪除不需要的容器和鏡像,以釋放磁盤空間。通過運行 docker rm $(docker ps -a -q) 命令,可以刪除所有不需要的容器。刪除無用的鏡像可以使用 docker rmi $(docker images -f "dangling=true" -q)
-
清理Docker緩存:在下載鏡像時,如果遇到錯誤導致下載失敗,可以刪除/var/lib/docker/overlay*/fAIl目錄下的所有文件,以清理緩存并釋放磁盤空間。
-
調(diào)整Docker數(shù)據(jù)目錄的掛載點:將/var/lib/docker的掛載點移動到新的磁盤分區(qū)上,以擴展磁盤空間。可以使用umount命令取消掛載,然后使用mkdir命令創(chuàng)建新的目錄,并重新掛載。
-
限制容器日志文件大小:通過設(shè)置容器的日志文件大小限制,避免日志文件過大占用磁盤空間。可以使用docker run命令的--log-driver和--log-opt參數(shù)來設(shè)置日志驅(qū)動和選項。
簡單辦法
多看了一下資料,發(fā)現(xiàn)可以使用
docker system prune
來自動清理空間,參考下面:
-
該指令默認會清除所有如下資源:
-
已停止的容器(container)
-
未被任何容器所使用的卷(volume)
-
未被任何容器所關(guān)聯(lián)的網(wǎng)絡(luò)?.NETwork)
-
所有懸空鏡像(image)。
-
-
該指令默認只會清除懸空鏡像,未被使用的鏡像不會被刪除。
-
添加 -a 或 --all 參數(shù)后,可以一并清除所有未使用的鏡像和懸空鏡像。
-
可以添加 -f 或 --force 參數(shù)用以忽略相關(guān)告警確認信息。
-
指令結(jié)尾處會顯示總計清理釋放的空間大小。
另外,使用下面命令可以查看docker所占的硬盤大小,如:
docker system df
繼續(xù)探究,還可以把/var/lib/docker/overlay放到其他地方。
/var/lib/docker/overlay是Docker用于存儲容器鏡像的層疊文件系統(tǒng)的根目錄,可以移動到其他的文件系統(tǒng)中。
在遷移之前,需要確保新的文件系統(tǒng)具有足夠的空間來存儲/var/lib/docker/overlay中的所有文件。同時,在移動后,需要修改Docker配置文件(通常是daemon.json)并重啟Docker服務(wù),以使新的路徑生效。
具體的遷移步驟如下:
-
找到新的文件系統(tǒng),并確保它有足夠的可用空間來存儲/var/lib/docker/overlay中的所有文件。
-
創(chuàng)建一個新的目錄來作為新的/var/lib/docker/overlay的路徑。例如,可以將新路徑設(shè)置為/mnt/overlay。
-
停止Docker服務(wù)。
-
使用rsync命令將/var/lib/docker/overlay的所有文件復制到新的路徑中。例如,可以使用以下命令:rsync -avz /var/lib/docker/overlay/ /mnt/overlay。
-
修改Docker配置文件(通常是daemon.json),將新的路徑添加到其中。例如,可以添加以下內(nèi)容:"data-root": "/mnt/overlay"。
-
啟動Docker服務(wù)。
需要注意的是,在移動/var/lib/docker/overlay后,需要重新構(gòu)建任何已經(jīng)存在的容器,因為新的路徑在啟動時不會自動映射到舊的路徑。
如果你的docker容器占滿了磁盤空間,可以參考本文進行處理,希望能夠幫助到你,如果有其他建議也歡迎發(fā)消息給我們。