三点总结

  • Docker容器的控制台日志并非存储在系统内存中,而是以文件形式保存在宿主机的磁盘上
  • docker logs命令的作用是读取这些已保存的日志文件并显示出来。
  • 为防止日志文件无限增长,配置日志轮转选项(max-size, max-file至关重要。

1. 日志存储在哪里?如何存储?

Docker会捕获容器的所有标准输出(stdout)和标准错误(stderr)流,并通过日志驱动(Logging Driver)进行处理。如果没有进行特殊配置,Docker默认会使用json-file日志驱动。

  • 存储位置:容器的日志以JSON格式文件存储在宿主系统中的特定路径下。通常路径如下:
    • /var/lib/docker/containers/[容器ID]/[容器ID]-json.log
  • docker logs命令:此命令实际上并非显示内存中的内容,而是读取上述JSON日志文件并将其展示在终端中。

ChatGPT 图片 2026年5月12日 下午12点37分29秒

2. 日志持续增长会导致磁盘空间不足吗?

是的,没错。如果不采取任何措施,日志文件会持续增长,最终可能耗尽宿主机的磁盘空间。为避免这种情况,Docker提供了日志轮转(Log Rotation)选项,用于限制日志文件的大小和数量。

例如,在执行docker run命令时,可以添加以下选项:

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx
  • --log-opt max-size=10m:将单个日志文件的最大大小限制为10MB
  • --log-opt max-file=3:将日志文件的最大数量限制为3个。当文件数量超过3个时,最旧的文件将被删除。

通过这样设置,该容器的日志将最多占用30MB(10MB * 3个)的磁盘空间。


3. 在docker-compose.yml文件中进行配置

在Docker Compose中,您可以在docker-compose.yml文件中为每个服务轻松配置日志选项。

您可以将此视为docker run命令的--log-opt标志以YAML格式嵌入其中。

以下是为名为my-app的服务应用日志轮转的示例:

services:
  my-app:
    image: your-app-image
    # ... 其他设置 ...
    deploy:
      resources:
        limits:
          memory: 512M

    # 👇 这部分是日志配置。
    logging:
      driver: "json-file"  # 要使用的日志驱动(默认值,可省略)
      options:
        max-size: "10m"    # 每个文件的最大大小:10MB
        max-file: "3"      # 最大文件数量:3个
  • logging:这是启动该服务日志配置的关键字。
  • driver:指定要使用的日志驱动。json-file是默认值。
  • options:配置要传递给驱动的选项。
    • max-size:与docker run--log-opt max-size相同。
    • max-file:与docker run--log-opt max-file相同。

现在,当您使用docker-compose up启动此服务时,my-app容器的日志将自动进行轮转,最多只占用30MB(10MB * 3个)的磁盘空间。

4. 将其设置为所有容器的默认值

如果您觉得为每个容器单独设置选项很麻烦,并希望为整个系统应用默认策略,那么修改Docker守护进程(Daemon)配置文件是最佳选择。

  1. 打开或创建/etc/docker/daemon.json文件。(如果文件不存在,请新建一个。)
  2. 写入以下内容:
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}
  1. 重启Docker守护进程。
sudo systemctl restart docker

通过这样设置,未来创建的所有容器,只要没有单独的日志配置,都将自动遵循此策略。当然,如果在docker-compose.yml文件或docker run命令中为特定容器指定了不同的日志选项,那么单独的设置将优先于守护进程的设置

  • 单个服务设置:在docker-compose.yml文件内的logging部分进行配置是最常见和便捷的方式。
  • 全局默认设置:如果要在服务器的所有容器上应用统一策略,请修改/etc/docker/daemon.json文件。