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