Docker容器日志管理:限制日志大小、集中收集与Loki接入教程

Docker 日志的隐患:无限增长直到磁盘爆满

Docker 容器默认使用 json-file 日志驱动,日志文件存储在 /var/lib/docker/containers/ 目录下,默认没有大小限制。高流量应用运行几周后,日志文件可能积累数十 GB,直接导致磁盘空间告警甚至服务崩溃。

本文提供从单容器限制到集中收集的完整日志管理方案。


一、快速查看当前日志占用

# 查看所有容器的日志文件大小
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -20

# 查看 Docker 整体占用
docker system df -v

二、限制单个容器的日志大小

docker run 命令中指定日志选项:

docker run -d \
  --log-driver json-file \
  --log-opt max-size=100m \
  --log-opt max-file=3 \
  --name myapp \
  myapp:latest

参数说明:
max-size=100m 每个日志文件最大 100MB;max-file=3 保留最近 3 个轮转文件,即最多保留 300MB 日志。


三、在 docker-compose.yml 中统一配置日志策略

version: '3.8'

services:
  app:
    image: myapp:latest
    logging:
      driver: json-file
      options:
        max-size: "100m"
        max-file: "3"

  nginx:
    image: nginx:alpine
    logging:
      driver: json-file
      options:
        max-size: "50m"
        max-file: "5"

四、全局配置 Docker 默认日志策略

修改 Docker daemon 配置,对所有容器生效(无需逐一设置):

sudo nano /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}
sudo systemctl restart docker

注意:此配置只对重启后的新容器生效,现有容器需要重新创建才会应用新的日志策略。


五、清理已存在的大型日志文件

# 清空指定容器的日志(容器继续运行)
sudo truncate -s 0 /var/lib/docker/containers/容器ID/*-json.log

# 或通过容器名查找日志文件路径
CONTAINER_ID=$(docker inspect --format='{{.Id}}' 容器名)
sudo truncate -s 0 /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log

六、接入 Grafana Loki 集中收集日志(进阶)

当服务器数量增多,各容器的日志需要集中收集和检索时,Grafana Loki 是最轻量的方案(比 ELK 栈资源占用低得多)。

安装 Loki Docker 日志驱动插件:

docker plugin install grafana/loki-docker-driver:latest \
  --alias loki \
  --grant-all-permissions

在 docker-compose.yml 中使用 Loki 驱动:

services:
  app:
    image: myapp:latest
    logging:
      driver: loki
      options:
        loki-url: "http://localhost:3100/loki/api/v1/push"
        loki-batch-size: "400"
        loki-retries: "3"
        loki-timeout: "2s"

部署 Loki + Grafana 收集和可视化日志:

version: '3.8'

services:
  loki:
    image: grafana/loki:2.9.0
    ports:
      - "3100:3100"
    volumes:
      - loki_data:/loki
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your_grafana_password
    volumes:
      - grafana_data:/var/lib/grafana
    restart: unless-stopped

volumes:
  loki_data:
  grafana_data:

总结

Docker 日志管理的优先级排序:

  1. 立即配置 /etc/docker/daemon.json 全局日志限制,防止磁盘耗尽
  2. 对高流量容器单独配置更小的 max-size
  3. 定期清理历史大文件
  4. 规模化后接入 Loki 实现集中收集和检索

IDC.Net 香港云服务器独立服务器均支持 Docker 部署,SSD 硬盘保障 I/O 性能,CN2 GIA 直连大陆,支付宝付款即可开通。

THE END