docker logs所显示的日志并不会持续积累在系统内存中。相反,默认情况下,以文件的形式保存在主机(Host)系统的磁盘上


日志是在哪里以何种方式存储的? ⚙️



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

  • 存储位置:容器的日志以JSON格式的文件存储在主机系统的特定路径下。通常路径如下:

    • /var/lib/docker/containers/[容器_ID]/[容器_ID]-json.log
  • docker logs命令:此命令实际上不是显示内存中的内容,而是读取上述提到的JSON日志文件并在终端显示。


如果日志不断增加,不会占满磁盘空间吗? 🤔

是的,没错。如果不采取任何措施,日志文件会不断增大,最终占满主机的磁盘空间。为了防止这种情况,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个)。


结论 📝



  • Docker容器的控制台日志是以文件的形式存储在主机的磁盘上,而不是系统的内存中

  • docker logs命令的作用是读取并显示存储的文件。

  • 为了防止日志文件无限增大,设置日志轮换选项(max-sizemax-file)是非常重要的。

在Docker Compose中,可以在docker-compose.yml文件中为每个服务很容易地设置日志选项。

可以认为docker run命令的--log-opt标志是以YAML格式提供的。


docker-compose.yml文件中设置 📝

下面是对名为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个)的磁盘空间。


为所有容器设置默认值 🌍

如果觉得为每个容器逐一设置选项麻烦,并且想在整个系统中应用默认策略,最好的方法是修改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文件。