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