Cơn ác mộng 100% Disk vào lúc 2 giờ sáng
Bạn đã bao giờ thức trắng đêm vì server sập bất thình lình chưa? Mình từng rơi vào cảnh đó: VPS báo ổ cứng đầy 100%, dù ứng dụng chỉ là một web app Node.js đơn giản. Sau khi kiểm tra bằng lệnh du -sh /var/lib/docker, mình bàng hoàng thấy thư mục log chiếm tới hơn 50GB.
Sai lầm nằm ở chỗ mình đã giữ nguyên cấu hình mặc định của Docker. Thực tế, Docker Engine được thiết kế để tương thích với nhiều môi trường, không phải để chạy tối ưu ngay lập tức trên production. Để kiểm soát hệ thống này, bạn buộc phải làm chủ file /etc/docker/daemon.json.
Quick Start: Cấu hình chuẩn để ngủ ngon hơn
Dưới đây là file cấu hình mình thường áp dụng cho các server chạy Ubuntu 20.04/22.04. Bạn có thể copy vào /etc/docker/daemon.json để khắc phục ngay các vấn đề phổ biến.
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
},
"live-restore": true,
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
}
}
}
Đừng quên kiểm tra lỗi cú pháp trước khi áp dụng:
sudo dockerd --validate-config
Nếu kết quả trả về trống (không có lỗi), hãy khởi động lại service:
sudo systemctl restart docker
Phân tích kỹ thuật: Tại sao các thông số này quan trọng?
1. Storage Driver: Ưu tiên tuyệt đối overlay2
Các phiên bản Docker cũ thường dùng aufs hoặc devicemapper. Tuy nhiên, overlay2 hiện là chuẩn mực vàng nhờ khả năng quản lý layer hiệu quả và tốc độ I/O vượt trội. Nó giúp giảm tải cho CPU và tiết kiệm Inodes trên ổ cứng.
Lưu ý: Nếu bạn thay đổi driver trên server đang chạy, Docker sẽ không tìm thấy Image cũ. Bạn cần pull lại toàn bộ dữ liệu từ đầu.
2. Logging Driver: Giới hạn để tồn tại
Mặc định, Docker ghi lại mọi thứ container xuất ra (stdout/stderr) vào file JSON và giữ chúng mãi mãi. Với một app có 1.000 request mỗi giây, file log có thể tăng thêm vài GB mỗi ngày.
"max-size": "20m": Giới hạn mỗi file log chỉ nặng tối đa 20MB."max-file": "5": Chỉ giữ lại 5 file gần nhất (tổng cộng 100MB/container).
Cách này giúp bạn vừa có dữ liệu để debug, vừa không bao giờ lo bị “cắn” hết dung lượng đĩa cứng.
3. Live Restore: Duy trì uptime khi bảo trì
Thông thường, khi bạn restart Docker daemon để cập nhật hệ thống, mọi container sẽ bị tắt theo. Tính năng live-restore cho phép các container tiếp tục chạy ngay cả khi daemon đang khởi động lại. Đây là yếu tố sống còn để đảm bảo dịch vụ không bị gián đoạn (zero-downtime).
Tối ưu tài nguyên nâng cao
Chuyển nơi lưu trữ sang ổ cứng phụ (data-root)
Phần lớn VPS mặc định chia partition / khá nhỏ. Nếu bạn gắn thêm ổ SSD 500GB vào /data, hãy điều hướng Docker lưu trữ tại đó để tránh làm treo hệ điều hành khi dữ liệu phình to.
{
"data-root": "/data/docker-data"
}
Giới hạn File Descriptors (ulimits)
Một server Nginx hoặc Database khi xử lý lượng lớn kết nối sẽ cần mở rất nhiều file cùng lúc. Giới hạn mặc định thường chỉ là 1024, quá thấp cho môi trường tải cao. Việc set nofile lên 65535 giúp container hoạt động ổn định, tránh lỗi “Too many open files” gây crash app.
Kinh nghiệm thực tế khi vận hành
Sau nhiều năm quản lý hệ thống, mình rút ra 3 quy tắc bất biến:
- JSON không chấp nhận sai sót: Chỉ cần một dấu phẩy thừa ở cuối file, Docker sẽ từ chối khởi động. Luôn dùng lệnh validate hoặc công cụ
jqđể kiểm tra. - Quản lý tập trung: Hãy cấu hình Logging và Ulimits ở cấp độ Daemon thay vì viết vào từng file Docker Compose. Cách này giúp mọi container trên server đều tuân thủ một tiêu chuẩn chung.
- Cấu hình DNS cố định: Nếu container gặp lỗi không thể gọi API ra ngoài, hãy thử ép DNS về Google hoặc Cloudflare ngay trong daemon.json:
"dns": ["8.8.8.8", "1.1.1.1"]
Việc dành 5 phút tối ưu daemon.json ngay từ đầu sẽ giúp bạn tránh được hàng giờ đồng hồ xử lý sự cố về sau. Hãy kiểm tra server của bạn ngay hôm nay!

