Docker

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 อย่างเป็นระบบ