> **三点总结** > > * Docker容器的控制台日志并非存储在系统**内存中,而是以文件形式保存在宿主机的磁盘上**。 > * `docker logs`命令的作用是读取这些已保存的日志文件并显示出来。 > * 为防止日志文件无限增长,**配置日志轮转选项(`max-size`, `max-file`)**至关重要。 ## 1. 日志存储在哪里?如何存储? {#sec-37c2a29cff35} [[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秒](/media/whitedec/blog_img/ff3498a786c645ecb031d714a053d4a4.webp) ## 2. 日志持续增长会导致磁盘空间不足吗? {#sec-4e6257ec2aba} 是的,没错。如果不采取任何措施,日志文件会持续增长,最终可能耗尽宿主机的磁盘空间。为避免这种情况,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`文件中进行配置 {#sec-890442ea3ac0} 在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. 将其设置为所有容器的默认值 {#sec-1a0729e53c34} 如果您觉得为每个容器单独设置选项很麻烦,并希望为整个系统应用默认策略,那么修改**Docker守护进程(Daemon)配置文件**是最佳选择。 1. 打开或创建`/etc/docker/daemon.json`文件。(如果文件不存在,请新建一个。) 2. 写入以下内容: ```json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } ``` 3. 重启Docker守护进程。 ```bash sudo systemctl restart docker ``` 通过这样设置,未来创建的**所有容器**,只要没有单独的日志配置,都将自动遵循此策略。当然,如果在`docker-compose.yml`文件或`docker run`命令中为特定容器指定了不同的日志选项,那么**单独的设置将优先于守护进程的设置**。 * **单个服务设置**:在`docker-compose.yml`文件内的`logging`部分进行配置是最常见和便捷的方式。 * **全局默认设置**:如果要在服务器的所有容器上应用统一策略,请修改`/etc/docker/daemon.json`文件。