Docker 日志排查与清理
发表于:2024-02-23 |

前言:Docker容器在启动的那一刻就开始产生日志,Docker产生的日志文件默认是json-file的形式存储。该日志文件在启动的容器目录下,命名规则为[容器ID]-json.log,Docker默认的目录在 /var/lib/docker

假设:我启动了一个容器,容器的ID为:0117e9d5abdf9a23c7cc9d189eed64e2f2021d4d8887fb3a9b7842c18e043337

那我的日志文件名字就是:0117e9d5abdf9a23c7cc9d189eed64e2f2021d4d8887fb3a9b7842c18e043337-json.log

文件就在容器目录的文件夹下面:/var/lib/docker/containers/0117e9d5abdf9a23c7cc9d189eed64e2f2021d4d8887fb3a9b7842c18e043337

1. 查看Docker存储使用情况

命令:

docker system df

名词解释:

TYPE(类型)

TOTAL(总数)

ACTIVE(活跃数)

SIZE(占用空间)

RECLAIMABLE(可回收的大小)

Images(镜像):总共18个,活跃17个,大小3.33GB,可以回收的大小244.1MB(占总镜像的比重7%)

Containers(容器):…

Local Volumes(本地使用的卷):…

Build Cache(编译时的缓存):…

  1. 查看Docker日志文件大小

du -ha /var/lib/docker/containers/ | grep “json.log” | sort -rh

  1. 清理Docker容器日志
    注:容器正在运行,如果使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除关联的链接。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确方式是cat /dev/null > *-json.log,也可以通过rm -rf删除容器后重启容器。

清理日志shell脚本

#!/bin/bash
echo "开始清理Docker日志"
# 容器的路径 默认的就是下面的,如果是自定义的Docker的路径就改自己定的路径
CONTAINER_DIR=/var/lib/docker/containers
# 获取所有的容器日志文件
CONTAINER_LOGS=$(find $CONTAINER_DIR -name "*-json.log")

# 清理每个容器的日志
for LOG in $CONTAINER_LOGS; do
  LOG_FILE=${LOG##*/}
  echo "容器的ID:${LOG_FILE/-json.log/}  清理的日志文件:$LOG_FILE"
  cat /dev/null >"$LOG"
  # 也可以使用-> echo "" >"$LOG"
done

注:使用root权限执行该脚本

以上的这种方式只是临时的,下次容器启动后还是一样会出现日志文件过大的情况。

  1. 优化Docker容器日志配置

a. 全局修改配置
编辑 /etc/docker/daemon.json 配置文件

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"],
  "log-driver": "json-file",
  "log-opts": {"max-size": "1024m", "max-file": "3"}
}

log-driver ==> 容器收集日志的方式,将日志以JSON文件的方式存储
log-opts ==> 日志配置
max-size ==> 一个日志文件容量的上限
max-file ==> 最多可产生多少个文件
重启Docker使配置生效:

log-driver ==> 容器收集日志的方式,将日志以JSON文件的方式存储
log-opts ==> 日志配置
max-size ==> 一个日志文件容量的上限
max-file ==> 最多可产生多少个文件
重启Docker使配置生效:

b. docker-compose.yml 单个容器配置

version: '3.5'
 
networks:
  ServerNet:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24
          gateway: 172.20.0.1
services:
  portainer:
    restart: always
    image: portainer/portainer:latest
    container_name: portainer
    ports:
      - "9000:9000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/docker/portainer/data:/data
      - /home/docker/portainer/public:/public
    logging:
      driver: "json-file"
      options:
        max-size: "256m"
        max-file: "3"
    networks:
      ServerNet:
        ipv4_address: 172.20.0.2
上一篇:
Ubuntu 20.04设置DNS解析(解决resolve.conf被覆盖问题)
下一篇:
2>/dev/null和>/dev/null 2>&1和2>&1>/dev/null的区别