事件

有一个任务需要把当前正在使用的镜像导出为离线包,在导出过程中发现速度特别慢,第一反应是CPU内存被拉満了,top查看后是正常的,那问题可能出在磁盘上。

服务器上暂时没有合适的查看磁盘I/O的工具,只好先看下容量:

1
df -h

瞬间发现磁盘使用率达到了95%以上,铁定有问题了!

1
du -h -d 1 /

发现/var目录巨大无比!

1
du -h -t 10G /var

发现有几个/var/lib/docker/containers/xxxxxx的文件特别大,问了deepseek,得到的回答是:docker默认会将容器内应用产生的日志记录在json日志文件里,且默认没有大小限制

查了下容器的id,嗯,这下对上了,确实是日志的问题!那就限定下日志的大小即可。

方案

全局配置

全局配置适用于所有之后新建的容器。

修改/etc/docker/daemon.json,添加日志限制:

1
2
3
4
5
6
7
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "5"
    }
}

单容器配置

启动时通过参数直接限制:

1
docker run --log-opt max-size=10m --log-opt max-file=5 ...

docker-compose.yaml配置

使用docker compose时,可以在docker-compose.yaml里配置:

1
2
3
4
5
6
7
8
services:
  your-service:
    image: your-image
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "5"

也可以使用yaml锚点避免重复配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
x-logging: &default-logging
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "5"

services:
  your-service1:
    image: your-image1
    logging: *default-logging
  your-service2:
    image: your-image2
    logging: *default-logging

配置完执行docker compose up -d即可生效。