Docker Logging và Monitoring

Photo of author

Văn Ngọc Tân

Bạn có biết?

Bạn có bao giờ mất hàng giờ để debug một container bị crash mà không có log không? Hoặc tự hỏi “sao container này chạy chậm quá vậy?” mà không có metrics?

Logging và monitoring là two sides of the same coin — logging cho biết đã xảy ra gì, còn monitoring cho biết đang xảy ra gì. Không có cả hai, bạn như mù trong production!

Docker Logging

1. Docker Logs Command

Cách đơn giản nhất để xem logs:

# Xem logs của container
$ docker logs my-container

# Xem logs theo thời gian thực
$ docker logs -f my-container

# Xem logs với timestamps
$ docker logs -t my-container

# Xem số dòng cuối cùng
$ docker logs --tail 100 my-container

# Xem logs từ thời điểm cụ thể
$ docker logs --since 2024-01-01T00:00:00 my-container
$ docker logs --since 30m my-container

2. Logging Drivers

Docker hỗ trợ nhiều logging drivers khác nhau:

# Kiểm tra logging drivers được hỗ trợ
$ docker info --format '{{.LoggingDriver}}'

# Các drivers có sẵn:
# - json-file (mặc định)
# - syslog
# - journald
# - gelf
# - fluentd
# - awslogs
# - cloudwatch
# - splunk

3. Cấu hình Logging Driver

# Chỉ định logging driver khi chạy container
$ docker run \
    --log-driver json-file \
    --log-opt max-size=10m \
    --log-opt max-file=3 \
    -d myapp:latest

# Cấu hình global trong daemon.json
# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

4. JSON logging driver (mặc định)

Lưu logs dạng JSON, dễ parse:

# Logs được lưu tại:
# /var/lib/docker/containers//-json.log

# Format:
# {"log":"message\n","stream":"stdout","time":"2024-01-01T00:00:00.000000000Z"}
$ docker logs my-container | jq .

5. Syslog Driver

Gửi logs tới syslog server:

# Gửi logs tới syslog server
$ docker run \
    --log-driver syslog \
    --log-opt syslog-address=tcp://localhost:514 \
    --log-opt syslog-facility=daemon \
    myapp:latest

6. Fluentd Driver

Gửi logs tới Fluentd:

$ docker run \
    --log-driver fluentd \
    --log-opt fluentd-address=localhost:24224 \
    --log-opt tag=myapp.{{.ID}} \
    myapp:latest

7. Log Rotation

# Cấu hình log rotation
$ docker run \
    --log-driver json-file \
    --log-opt max-size=10m      # Kích thước tối đa mỗi file
    --log-opt max-file=3      # Số file tối đa
    myapp:latest

# Khi đạt 10MB, Docker tự động tạo file mới
# Xóa file cũ khi vượt quá 3 files

Docker Monitoring

1. docker stats — Xem Resource Usage

# Xem CPU, Memory, Network, Disk I/O
$ docker stats

# Xem theo bảng đẹp hơn
$ docker stats --no-stream --format "table {{.Name}}	{{.CPUPerc}}	{{.MemUsage}}"

# Xem stats một container
$ docker stats my-container

# Xem chi tiết (bao gồm block I/O)
$ docker stats --no-stream my-container

2. docker inspect — Chi tiết Container

# Xem thông tin chi tiết container
$ docker inspect my-container

# Xem memory
$ docker inspect --format='{{.State.MemoryStats}}' my-container

# Xem CPU
$ docker inspect --format='{{.State.CPUStats}}' my-container

# Xem health status
$ docker inspect --format='{{.State.Health}}' my-container

# Xem Networks
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container

3. docker top — Processes trong Container

# Xem processes đang chạy trong container
$ docker top my-container

# Xem với options của Linux ps
$ docker top my-container auxww

4. cAdvisor — Container Advisor

Google cAdvisor là công cụ monitoring mạnh mẽ cho containers:

# Chạy cAdvisor dưới dạng container
$ docker run \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  gcr.io/cadvisor/cadvisor:latest

# Truy cập UI tại http://localhost:8080

5. Prometheus Integration

cAdvisor export metrics cho Prometheus:

# cAdvisor exposed metrics tại:
# http://localhost:8080/metrics

# Prometheus config:
scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

6. Giám sát với Prometheus + Grafana

# File docker-compose.yml cho monitoring stack
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090

  grafana:
    image: grafana/grafana:latest
    ports:
      - 3000:3000
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana-data:/var/lib/grafana

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    volumes:
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - 8080:8080

volumes:
  grafana-data:

7. Docker Engine Metrics

Enable metrics cho Docker Engine:

# Thêm vào /etc/docker/daemon.json
{
  "metrics-addr": "127.0.0.1:9323",
  "experimental": true
}

# Restart Docker
$ sudo systemctl restart docker

# Xem metrics
$ curl http://127.0.0.1:9323/metrics

Essential Metrics cần theo dõi

Metric Ý nghĩa Ngưỡng cảnh báo
CPU Usage % CPU đang dùng > 80% liên tục
Memory Usage RAM đang dùng > 80%
Memory Limit Giới hạn đặt ra Container bị OOM
Network I/O Lưu lượng mạng Tăng đột ngột
Block I/O Đọc/ghi disk Disk lag
Container Status Đang chạy/không Exit unexpectdly
Health Checks Tình trạng health Unhealthy

Alerting

Cấu hình Alert trong Prometheus

# prometheus.yml
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']

rule_files:
  - "alerts.yml"

# alerts.yml
groups:
- name: docker_alerts
  rules:
  - alert: HighCPUUsage
    expr: rate(container_cpu_usage_seconds_total[5m]) > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage"

  - alert: HighMemoryUsage
    expr: container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.8
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High memory usage"

Best Practices

  1. Sử dụng stdout/stderr — Container nên log ra stdout/stderr, Docker tự động thu thập
  2. Structured logging — Dùng JSON format, dễ parse và query
  3. Cấu hình log rotation — Tránh disk đầy
  4. Đặt resource limits — Memory, CPU có giới hạn rõ ràng
  5. Health checks — Thêm HEALTHCHECK trong Dockerfile
  6. Centralize logging — Dùng ELK Stack, Loki, hoặc cloud services
  7. Metrics + Alerting — Prometheus + Grafana cho production
  8. Log only important info — Không log debug verbose, tránh noise
  9. Include request IDs — Log request IDs để trace
  10. Alert on anomalies — Không chỉ alert on thresholds

Bước tiếp theo

Bạn đã nắm vững cách logging và monitoring! Tiếp theo, hãy tìm hiểu Docker Registry — cách quản lý private image registry cho team và CI/CD.

👉 Đọc tiếp: Docker Registry: Quản lý Image riêng

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận