Docker Log Rotation: Tuyệt chiêu chống đầy ổ cứng Server cho DevOps

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Bối cảnh: Cơn ác mộng mang tên Full Disk

Bạn đã bao giờ bị dựng dậy lúc 3 giờ sáng vì server sập, chỉ để phát hiện ổ cứng báo 100% chưa? Mình từng nếm trái đắng khi deploy một hệ thống microservices cho dự án e-commerce. Do sơ suất để log ở mode debug mà không giới hạn dung lượng, chỉ sau 48 giờ, một file log duy nhất đã phình lên 65GB. Kết quả là nó nuốt trọn phân vùng root của VPS.

Mặc định, Docker sử dụng json-file logging driver. Driver này âm thầm ghi lại mọi output (stdout/stderr) vào một file JSON trên máy chủ. Nếu không giới hạn, file này sẽ lớn vô tận cho đến khi ổ cứng không còn một byte trống. Lúc đó, database ngừng ghi, các service chết dây chuyền và bạn sẽ mất cả buổi sáng để dọn dẹp đống hỗn độn.

Để tránh kịch bản kinh dị này, Log Rotation (xoay vòng log) là kỹ thuật bắt buộc. Hiểu đơn giản, nó giúp bạn khống chế kích thước file log và tự động xóa bỏ những bản ghi cũ khi vượt ngưỡng cho phép.

3 cách cấu hình giới hạn log container hiệu quả

Tùy vào việc bạn đang chạy container lẻ hay quản lý cả một cụm server, hãy chọn một trong ba cách tiếp cận dưới đây.

1. Cấu hình nhanh với lệnh Docker Run

Cách này phù hợp khi bạn cần test nhanh một container đơn lẻ. Bạn chỉ cần thêm flag --log-opt trực tiếp vào câu lệnh khởi chạy.

docker run -d \
  --name nginx-proxy \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

Giải thích thông số:

  • max-size=10m: Khi file log chạm mốc 10MB, Docker sẽ thực hiện xoay vòng.
  • max-file=3: Hệ thống chỉ giữ lại tối đa 3 file log cũ nhất. Khi có file thứ 4 xuất hiện, file lâu đời nhất sẽ bị xóa bỏ.

2. Thiết lập trong Docker Compose

Trong thực tế, chúng ta thường làm việc với Docker Compose. Việc đưa cấu hình log vào file .yml giúp bạn quản lý hạ tầng dưới dạng code (IaC), dễ dàng tái sử dụng khi chuyển server.

services:
  api-service:
    image: node:18-alpine
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "5"
  db-postgres:
    image: postgres:15
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "3"

Kinh nghiệm xương máu: Với các dịch vụ quan trọng như Database, bạn nên nâng max-file lên khoảng 5-10 file. Điều này giúp việc truy vết (trace) lỗi trong quá khứ trở nên dễ dàng hơn.

3. Cấu hình Global cho toàn bộ Server (Khuyên dùng)

Đây là phương án “set and forget” hiệu quả nhất. Thay vì cấu hình cho từng container, bạn thiết lập luật chơi chung cho Docker Daemon. Mọi container tạo mới sau đó sẽ tự động tuân thủ quy tắc này.

Hãy mở (hoặc tạo mới) file cấu hình Docker tại /etc/docker/daemon.json:

sudo nano /etc/docker/daemon.json

Dán nội dung sau vào file:

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

Cuối cùng, hãy khởi động lại Docker để áp dụng thay đổi:

sudo systemctl restart docker

Lưu ý quan trọng: Việc restart Docker Daemon sẽ khiến các container đang chạy bị ngắt kết nối tạm thời. Ngoài ra, cấu hình này chỉ có tác dụng với các container tạo mới. Những container cũ vẫn giữ nguyên cấu hình cũ cho đến khi bạn recreate chúng.

Mẹo xử lý nhanh khi ổ đĩa đã đầy 100%

Nếu bạn đang đọc bài này khi server đã “hấp hối”, đừng vội dùng lệnh rm để xóa file log. Docker có thể không giải phóng dung lượng ngay do file vẫn đang bị process chiếm dụng. Cách chuẩn nhất là làm rỗng file (truncate):

# Làm rỗng tất cả file log Docker ngay lập tức
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

Lệnh này sẽ đưa dung lượng các file log về 0 bytes trong tích tắc, giúp server của bạn “thở” lại được ngay mà không cần restart service.

Lời kết

Quản lý log thường bị các bạn junior xem nhẹ khi chạy ở môi trường local. Tuy nhiên trên Production với hàng triệu request, log chính là con dao hai lưỡi.

Lời khuyên của mình là hãy luôn cấu hình daemon.json ngay khi vừa setup server mới. Nếu ứng dụng yêu cầu lưu trữ log lâu dài để phân tích, hãy đẩy chúng sang các hệ thống chuyên dụng như ELK Stack hoặc Graylog thay vì để chúng “ăn mòn” ổ cứng server ứng dụng. Đừng để một file text nhỏ bé làm sập cả một hệ thống lớn!

Share: