Docker日志配置和磁盘清理

在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/

  • 设置Docker容器日志大小,docker-compose的max-size(限制在5GB) 例子:
1
2
3
4
5
6
7
8
nginx: 
image: nginx:1.12.1
restart: always
logging:
driver: “json-file”
options:
max-size: “5g”
max-file: 3

max-size=500m,意味着一个容器日志大小上限是500M,max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

或者统一配置/etc/docker/daemon.json

"log-driver":"json-file",
"log-opts":{ "max-size" :"100m","max-file":"1"}

  • 查所有容器日志大小docker_log_size.sh
1
2
3
4
5
6
7
#!/bin/sh
echo "======== docker containers logs file size ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
ls -lh $log
done
  • 日志清理脚本clean_docker_log.sh,内容如下:
1
2
3
4
5
6
7
8
9
#!/bin/sh 
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
  • 配置cron
1
2
3
1. 编辑crontab: crontab -e
2. 添加(每天晚上2点清理): 0 0 2 * * ? /opt/docker-sh/clean_docker_log.sh
3. 保存

overlay2过大清理

  • 查看具体哪个占用大
1
du -ah --max-depth=1 /var/lib/docker/overlay2/
  • 方法1:根据id查看是哪个镜像,pid, 数据位置
1
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "<id>"
  • 方法2:删除所有不可用镜像/network/volume/container
1
2
3
4
5
6
7
# docker system prune --all --volumes
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all volumes not used by at least one container
- all images without at least one container associated to them
- all build cache

删除整个/var/lib/docker【适用于构建机器】

有的时候即使使用docker system prune --all --volumes -f删除无用数据,overlay2下磁盘依旧删不了多少东西。这时候通常会发现是du -ah --max-depth=1 /var/lib/docker/overlay2/**/diff下的空间占据太大,那么针对**仅用于构建场景的机器**,可以考虑删除整个docker文件夹【而不是删除overlay2下的文件夹,否则可能会出现启动问题】

  • 停止服务
1
2
system status docker
systemctl stop docker.socket
  • 删除
1
rm -rf /var/lib/docker
  • 重新启动
1
systemctl start docker
  • 验证
1
2
3
systemctl status docker
systemctl status docker -l
systemctl status docker.socket -l