OverlayFS(Overlay2)文件系統深度解析
Overlay2 是 Docker 默認使用的聯合文件系統(Union Filesystem),用于管理容器鏡像的分層存儲和容器運行時文件系統的合并。它基于 Linux 內核的?OverlayFS?技術,是早期?aufs
?和?overlay
?的改進版本。
1. OverlayFS 的核心概念
OverlayFS 通過堆疊多層目錄來實現文件系統的聯合掛載,主要分為:
-
Lower Dir(下層,只讀):通常是鏡像層(Image Layers)。
-
Upper Dir(上層,可寫):容器運行時新增或修改的文件。
-
Work Dir(工作目錄):OverlayFS 內部用于準備文件的臨時目錄。
-
Merged Dir(合并視圖):最終呈現給容器的統一文件系統。
2. Overlay2 在 Docker 中的工作方式
Docker 鏡像采用分層存儲,每一層都是一個只讀文件系統(Lower Dir)。當啟動容器時,Overlay2 會:
-
鏡像層(Lower Dir):所有鏡像層按順序堆疊(如?
base-image → apt-get install → copy files
)。 -
容器層(Upper Dir):在鏡像層之上創建一個可寫層,存儲容器運行時的修改。
-
合并視圖(Merged):將只讀層和可寫層合并,形成容器的完整文件系統。
3. 查看 Docker 的 Overlay2 存儲結構
Docker 的 Overlay2 數據默認存儲在?/var/lib/docker/overlay2/
(如果你的示例中掛載在?/mnt/newdisk/docker/overlay2
,說明 Docker 數據目錄被遷移到了該磁盤)。
關鍵目錄說明
/var/lib/docker/overlay2/ ├── <layer-id> # 每個鏡像或容器層對應一個目錄 │ ├── diff # 該層的實際文件內容(相當于 Lower Dir) │ ├── link # 短標識符(用于避免長ID路徑問題) │ ├── lower # 指向父層的引用(如 `l/ABC123`) │ └── work # OverlayFS 內部工作目錄 ├── l/ # 短鏈接目錄(優化路徑訪問) └── <container-id> # 容器運行時目錄├── merged/ # 合并后的文件系統(容器看到的視圖)├── upper/ # 可寫層(Upper Dir)└── work/ # OverlayFS 工作目錄
4. 文件讀寫規則
操作類型 | 行為 |
---|---|
讀取文件 | 從最上層 Lower Dir 開始查找,直到找到該文件。 |
修改文件 | 文件若在 Lower Dir(只讀),則先復制到 Upper Dir(寫時復制,CoW),再修改。 |
刪除文件 | 在 Upper Dir 創建?whiteout ?文件(如?.wh.filename ),隱藏 Lower Dir 中的文件。 |
新建文件 | 直接寫入 Upper Dir。 |
5.??df -h
?顯示多個 Overlay 掛載
overlay 334G 159G 160G 50% /mnt/newdisk/docker/overlay2/.../merged
-
每個?
merged
?目錄對應一個正在運行的容器的合并視圖。 -
由于多個容器可能共享相同的鏡像層(Lower Dir),但每個容器有自己的 Upper Dir,因此?
df
?可能會重復統計共享層(實際磁盤占用并非簡單相加)。
6. Overlay2 的優點
-
高效分層存儲:多個容器共享相同的基礎鏡像層,節省空間。
-
寫時復制(CoW):只有修改文件時才復制,減少磁盤 I/O。
-
性能較好:相比?
aufs
?和?devicemapper
,Overlay2 是 Docker 推薦的存儲驅動。
7. 潛在問題與注意事項
(1)磁盤空間顯示不準確
-
df
?可能會重復計算共享層,實際占用比顯示的要小。 -
用?
docker system df
?查看 Docker 的真實磁盤使用情況:docker system df
輸出示例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 3 2.1GB 800MB (38%) Containers 3 1 300MB 300MB (100%) Local Volumes 2 1 500MB 500MB (100%)
(2)清理無用數據
-
刪除無用鏡像、容器和卷:
docker system prune -a # 清理所有未使用的對象 docker volume prune # 清理未使用的卷
(3)大文件導致磁盤占滿
-
容器日志或應用程序寫入的大文件可能堆積在 Upper Dir。
-
檢查容器日志大小:
docker logs <container-id> --tail 100 # 查看日志
-
限制日志大小(在?
docker run
?時添加?--log-opt max-size=10m
)。
8. 進階:手動調試 Overlay2
如果想直接查看某個容器的文件系統:
# 找到容器的 Merged Dir(需 root 權限) docker inspect <container-id> | grep MergedDir# 進入合并后的文件系統 ls /var/lib/docker/overlay2/<container-id>/merged
總結
-
Overlay2 是 Docker 的分層存儲引擎,通過聯合掛載實現高效的文件管理。
-
Lower Dir(鏡像層)只讀,Upper Dir(容器層)可寫,
merged
?是最終視圖。 -
df -h
?可能顯示重復統計,建議用?docker system df
?查看真實占用。 -
定期清理無用鏡像和日志,避免磁盤占滿。