三点总结
- 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日志文件并将其展示在终端中。

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)配置文件是最佳选择。
- 打开或创建
/etc/docker/daemon.json文件。(如果文件不存在,请新建一个。) - 写入以下内容:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- 重启Docker守护进程。
sudo systemctl restart docker
通过这样设置,未来创建的所有容器,只要没有单独的日志配置,都将自动遵循此策略。当然,如果在docker-compose.yml文件或docker run命令中为特定容器指定了不同的日志选项,那么单独的设置将优先于守护进程的设置。
- 单个服务设置:在
docker-compose.yml文件内的logging部分进行配置是最常见和便捷的方式。 - 全局默认设置:如果要在服务器的所有容器上应用统一策略,请修改
/etc/docker/daemon.json文件。