摘要:用戶在使用 Docker 部署業(yè)務(wù)一段時(shí)間后,可能會(huì)發(fā)現(xiàn)宿主節(jié)點(diǎn)的磁盤容量持續(xù)增長缆巧,甚至將磁盤空間耗盡進(jìn)而引發(fā)宿主機(jī)異常豌拙,進(jìn)而對(duì)業(yè)務(wù)造成影響姆蘸。 本文先對(duì) Docker 的空間分析與清理進(jìn)行說明逞敷,然后對(duì)容器的磁盤容量限制與使用建議做簡要說明推捐。 # 典型問題場(chǎng)景 用戶發(fā)現(xiàn) Docker 宿主機(jī)的磁盤空間使用率非常高。通過 du 逐層分析痊乾,發(fā)現(xiàn)是 Volume 或 overlay2 等目錄占用了
用戶在使用 Docker 部署業(yè)務(wù)一段時(shí)間后哪审,可能會(huì)發(fā)現(xiàn)宿主節(jié)點(diǎn)的磁盤容量持續(xù)增長湿滓,甚至將磁盤空間耗盡進(jìn)而引發(fā)宿主機(jī)異常舌狗,進(jìn)而對(duì)業(yè)務(wù)造成影響痛侍。 本文先對(duì) Docker 的空間分析與清理進(jìn)行說明主届,然后對(duì)容器的磁盤容量限制與使用建議做簡要說明岂膳。
典型問題場(chǎng)景
用戶發(fā)現(xiàn) Docker 宿主機(jī)的磁盤空間使用率非常高谈截。通過 du 逐層分析,發(fā)現(xiàn)是 Volume 或 overlay2 等目錄占用了過高空間毙死。示例如下:
# 根據(jù)使用的存儲(chǔ)驅(qū)動(dòng)的不同扼倘,相應(yīng)目錄會(huì)有所不同:[root@node3 docker]# du -h --max-depth=1|sort104K? ? ./network13M ./image20K ./plugins24G ./overlay2? # 這個(gè)目錄占用了非常高的磁盤磁盤空間25G .283M? ? ./volumes4.0K? ? ./swarm4.0K? ? ./tmp4.0K? ? ./trust518M? ? ./containers
空間使用分析
遇到此類問題再菊,可以參閱如下步驟進(jìn)行空間分析纠拔,定位占用過高空間的業(yè)務(wù)來源稠诲。
分析 Docker 空間分布
Docker 的內(nèi)置 CLI 指令docker system df,可用于查詢鏡像(Images)略水、容器(Containers)和本地卷(Local Volumes)等空間使用大戶的空間占用情況渊涝。 示例輸出如下:
[root@node3 docker]# docker system dfTYPE? ? ? ? ? ? ? ? TOTALACTIVESIZE? ? ? ? ? ? ? ? RECLAIMABLEImages17122.713GB1.144GB (42%)Containers151210.75GB0B (0%)Local Volumes84282.9MB241.8MB (85%)
查看空間占用細(xì)節(jié)
可以進(jìn)一步通過-v參數(shù)查看空間占用細(xì)節(jié)驶赏,以確定具體是哪個(gè)鏡像既鞠、容器或本地卷占用了過高空間嘱蛋。示例輸出如下:
[root@node3 docker]# docker system df -v# 鏡像的空間使用情況Images space usage:REPOSITORY? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE? ? ? ? ? ? ? ? SHARED SIZE? ? ? ? UNIQUE SIZE? ? ? ? CONTAINERSbusybox? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 6ad733544a635days ago? ? ? ? ? 1.129 MB0B? ? ? ? ? ? ? ? 1.129 MB? ? ? ? ? ? 1nginx? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? b8efb18f159b3months ago? ? ? ? 107.5 MB? ? ? ? ? ? 107.5 MB0B? ? ? ? ? ? ? ? 4ubuntu? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 14f60031763d3months ago? ? ? ? 119.5 MB0B? ? ? ? ? ? ? ? 119.5 MB? ? ? ? ? ? 0alpine? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.3? ? ? ? ? ? ? ? 606fed0878ec4months ago? ? ? ? 4.809 MB0B? ? ? ? ? ? ? ? 4.809 MB? ? ? ? ? ? 0tutum/curl? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? latest? ? ? ? ? ? ? 01176385d84a3years ago? ? ? ? 224.4 MB0B? ? ? ? ? ? ? ? 224.4 MB? ? ? ? ? ? 1# 容器的空間使用情況Containers space usage:CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? COMMAND? ? ? ? ? ? ? ? ? LOCAL VOLUMES? ? ? SIZE? ? ? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? ? ? ? NAMESd1da451ceeab? ? ? ? busybox? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ping 127.0.0.1"010.7 GB? ? ? ? ? ? About an hour ago? Up About an hour? ? ? ? ? dstest956ae1d241e8? ? ? ? nginx:latest? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "nginx -g 'daemon ..."026B3months ago? ? ? ? Up3months? ? ? ? ? ? ? ? localTest_restserver_274973d237a06? ? ? ? nginx:latest? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "nginx -g 'daemon ..."02B3months ago? ? ? ? Up3months# 本地卷的空間使用情況Local Volumes space usage:VOLUME NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LINKS? ? ? ? ? ? ? SIZE83ba8747f4172a3c02a15f85b71e1565affca59f01352b4a94e0d28e65c26d1c0830Ba479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b648022.16 MB79a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503118.83 MB
空間清理
自動(dòng)清理
可以通過 Docker 內(nèi)置的 CLI 指令docker system prune來進(jìn)行自動(dòng)空間清理。
Tips:
不同狀態(tài)的鏡像
已使用鏡像(used image): 指所有已被容器(包括已停止的)關(guān)聯(lián)的鏡像凶伙。即 docker ps -a 看到的所有容器使用的鏡像它碎。
未引用鏡像(unreferenced image):沒有被分配或使用在容器中的鏡像扳肛,但它有 Tag 信息挖息。
懸空鏡像(dangling image):未配置任何 Tag (也就無法被引用)的鏡像,所以懸空绪抛。這通常是由于鏡像 build 的時(shí)候沒有指定 -t 參數(shù)配置 Tag 導(dǎo)致的幢码。比如:REPOSITORY TAG IMAGE ID CREATED SIZE 6ad733544a63 5 days ago 1.13 MB # 懸空鏡像(dangling image)
掛起的卷(dangling Volume)
類似的蛤育,dangling=true 的 Volume 表示沒有被任何容器引用的卷。
docker system prune 自動(dòng)清理說明:
該指令默認(rèn)會(huì)清除所有如下資源:
已停止的容器(container)
未被任何容器所使用的卷(volume)
未被任何容器所關(guān)聯(lián)的網(wǎng)絡(luò)(network)
所有懸空鏡像(image)底洗。
該指令默認(rèn)只會(huì)清除懸空鏡像亥揖,未被使用的鏡像不會(huì)被刪除圣勒。
添加-a 或 --all參數(shù)后,可以一并清除所有未使用的鏡像和懸空鏡像挚歧。
可以添加-f 或 --force參數(shù)用以忽略相關(guān)告警確認(rèn)信息滑负。
指令結(jié)尾處會(huì)顯示總計(jì)清理釋放的空間大小矮慕。
操作示例:
[root@node3 docker]# dockersystemprune --helpUsage:? dockersystemprune [OPTIONS]Remove unused dataOptions:-a, --allRemoveallunused images not just dangling ones? -f, --force? Do not promptforconfirmation? ? ? --helpPrintusage[root@node3 docker]# dockersystemprune -aWARNING! This willremove:? ? -allstopped containers? ? -allvolumes not used by at least one container? ? -allnetworks not used by at least one container? ? -allimages without at least one container associatedtothemAre you sure you wanttocontinue? [y/N]yDeleted Containers:c09c31c49491ee7f2324160e43947917940221b4e6cc1274906def640a7a631f2aa0180e1a0f4c2c64349a6ed969651052373e7a9471050dce9015701cf1b9576d18003b06823c5d76d807a319387b06680fc93d0a32bc29c1cea4c07e8d515dDeleted Volumes:a479c303b278f1442f66644f694a554aac630e72b7a27065a11ef85c4d87b64879a25b6376e0d6587d8f4f24e08f9467981f04daad14bf3353a12d727d065503Deleted Images:untagged: tutum/curl:latestuntagged: tutum/curl@sha256:b6f16e88387acd4e6326176b212b3dae63f5b2134e69560d0b0673cfb0fb976fdeleted:sha256:01176385d84aeb1d40ed18c6d3f952abf40d2d2b4aa98fcf0a8a4b01010fb9a9deleted:sha256:c84f85637212412c1d46d1dd50f789df2c3b44678ee3fee6a820888e734f9b5auntagged: test:lastestdeleted:sha256:794ff09332586a091514eb3d1c44990244e57e34adc71d4b4334c0674a1377e9deleted:sha256:636a1e7769d2242556243e9a21fb96bb878ab5b94c41ff485667252c968b375eTotal reclaimed space:1.565GB
手工清理
網(wǎng)絡(luò)清理
網(wǎng)絡(luò)配置通常占用的空間非常低痴鳄,略過痪寻。
鏡像清理
如果通過 docker system df 分析槽华,是鏡像占用了過高空間猫态。則可以根據(jù)業(yè)務(wù)情況亲雪,評(píng)估相關(guān)鏡像的使用情況疚膊。對(duì)于懸空和未使用的鏡像, 可以使用如下指令手工清理:
# 刪除所有懸空鏡像灌砖,但不會(huì)刪除未使用鏡像:docker rmi $(docker images -f"dangling=true"-q)# 刪除所有未使用鏡像和懸空鏡像基显。# 【說明】:輪詢到還在被使用的鏡像時(shí),會(huì)有類似"image is being used by xxx container"的告警信息撩幽,所以相關(guān)鏡像不會(huì)被刪除窜醉,忽略即可宪萄。docker rmi $(docker images-q)
卷清理
如果通過 docker system df 分析,是卷占用了過高空間读串。則可以根據(jù)業(yè)務(wù)情況恢暖,評(píng)估相關(guān)卷的使用情況杰捂。對(duì)于未被任何容器調(diào)用的卷(-v 結(jié)果信息中嫁佳,"LINKS" 顯示為 0)谷暮,可以使用如下指令手工清理:
# 刪除所有未被任何容器關(guān)聯(lián)引用的卷:dockervolumerm $(docker volume ls -qf dangling=true)# 也可以直接使用如下指令瓤漏,刪除所有未被任何容器關(guān)聯(lián)引用的卷(但建議使用上面的方式)# 【說明】輪詢到還在使用的卷時(shí)蔬充,會(huì)有類似"volume is in use"的告警信息班利,所以相關(guān)卷不會(huì)被刪除罗标,忽略即可。dockervolumerm $(docker volume ls -q)
容器清理
如果通過 docker system df 分析竿拆,是某個(gè)容器占用了過高空間证膨。則可以根據(jù)業(yè)務(wù)情況央勒,評(píng)估相關(guān)容器的業(yè)務(wù)歸屬并進(jìn)行處理。對(duì)于已停止或其它異常狀態(tài)的容器稳吮,可以結(jié)合-f 或 --filter篩選器,使用類似如下指令來手工清理:
# 刪除所有已退出的容器docker rm -v $(docker ps -aq-fstatus=exited)# 刪除所有狀態(tài)為 dead 的容器docker rm -v $(docker ps -aq-fstatus=dead)
更多關(guān)于 ps 指令支持的篩選器信息瑞你,可以參閱官方文檔酪惭。
在用空間資源分析
對(duì)于還在使用的空間資源,可以參閱如下說明做進(jìn)一步排查分析者甲。
鏡像空間分析
如果某個(gè)鏡像占用了過高空間春感,則可以通過如下方式做進(jìn)一步空間分析:
1. 通過 docker system df 獲取占用過高空間的鏡像信息。
2. 基于相應(yīng)鏡像創(chuàng)建測(cè)試容器虏缸。
3. exec 進(jìn)入容器后鲫懒,結(jié)合 du 等 shell 指令做進(jìn)一步空間分析,定位出占用最高空間的目錄或文件刽辙。
4. 結(jié)合業(yè)務(wù)情況做進(jìn)一步處理窥岩,重新 build 鏡像。
示例:
[root@node3]# docker exec -it dstest sh/ # du -h | head8.0K? ? ./root32.0K? ./etc4.0K? ? ./usr/sbin8.0K? ? ./usr10.0G? ./home/java/logs10.0G? ./home/java10.0G? ./home1.1M? ? ./bin0./dev/shm0./dev/mqueue
容器空間分析
如果某個(gè)運(yùn)行中的容器占用了過高空間宰缤,則可以通過如下方式做進(jìn)一步空間分析:
Tips:
容器的只讀層與鏡像層的空間占用情況
一個(gè)容器的占用的總空間撵溃,包含其最頂層的讀寫層(writable layer)和底部的只讀鏡像層(base image layer集歇,read-only)。更多相關(guān)說明姑蓝,可以參閱官方文檔。
可以通過 docker ps 的-s參數(shù)來分別顯示二者的空間占用情況,進(jìn)而判斷相應(yīng)容器的空間占用主要是來自原始鏡像桃熄,還是運(yùn)行中產(chǎn)生。
示例:
# 如下容器的原始鏡像占用了 422MB 空間,實(shí)際運(yùn)行過程中只占用了 2B 空間:CONTAINER ID? ? ? ? IMAGE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? COMMAND? ? ? ? ? ? ? ? ? CREATED? ? ? ? ? ? STATUS? ? ? ? ? ? ? PORTS? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NAMES? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SIZEac39128ccbc0? ? ? ? registry.aliyuncs.com/acs-sample/wordpress:4.6? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "/entrypoint.sh ap..."3months ago? ? ? ? Up11days? ? ? ? ? 0.0.0.0:32779->80/tcp? ? ? ? ? ? ? ? ? ? ? ? ? Web_web_42B (virtual422MB)
容器空間占用的分析步驟:
1. 通過 docker system df 獲取占用過高空間的容器信息。
2. 通過前述-s參數(shù)確認(rèn)到底是底層鏡像设凹,還是運(yùn)行過程中產(chǎn)生的數(shù)據(jù)占用了過高空間。
3. exec 進(jìn)入容器,結(jié)合 du 等 shell 指令做進(jìn)一步空間分析称诗,定位出占用最高空間的目錄或文件。
4. 結(jié)合業(yè)務(wù)情況做進(jìn)一步處理。
引申:Docker 磁盤空間限制與使用建議
磁盤空間限制
使用 Device Mapper 存儲(chǔ)驅(qū)動(dòng)限制容器磁盤空間
如果使用 Device Mapper 作為底層存儲(chǔ)驅(qū)動(dòng)实抡,則可以通過 Docker daemon 的如下參數(shù)來全局限制單個(gè)容器占用空間的大小:
--storage-opt dm.basesize=20G表示限制單個(gè)容器最多占用 20G 空間,將應(yīng)用于任何新建容器。
更多關(guān)于 Device Mapper 存儲(chǔ)驅(qū)動(dòng)的說明添寺,可以參閱官方文檔。
使用 btrfs 存儲(chǔ)驅(qū)動(dòng)限制容器磁盤空間
btrfs 驅(qū)動(dòng)主要使用 btrfs 所提供的 subvolume 功能來實(shí)現(xiàn)票罐。一個(gè)容器會(huì)對(duì)應(yīng)一個(gè) subvolume阵谚。針對(duì)容器對(duì)應(yīng)的 subvolume 啟用并配置 quota 即可限制其磁盤空間。示例配置:
btrfs qgroup limit -e50G /var/lib/docker/btrfs/subvolumes/
btrfs 還有其它很好的特性,比如可以在線擴(kuò)容(在線加入一塊新的塊設(shè)備金度,來擴(kuò)充整個(gè)文件系統(tǒng)的大小)。更多關(guān)于 btrfs 存儲(chǔ)驅(qū)動(dòng)的說明,可以參閱官方文檔。
外掛 LVM 卷
如果使用的是其它不支持對(duì)單個(gè)容器的磁盤容量進(jìn)行限制的存儲(chǔ)驅(qū)動(dòng),則可以考慮如下通用方案:
通過 LVM 方式創(chuàng)建一個(gè)指定容量的卷,然后掛載到宿主操作系統(tǒng)上特定目錄赖舟。最后通過 --volume 參數(shù)來讓容器來掛載使用相應(yīng)目錄豫喧。
注意:該方案的前提條件是劲腿,容器中所有落盤操作要全部落到上述 "--volume" 參數(shù)指定的卷中挥吵,否則容器還會(huì)占用默認(rèn) aufs 所在盤的空間,進(jìn)而造成統(tǒng)計(jì)不準(zhǔn)。
Docker 存儲(chǔ)使用建議
細(xì)化的存儲(chǔ)使用最佳實(shí)踐與采用的存儲(chǔ)驅(qū)動(dòng)(storage driver)類型強(qiáng)相關(guān)袋倔,您可以參閱官方文檔做相關(guān)了解扇售,本文不做進(jìn)一步細(xì)化說明困乒。
通用的存儲(chǔ)使用建議如下:
容器內(nèi)的業(yè)務(wù)日志務(wù)必配置輪詢覆寫,或者使用日志驅(qū)動(dòng)將日志輸出到外部存儲(chǔ)欧引。避免日志文件持續(xù)增長,占用過高磁盤空間。
結(jié)合外部監(jiān)控對(duì)宿主機(jī)的磁盤空間使用情況進(jìn)行監(jiān)控和告警债查。
可以參閱文檔如何給容器服務(wù)的Docker增加數(shù)據(jù)盤來擴(kuò)容默認(rèn) Docker 存儲(chǔ)空間淆衷。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)鹿驼,本社區(qū)不擁有所有權(quán)凄鼻,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容纱控,歡迎發(fā)送郵件至:yqgroup@service.aliyun.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù)共螺,一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容衷模。
原文鏈接