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

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

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

/var/lib/docker/overlay2 目錄是 Docker 存儲驅動程序之一
- Overlay2 的默認存儲目錄,用于保存 Docker 容器鏡像和容器數(shù)據(jù)。
- Overlay2 是一個基于內(nèi)核的圖層存儲驅動程序,可以通過將多個只讀層疊加到單個可寫層來創(chuàng)建 Docker 容器。
- Overlay2 驅動程序使用了基于 inode 的存儲模型,它將不同的圖層都掛載到相同的文件系統(tǒng)目錄下,同時使用不同的命名空間來進行隔離。
在 /var/lib/docker/overlay2 目錄下,每個容器都對應一個文件夾,文件夾的名稱是由兩個長隨機字符串組成的,每個字符串對應一個不同的命名空間。其中一個字符串對應于 Overlay2 驅動程序的命名空間,它用于標識這個容器的圖層;另一個字符串對應于掛載點的命名空間,用于在宿主機文件系統(tǒng)中創(chuàng)建一個目錄,用于掛載這個容器的可寫層。
每個容器的文件夾中包含多個子目錄,其中最重要的是 diff 目錄,它用于存儲容器的可寫層。當 Docker 容器需要修改文件時,Overlay2 驅動程序會將這些修改記錄在 diff 目錄下的文件中。除了 diff 目錄,每個容器的文件夾中還包含 merged 目錄、lowerdir 目錄和 upperdir 目錄,用于存儲容器的只讀層和可寫層。
具體來說:
當 Docker 運行容器時,它會在 /var/lib/docker/overlay2 目錄下為容器創(chuàng)建一個唯一的文件夾,其中包含了容器的文件系統(tǒng)的層級結構。
該文件夾的名稱以 l 開頭,后跟 64 個字符的十六進制字符串,這個字符串是該容器的唯一 ID,例如:
/var/lib/docker/overlay2/l4j4t4c3k3ck0ec13c4a5798d274b16523e86029292bfb9bb9c4a4a4c3d0e4b4
在這個目錄中,Overlay2 存儲了容器的所有文件系統(tǒng)層。
當容器啟動時,Docker 會將這些層級結構組合在一起,形成容器的完整文件系統(tǒng),使其看起來像是一個完整的文件系統(tǒng),而實際上是由多個層級結構組合而成的。
解決辦法
重啟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 表示構建緩存。
整體清理
可以通過 docker system prune 進行一次空間清理:
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)絡,所有的 dangling 鏡像(在構建鏡像時產(chǎn)生的 tag 為 none 的鏡像,沒有和任何其他有 tag 的鏡像有關聯(lián)),所有的 dangling 構建緩存(和 dangling 鏡像同理)。
更激進一點,還可以執(zhí)行 docker system prune -a,該操作還會刪除沒有和運行中的容器有關聯(lián)的鏡像。
docker system prune -a #

我們看到目錄下被清空了

- 鏡像清理:
docker rm <image_name> [-f]
- 容器清理:
docker container rm <containerid_or_name>
- 網(wǎng)絡清理:
docker network ls docker network rm <net_work_name>
- 數(shù)據(jù)卷清理:
docker volume ls docker system prune -a --volumes # 是在 docker system prune -a的基礎上刪除所有未使用的卷。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
搭建docker內(nèi)網(wǎng)私服的方法(docker-registry with nginx&ssl on centos)
這篇文章主要介紹了搭建docker內(nèi)網(wǎng)私服的方法(docker-registry with nginx&ssl on centos),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
docker下遷移elasticsearch問題以及解決方案
文章描述了如何將Elasticsearch數(shù)據(jù)從一個服務器遷移到另一個服務器,包括數(shù)據(jù)掛載、版本一致性、啟動命令的匹配以及可能遇到的權限和節(jié)點故障問題的解決方法2024-11-11
使用 Docker 部署 GitLab 并持久化數(shù)據(jù)的實例步驟
本文將詳細介紹如何使用 Docker 部署 GitLab,并將數(shù)據(jù)(如倉庫、配置、日志等)持久化到主機磁盤,我們還將解決常見的端口沖突問題,并介紹如何從另一臺 GitLab 恢復數(shù)據(jù)到新的 GitLab 實例,感興趣的朋友一起看看吧2025-05-05
完美解決docker安裝mysql后Navicat連接不上的問題
這篇文章主要介紹了完美解決docker安裝mysql后Navicat連接不上的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

