Cách Tránh Docker Đầy Ổ Đĩa Trên VPS – Dọn Dẹp & Log Rotation
Cách tránh Docker đầy ổ đĩa là vấn đề gần như ai chạy container trên VPS cũng từng gặp: website đang chạy bình thường bỗng dưng treo, SSH vào thì thấy no space left on device, container không khởi động lại được. Phần lớn nguyên nhân đến từ log, image cũ và build cache tích […]
Cách tránh Docker đầy ổ đĩa là vấn đề gần như ai chạy container trên VPS cũng từng gặp: website đang chạy bình thường bỗng dưng treo, SSH vào thì thấy no space left on device, container không khởi động lại được. Phần lớn nguyên nhân đến từ log, image cũ và build cache tích tụ. Bài viết này hướng dẫn bạn cách chẩn đoán, dọn dẹp và cấu hình phòng ngừa trên VPS Linux, dựa trên tài liệu chính thức của Docker.
Tại sao Docker lại ăn hết dung lượng ổ đĩa VPS?
Docker không tự “phình” dung lượng, nhưng nó giữ lại rất nhiều thứ mà đa số người dùng không để ý: image cũ, container đã dừng, volume mồ côi, log container và build cache. Sau vài tuần deploy liên tục, chỉ riêng log và cache cũng có thể chiếm vài GB.
Docker chiếm nhiều dung lượng VPS chủ yếu do 5 nguồn: image không còn dùng (dangling), container đã dừng nhưng chưa xóa, volume không gắn với container nào, build cache từ các lần docker build, và log container ghi bằng driver json-file không giới hạn kích thước.
| Nguồn chiếm dung lượng | Kích thước thường gặp | Lệnh dọn dẹp |
|---|---|---|
| Dangling image (image <none>) | 1 đến 10 GB | docker image prune |
| Container đã dừng | Vài trăm MB đến vài GB | docker container prune |
| Volume mồ côi | Tùy ứng dụng, DB có thể rất lớn | docker volume prune |
| Build cache | 2 đến 20 GB | docker builder prune |
| Log container (json-file) | Có thể vượt 20 GB mỗi container | Cấu hình log rotation |
Nếu bạn mới làm quen với container, nên đọc thêm bài Docker là gì và cách cài đặt để nắm rõ kiến trúc trước khi thao tác xóa dữ liệu.

Cách kiểm tra Docker đang chiếm bao nhiêu dung lượng
Trước khi xóa bất cứ thứ gì, bạn cần biết chính xác thứ gì đang ngốn chỗ. Bốn lệnh dưới đây là đủ để có bức tranh tổng thể.
1. Tổng quan với docker system df
docker system df
Lệnh này in ra bảng 4 nhóm: Images, Containers, Local Volumes, Build Cache, kèm cột RECLAIMABLE cho biết dung lượng có thể thu hồi. Đây là chỉ số quan trọng nhất để quyết định có nên prune hay không.

2. Chi tiết từng đối tượng với docker system df -v
docker system df -v
Bảng chi tiết liệt kê từng image, container, volume kèm SIZE và SHARED SIZE. Dùng cột này để xác định đúng “thủ phạm” thay vì xóa mù quáng.

3. Kiểm tra ổ đĩa host với df -h
df -h /var/lib/docker
Kết quả cho thấy partition chứa /var/lib/docker còn bao nhiêu chỗ. Nếu Use% đã trên 85%, bạn nên dọn ngay trước khi container gặp lỗi.

4. Tìm thư mục con lớn nhất với du
sudo du -sh /var/lib/docker/* | sort -h
Lệnh này sắp xếp thư mục theo kích thước tăng dần. Bạn sẽ thấy ngay overlay2 (layer image), volumes, containers hay buildkit đang chiếm nhiều nhất.

Dọn dẹp Docker an toàn: các lệnh prune từ cơ bản đến nâng cao
Nguyên tắc chung là làm từ nhẹ đến mạnh, kiểm tra sau mỗi bước bằng docker system df. Đừng bắt đầu bằng lệnh “nặng” nhất.
⚠ Cảnh báo:
Các lệnh prune xóa vĩnh viễn dữ liệu không thể khôi phục. Nếu đang có container production chạy trên VPS, hãy sao lưu volume và image quan trọng trước khi chạy bất cứ lệnh nào có tham số -a hoặc --volumes.
Bước 1. Xóa container đã dừng
docker container prune
Chỉ xóa container có trạng thái Exited, không ảnh hưởng container đang chạy. Đây là bước an toàn nhất và thường thu hồi được vài trăm MB đến vài GB.
Bước 2. Xóa image không dùng
docker image prune # chỉ xóa dangling image
docker image prune -a # xóa mọi image không có container dùng
Tùy chọn -a mạnh hơn nhiều: bất kỳ image nào không gắn với container đang chạy đều bị xóa. Nếu bạn có image base đang giữ để build lại, cân nhắc trước khi dùng -a.
Bước 3. Xóa volume mồ côi
docker volume prune
Chỉ xóa volume anonymous không còn được container nào tham chiếu. Volume có tên (named volume) vẫn được giữ trừ khi bạn thêm -a.
Bước 4. Xóa build cache
docker builder prune
Build cache giúp build nhanh hơn nhưng có thể chiếm hàng chục GB nếu bạn build nhiều lần. Nếu không cần build thường xuyên, xóa để giải phóng dung lượng.
Bước 5. Lọc theo thời gian
docker image prune -a --filter "until=168h" # giữ image tạo trong 7 ngày
docker builder prune --filter "until=24h" # giữ cache 24h gần nhất
Filter until rất hữu ích khi bạn muốn dọn dẹp định kỳ mà không phá vỡ workflow build hằng ngày.
Bước 6. “Nút hủy diệt”: docker system prune -a --volumes
docker system prune -a --volumes
Lệnh này xóa gần như toàn bộ tài nguyên không đang chạy: container đã dừng, mọi image không dùng, toàn bộ volume (kể cả có tên), và build cache. Chỉ dùng khi bạn hiểu rõ hệ quả hoặc VPS chỉ dùng để test.
| Lệnh | Xóa gì | Mức độ an toàn |
|---|---|---|
docker container prune |
Container đã dừng | Cao |
docker image prune |
Dangling image | Cao |
docker image prune -a |
Mọi image không có container | Trung bình |
docker volume prune |
Volume anonymous | Trung bình |
docker builder prune |
Build cache | Cao |
docker system prune -a --volumes |
Container dừng, image, volume, cache | Thấp, chỉ dùng khi hiểu rõ |
Tham khảo thêm hành vi chi tiết của từng lệnh tại tài liệu chính thức Docker về pruning. Nếu bạn đang gặp tình trạng VPS chậm, đầy tài nguyên nói chung, bài xử lý VPS đầy tài nguyên sẽ giúp bạn kiểm tra thêm các nguyên nhân khác.
Xử lý log container, nguyên nhân phổ biến nhất gây đầy ổ đĩa
Mặc định, Docker Engine dùng log driver json-file không giới hạn kích thước. Một container ghi log liên tục (web server, app lỗi lặp lại) có thể tạo file log hàng chục GB trong vài ngày. Đây là lý do số một khiến VPS đầy ổ đĩa dù bạn rất ít khi build image.
Cấu hình log rotation toàn cục trong /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Với cấu hình này, mỗi container tối đa 10 MB log mỗi file, giữ 3 file, tức tối đa 30 MB log cho mỗi container. Đủ cho hầu hết ứng dụng nhỏ và website.
sudo nano /etc/docker/daemon.json
sudo systemctl restart docker
Sau khi lưu file, bạn cần restart Docker để áp dụng. Kiểm tra lại bằng docker info | grep -i "log".
⚠ Cảnh báo:
Restart Docker sẽ dừng toàn bộ container đang chạy. Nếu cấu hình restart: always hoặc unless-stopped, container sẽ tự bật lại, nhưng vẫn có vài giây downtime. Nên thực hiện vào giờ thấp điểm.
Cấu hình log rotation cho từng container
docker run -d \
--log-opt max-size=10m \
--log-opt max-file=3 \
--name myapp nginx:alpine
Cách này hữu ích khi bạn chỉ muốn giới hạn log cho vài container cụ thể mà không đụng đến daemon. Lưu ý: log rotation chỉ áp dụng cho container tạo mới, container cũ phải recreate mới có hiệu lực.
Di chuyển Docker data-root sang ổ đĩa lớn hơn
Nếu VPS có partition root nhỏ (ví dụ 20 GB) nhưng có ổ phụ lớn hơn đã mount sẵn, bạn có thể chuyển toàn bộ dữ liệu Docker sang ổ đó. Cách này giải quyết triệt để vấn đề thiếu dung lượng mà không cần đổi VPS.
Các bước thực hiện
- Dừng Docker:
sudo systemctl stop dockervàsudo systemctl stop docker.socket. - Copy dữ liệu sang đường dẫn mới (ví dụ
/mnt/data/docker):
sudo rsync -aP /var/lib/docker/ /mnt/data/docker/
- Sửa
/etc/docker/daemon.json, thêm dòng"data-root": "/mnt/data/docker". - Khởi động lại Docker và kiểm tra.
sudo systemctl start docker
docker info | grep "Docker Root Dir"
Nếu kết quả trả về /mnt/data/docker, bạn đã di chuyển thành công. Kiểm tra container chạy bình thường rồi mới xóa dữ liệu cũ trong /var/lib/docker.
⚠ Cảnh báo:
Không xóa /var/lib/docker cũ cho đến khi bạn đã xác nhận Docker hoạt động với data-root mới và toàn bộ container, volume chạy đúng. Nếu mount point mất kết nối sau reboot, container sẽ không khởi động, nên thêm entry vào /etc/fstab với tùy chọn nofail.
Nếu bạn chưa quen thao tác trên VPS Linux, xem trước bài VPS Linux là gì và cách sử dụng để nắm các lệnh cơ bản trước khi di chuyển dữ liệu.
Phòng ngừa: tự động dọn dẹp và giám sát dung lượng Docker
Sau khi dọn sạch, việc quan trọng là đảm bảo tình trạng không tái diễn. Ba việc dưới đây giúp bạn kiểm soát dung lượng Docker dài hạn: cron prune định kỳ, script giám sát, và thói quen vận hành.
Cron prune an toàn mỗi tuần
# /etc/cron.weekly/docker-prune
#!/bin/bash
docker container prune -f --filter "until=168h"
docker image prune -f --filter "until=168h"
docker builder prune -f --filter "until=168h"
Cấp quyền thực thi bằng sudo chmod +x /etc/cron.weekly/docker-prune. Cách này chỉ dọn tài nguyên cũ hơn 7 ngày, an toàn với môi trường có deploy thường xuyên.
Script giám sát dung lượng có thể thu hồi
#!/bin/bash
RECLAIM=$(docker system df --format '{{.Reclaimable}}' | head -1 | awk '{print $1}' | tr -d 'GB')
THRESHOLD=10
if (( $(echo "$RECLAIM > $THRESHOLD" | bc -l) )); then
echo "Docker có thể thu hồi ${RECLAIM}GB, nên prune" | mail -s "Docker disk alert" [email protected]
fi
Script kiểm tra cột RECLAIMABLE trong docker system df và gửi email cảnh báo khi vượt ngưỡng. Đặt vào cron hàng ngày để chủ động phát hiện sớm.
Checklist 6 thói quen phòng ngừa
- Bật log rotation trong
/etc/docker/daemon.jsonngay từ đầu. - Prune định kỳ hàng tuần bằng cron thay vì chờ đến khi đầy.
- Chạy
docker system dfmỗi lần SSH vào VPS để nắm tình hình. - Tránh dùng tag
latesttrong production, vì dễ sinh dangling image khi pull lại. - Ưu tiên base image gọn (
alpine,distroless) để giảm kích thước layer. - Theo dõi
df -hsong song để biết partition nào đang tới hạn.
Những thao tác trên đều dựa trên các lệnh Docker Engine tiêu chuẩn, áp dụng được cho VPS Linux đang dùng systemd. Nếu bạn muốn tìm hiểu sâu hơn về container và lợi ích của nó, tìm hiểu thêm bài Containerization là gì.
Câu hỏi thường gặp
1. docker system prune có xóa container đang chạy không?
Không. Lệnh docker system prune chỉ xóa container đã dừng, network không dùng, dangling image và build cache. Container đang chạy vẫn được giữ nguyên. Tuy nhiên, nếu bạn thêm tham số -a, mọi image không gắn với container đang chạy sẽ bị xóa, nên cần cân nhắc trước.
2. docker system prune và docker image prune khác nhau thế nào?
docker image prune chỉ xử lý image. docker system prune dọn nhiều loại tài nguyên hơn: container dừng, network không dùng, dangling image, và build cache. Nếu chỉ muốn giải phóng dung lượng từ image, dùng lệnh chuyên biệt sẽ an toàn hơn.
3. Làm sao biết container nào đang ngốn dung lượng ổ đĩa?
Dùng docker system df -v để xem SIZE từng container và volume. Với log, chạy du -sh /var/lib/docker/containers/*/*-json.log | sort -h, file nào lớn nhất chính là container ghi log nhiều nhất. Từ đó cấu hình log rotation hoặc kiểm tra lại ứng dụng.
4. Có nên dùng docker system prune -a --volumes không?
Chỉ nên dùng khi VPS là môi trường test hoặc bạn đã sao lưu toàn bộ volume quan trọng. Lệnh này xóa volume có tên, nghĩa là dữ liệu database, file upload có thể mất vĩnh viễn. Trên production, dùng từng lệnh prune riêng và có filter an toàn hơn.
5. Bao lâu nên dọn dẹp Docker một lần?
Với VPS nhỏ (20 đến 40 GB) deploy thường xuyên, nên prune mỗi tuần. VPS lớn hơn có thể 2 đến 4 tuần một lần. Quan trọng hơn tần suất là bật log rotation và giám sát docker system df để phát hiện sớm trước khi ổ đĩa đầy.
Lời kết
Cách tránh Docker đầy ổ đĩa không nằm ở một lệnh duy nhất, mà ở quy trình: hiểu nguyên nhân (image cũ, volume mồ côi, log không giới hạn), chẩn đoán định kỳ bằng docker system df, và cấu hình log rotation ngay từ đầu. Ba việc quan trọng nhất là bật max-size cho log trong daemon.json, đặt cron prune hàng tuần với filter until, và theo dõi dung lượng VPS song song. Làm được ba điều này, bạn sẽ không còn bị động khi container báo no space left on device.
Cần một VPS để chạy Docker?
Chọn cấu hình có đủ dung lượng cho container, toàn quyền root, sẵn sàng cài Docker Engine.
Nội dung bài viết mang tính tham khảo. Các lệnh và cấu hình trong bài được kiểm chứng trên Ubuntu 22.04/24.04 LTS với Docker Engine và quyền root. Tùy phiên bản Docker, hệ điều hành, storage driver và cấu hình VPS thực tế, kết quả có thể khác. Người đọc nên sao lưu dữ liệu, kiểm thử trên môi trường staging và đánh giá rủi ro trước khi áp dụng cho hệ thống production.



