Sửa lỗi Docker "no space left on device"

beginner🐳 Docker2026-03-17| Linux, macOS, Windows (WSL2) — Docker Engine 20+, Docker Desktop

Error Message

no space left on device
#docker#prune#disk

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 -f mỗ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-cache khi 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.

Related Error Notes