Lỗi Xảy Ra
Bạn đang build image, pull từ registry, hoặc khởi động container — và Docker đột ngột dừng lại:
no space left on device
Đôi khi lỗi nằm trong một thông báo dài hơn:
Error response from daemon: failed to create rootfs for container: ...: no space left on device
failed to solve: failed to read dockerfile: error from sender: write /tmp/...: no space left on device
Error pulling image: write /var/lib/docker/...: no space left on device
Docker có thói quen tích trữ. Các layer được cache, container đã dừng, image treo lơ lửng, volume không dùng đến — chúng âm thầm tích lũy cho đến khi ổ đĩa đầy. Đó chính là vấn đề bạn đang gặp phải.
Kiểm Tra Thứ Gì Đang Chiếm Dung Lượng
Đừng vội xóa bừa. Hãy chạy hai lệnh này trước:
# Thống kê dung lượng sử dụng của Docker
docker system df
# Dung lượng ổ đĩa tổng thể trên máy chủ
df -h
Kết quả của docker system df trông như thế này:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 42 5 18.4GB 15.1GB (82%)
Containers 12 2 1.2GB 1.1GB (92%)
Local Volumes 8 3 4.3GB 2.1GB (48%)
Build Cache - - 3.8GB 3.8GB
Chú ý cột RECLAIMABLE. Đây là dung lượng có thể thu hồi mà không ảnh hưởng đến những gì đang chạy.
Cách Khắc Phục Từng Bước
Bước 1 — Giải pháp nhanh (an toàn)
Lệnh dọn dẹp tổng hợp của Docker. Nó xóa container đã dừng, network không dùng, image treo lơ lửng và build cache:
docker system prune
Docker sẽ hiển thị chính xác những gì sắp bị xóa và yêu cầu xác nhận. Bỏ qua bước xác nhận bằng -f:
docker system prune -f
Đây là lựa chọn an toàn nhất — chỉ xóa những thứ không đang được sử dụng. Hãy bắt đầu từ đây.
Bước 2 — Xóa image không dùng (tiết kiệm nhiều hơn)
Mặc định, system prune chỉ xóa các image dangling — các layer không có tag và không có tên. Để xóa thêm các image không được container nào tham chiếu:
docker image prune -a
Lệnh này có thể giải phóng vài gigabyte trên máy dev đang hoạt động. Nhược điểm: các base image cũng bị xóa. Chúng sẽ được tải lại ở lần build tiếp theo, điều này hoàn toàn ổn trừ khi bạn đang dùng kết nối chậm hoặc tính phí theo dung lượng.
Bước 3 — Dọn dẹp volume
Volume được loại trừ khỏi system prune — chúng có thể chứa dữ liệu database hoặc cấu hình quan trọng. Xóa các volume không dùng một cách tường minh:
docker volume prune
Hoặc gộp vào lệnh tổng hợp:
docker system prune --volumes
Bước 4 — Xóa toàn bộ
Muốn xóa sạch mọi thứ liên quan đến Docker chỉ trong một lệnh? Đây là cách làm:
docker system prune -a --volumes -f
Các container đang chạy và image của chúng sẽ không bị ảnh hưởng. Tất cả còn lại đều bị xóa. Phù hợp với máy CI hoặc môi trường dev không cần giữ lại gì.
Bước 5 — Nếu ổ đĩa máy chủ vẫn còn đầy
Docker không phải lúc nào cũng là thủ phạm. Log cũ, core dump, và artifact từ quá trình build cũng tích tụ theo thời gian. Hãy tìm chúng:
# Các thư mục chiếm dung lượng lớn nhất trên hệ thống
du -sh /* 2>/dev/null | sort -rh | head -20
# Các file lớn hơn 500MB
find / -size +500M -type f 2>/dev/null
Những thứ hay gặp: /var/log bị phình to do log ứng dụng, core dump trong /tmp, artifact thừa từ các job CI.
Bước 6 — Di chuyển thư mục dữ liệu của Docker
Nếu phân vùng root của bạn nhỏ nhưng có ổ đĩa mount lớn hơn, hãy chuyển Docker sang đó. Chỉnh sửa /etc/docker/daemon.json:
{
"data-root": "/mnt/large-disk/docker"
}
Sau đó khởi động lại Docker:
sudo systemctl restart docker
Bạn sẽ cần pull lại image sau khi di chuyển. Nhưng nếu bạn liên tục gặp lỗi đầy ổ đĩa, cách này giải quyết tận gốc — không chỉ triệu chứng.
Xác Nhận Đã Sửa Xong
Kiểm tra dung lượng đã được giải phóng:
df -h
docker system df
Sau đó thử lại thao tác bị lỗi trước đó:
docker pull nginx:latest
# hoặc
docker build -t myapp .
# hoặc
docker run --rm hello-world
Không còn lỗi? Vậy là xong.
Phòng Tránh Lỗi Tái Phát
- Lên lịch prune hàng tuần trên máy CI/build. Một cron job chạy
docker system prune -fmỗi tuần sẽ ngăn dung lượng tích tụ trước khi thành vấn đề. - Giới hạn kích thước build cache trong
/etc/docker/daemon.json:
{
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "10GB"
}
}
}
- Trên Docker Desktop — vào Settings → Resources → tăng giới hạn kích thước disk image. Hoặc dùng Dashboard: Troubleshoot → Clean / Purge data.
- Cảnh báo ở mức 80%, không phải 100%. Khi ổ đĩa đầy, các quá trình build đã thất bại rồi. Đặt ngưỡng giám sát sớm hơn.
- Dùng
--no-cachekhi cache đã lỗi thời. Các layer cũ sẽ được thay thế thay vì chồng chất lên nhau, giúp kích thước image không bị phình to.

