Docker 日志太多?磁盤爆了?一篇教你搞定容器日志問題
今天分享一下如何處理Docker日志的問題。
一、Docker日志好坑
Docker 默認(rèn)使用的是 json-file 日志驅(qū)動。日志會一直寫,一直寫,一直寫……沒有限制、沒有輪轉(zhuǎn)、沒有清理!
日志默認(rèn)位置:
/var/lib/docker/containers/<container-id>/<container-id>-json.log
當(dāng)你發(fā)現(xiàn)它時,可能已經(jīng):
- 占了幾十個 G
- 吃滿了磁盤
- 服務(wù)都掛了!
二、如何處理日志問題
主要通過日志輪詢方式處理。下面介紹三種方式設(shè)置日志輪詢
1. 運行容器時設(shè)置輪轉(zhuǎn)策略(推薦)
docker run -d \
--name myapp \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp:latest
參數(shù)解釋:
- max-size=10m:單個日志文件最大 10MB
- max-file=3:最多保留 3 個輪轉(zhuǎn)文件(最多 30MB)
容器總?cè)罩究刂圃?30MB 內(nèi),絕不爆炸!
2. 修改 Docker 配置
該配置適用于所有容器。
編輯配置文件 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
重啟 Docker 服務(wù):
systemctl restart docker
注意:只對之后創(chuàng)建的容器生效!
3. 正在運行的容器
你可以這樣快速清理日志(生產(chǎn)環(huán)境慎用!):
echo "" > $(docker inspect --format='{{.LogPath}}' <container-id>)
或者更穩(wěn)一點:
- docker stop 停掉容器
- docker rm 刪除容器
- 使用輪轉(zhuǎn)參數(shù)重新 run容器
4. 禁用日志輸出
這個操作慎用,有可能影響應(yīng)用運行,而且不方便后續(xù)排查
docker run --log-driver=none 容器名
5. 日志快速清理
僅推薦在磁盤告急時臨時使用!
find /var/lib/docker/containers -name *-json.log -exec truncate -s 0 {} \;
三、實戰(zhàn)建議
根據(jù)不同場景推薦配置值。
場景 | 建議參數(shù) |
開發(fā)環(huán)境 |
|
測試環(huán)境 |
|
生產(chǎn)環(huán)境 |
|
Docker 日志默認(rèn)設(shè)置太坑,一定要手動配置!
最佳實踐:
- 用 json-file + max-size + max-file
- 修改 daemon.json 設(shè)置全局默認(rèn)
- 老容器要么清理日志,要么重啟帶輪轉(zhuǎn)參數(shù)