解決誤刪docker目錄/var/lib/docker/overlay2,導(dǎo)致容器build失敗問題
服務(wù)器磁盤滿了,查看本地docker目錄下占用太多,需要清除下不用的文件騰出資源,刪除了/var/lib/docker/overlay2 下的文件,導(dǎo)致重新啟動容器失敗,啟動新容器例如hello-world也失敗

docker的overlay2存儲的是什么?為什么能有這么大的占用
查詢官方說明,overlay2是docker使用的文件存儲驅(qū)動,也就是說,在/var/lib/docker/overlay2目錄下的文件都是docker使用的存儲

overlay2是分層存儲,每一層通過本層的md5作為文件夾名來命名,如果要存儲的兩個東西【比如兩個鏡像】的底層幾層的內(nèi)容是一樣的,那他們的md5就也是一樣的,通過md5核驗,確認(rèn)他們這幾層是一樣的之后,在overlay2中實際存儲的時候,這幾層就可以只存儲一份,然后由這兩個東西共用,來達(dá)到節(jié)省空間的目的。

/var/lib/docker/overlay2 目錄是 Docker 存儲驅(qū)動程序之一
- Overlay2 的默認(rèn)存儲目錄,用于保存 Docker 容器鏡像和容器數(shù)據(jù)。
- Overlay2 是一個基于內(nèi)核的圖層存儲驅(qū)動程序,可以通過將多個只讀層疊加到單個可寫層來創(chuàng)建 Docker 容器。
- Overlay2 驅(qū)動程序使用了基于 inode 的存儲模型,它將不同的圖層都掛載到相同的文件系統(tǒng)目錄下,同時使用不同的命名空間來進(jìn)行隔離。
在 /var/lib/docker/overlay2 目錄下,每個容器都對應(yīng)一個文件夾,文件夾的名稱是由兩個長隨機(jī)字符串組成的,每個字符串對應(yīng)一個不同的命名空間。其中一個字符串對應(yīng)于 Overlay2 驅(qū)動程序的命名空間,它用于標(biāo)識這個容器的圖層;另一個字符串對應(yīng)于掛載點的命名空間,用于在宿主機(jī)文件系統(tǒng)中創(chuàng)建一個目錄,用于掛載這個容器的可寫層。
每個容器的文件夾中包含多個子目錄,其中最重要的是 diff 目錄,它用于存儲容器的可寫層。當(dāng) Docker 容器需要修改文件時,Overlay2 驅(qū)動程序會將這些修改記錄在 diff 目錄下的文件中。除了 diff 目錄,每個容器的文件夾中還包含 merged 目錄、lowerdir 目錄和 upperdir 目錄,用于存儲容器的只讀層和可寫層。
具體來說:
當(dāng) Docker 運行容器時,它會在 /var/lib/docker/overlay2 目錄下為容器創(chuàng)建一個唯一的文件夾,其中包含了容器的文件系統(tǒng)的層級結(jié)構(gòu)。
該文件夾的名稱以 l 開頭,后跟 64 個字符的十六進(jìn)制字符串,這個字符串是該容器的唯一 ID,例如:
/var/lib/docker/overlay2/l4j4t4c3k3ck0ec13c4a5798d274b16523e86029292bfb9bb9c4a4a4c3d0e4b4
在這個目錄中,Overlay2 存儲了容器的所有文件系統(tǒng)層。
當(dāng)容器啟動時,Docker 會將這些層級結(jié)構(gòu)組合在一起,形成容器的完整文件系統(tǒng),使其看起來像是一個完整的文件系統(tǒng),而實際上是由多個層級結(jié)構(gòu)組合而成的。
解決辦法
重啟docker
systemctl restart docker
然后啟動一個容器試試

如果問題不能完美解決
- ps: 如果不重啟docker 還是會同樣報錯
- ps:也可以將docker系統(tǒng)目錄/var/lib/docker/下的overlay2文件夾,整個刪掉,再重啟docker后,會自動創(chuàng)建出新的overlay2文件夾目錄,里邊存放所必須的文件。這個時候重新run容器就會成功
如何清理docker磁盤占用
docker system df # 可查看 Docker 所占用的空間:

其中 Images 表示鏡像,Containers 表示容器,Local Volumes 表示本地卷,Build Cache 表示構(gòu)建緩存。
整體清理
可以通過 docker system prune 進(jìn)行一次空間清理:
WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all dangling build cache Are you sure you want to continue? [y/N]
該操作會刪除所有停止的容器,所有未被至少一個容器使用的網(wǎng)絡(luò),所有的 dangling 鏡像(在構(gòu)建鏡像時產(chǎn)生的 tag 為 none 的鏡像,沒有和任何其他有 tag 的鏡像有關(guān)聯(lián)),所有的 dangling 構(gòu)建緩存(和 dangling 鏡像同理)。
更激進(jìn)一點,還可以執(zhí)行 docker system prune -a,該操作還會刪除沒有和運行中的容器有關(guān)聯(lián)的鏡像。
docker system prune -a #

我們看到目錄下被清空了

- 鏡像清理:
docker rm <image_name> [-f]
- 容器清理:
docker container rm <containerid_or_name>
- 網(wǎng)絡(luò)清理:
docker network ls docker network rm <net_work_name>
- 數(shù)據(jù)卷清理:
docker volume ls docker system prune -a --volumes # 是在 docker system prune -a的基礎(chǔ)上刪除所有未使用的卷。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker中多階段構(gòu)建與單階段構(gòu)建的具體使用
本文主要介紹了docker中多階段構(gòu)建與單階段構(gòu)建的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-09-09
Jenkins Pipeline中Docker鏡像構(gòu)建與推送的常見問題及解決方案
在現(xiàn)代 DevOps 實踐中,Jenkins 作為一款流行的持續(xù)集成和持續(xù)交付(CI/CD)工具,被廣泛應(yīng)用于自動化構(gòu)建、測試和部署流程,然而,在實際使用 Jenkins Pipeline 進(jìn)行 Docker 鏡像構(gòu)建和推送的過程中,可能會遇到各種問題,本文將通過一個具體的案例給大家詳細(xì)的介紹一下2025-01-01
教你如何從正在運行的容器創(chuàng)建?Docker?映像
這篇文章主要介紹了如何從正在運行的容器創(chuàng)建?Docker?映像,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
在Docker容器中使用iptables時的最小權(quán)限的開啟方法
這篇文章主要介紹了在Docker容器中使用iptables時的最小權(quán)限的開啟方法的相關(guān)資料,需要的朋友可以參考下2017-01-01
Dockerfile中yum install無法使用的問題及解決
在使用Dockerfile自定義CentOS 7容器過程中,可能會遇到容器內(nèi)無法使用yum命令的問題,首先,確認(rèn)主機(jī)是否能聯(lián)網(wǎng),其次,檢查在Dockerfile打包新容器時,容器是否能聯(lián)網(wǎng),若發(fā)現(xiàn)容器無法聯(lián)網(wǎng),一種解決方法是編輯/etc/docker/daemon.json文件2024-11-11

