Docker Log Management เก็บ Log ไม่ให้กิน Disk เต็ม

ปัญหา Log ใน Docker

โดยตั้งค่า Docker เก็บ Log ทุก Container ไว้ในไฟล์ JSON บน Host หากไม่จัดการ Container ที่เสียหรือใช้งานหนักจะสามารถเพิ่ม Disk Usage จนเต็ม Server ได้

ดู Log ผ่าน Docker CLI

# ดู log ปัจจุบัน
docker logs container_name

# ดู log แบบต่อเนื่อง
docker logs -f container_name

# ดู log 100 บรรทัดล่าสุด
docker logs --tail 100 container_name

# ดู log พร้อม timestamp
docker logs -t container_name

# ดู log พร้อม filter ตามวันเวลา
docker logs --since 2026-03-01 container_name
docker logs --until 2026-03-27 container_name

ควบคุมขนาด Log ด้วย max-size

# กำหนด Log Rotation ปัปปันทันที ในคำสั่ง docker run
docker run -d \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  myapp:latest
# ใน Docker Compose
services:
  app:
    image: myapp:latest
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

ตั้งค่า Default Log Limit สำหรับทุก Container

แก้ไฟล์ /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

จากนั้น restart Docker:

systemctl restart docker

Log Drivers ที่นิยมใช้

Driver ความสามารถ เหมาะ
json-file บันทึกเป็น JSON บนดิสก์ ค่า default
local บันทึกเป็น binary เป็นนี้ fast กว่า ถ้าไม่ใช้ docker logs
syslog ส่งไป Syslog daemon ระบบ Centralized
gelf ส่งไป Graylog Log Management พื้นฐาน
fluentd ส่งไป Fluentd/Fluentbit Enterprise Logging
none ไม่บันทึก log เลย Job ที่ไม่ต้องการ log

Loki + Grafana (Lightweight Log Stack)

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

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin123
    volumes:
      - grafana_data:/var/lib/grafana
    depends_on:
      - loki

volumes:
  loki_data:
  grafana_data:

ส่ง Log เข้า Loki โดยตั้ง Docker logging driver:

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

การลบ Log เก่าออก

# ตรวจดู disk usage ของ log
docker system df

# ดูเส้นทาง log file
ls -lh /var/lib/docker/containers/*/

# ลบ log container ที่เหลือ (truncate)
truncate -s 0 /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log

สรุป

ตั้งค่า max-size และ max-file ในทุก Container ที่เป็น Production เพื่อป้องกัน Disk เต็ม หรือใช้ Loki สำหรับเก็บ Log อย่างเป็นระบบ