Sửa lỗi Docker: Unable to Delete Image Used by Stopped Container

beginner🐳 Docker2026-05-04| Docker Engine 20.x+ trên Linux (Ubuntu/Debian/CentOS), macOS (Docker Desktop), Windows (Docker Desktop/WSL2)

Error Message

Error response from daemon: conflict: unable to delete <image_id> (must be forced) - image is being used by stopped container <container_id>
#docker#image#rmi#prune#stopped-container#cleanup

Lỗi Gặp Phải

Bạn chạy docker rmi <image> để giải phóng dung lượng đĩa, và Docker trả về lỗi này:

Error response from daemon: conflict: unable to delete a1b2c3d4e5f6 (must be forced) - image is being used by stopped container 9f8e7d6c5b4a

Container đã dừng — không chạy — nhưng Docker vẫn từ chối xóa. Điều này khiến nhiều người bối rối. Người ta thường nghĩ rằng container đã dừng thì không còn chiếm tài nguyên. Thực ra không phải vậy: một container đã dừng vẫn giữ các tham chiếu layer trên đĩa cho đến khi bạn xóa nó đi bằng lệnh tường minh.

Nguyên Nhân

Docker image là tập hợp các layer chỉ đọc xếp chồng lên nhau. Khi bạn khởi chạy container từ một image, Docker thêm một layer ghi mỏng lên trên. Dừng container lại, layer đó — cùng với tham chiếu ngược về image gốc — vẫn nằm trên đĩa cho đến khi bạn chạy docker rm.

Chuỗi phụ thuộc rất đơn giản: image → container (đã dừng). Docker sẽ không tự ý xóa image đang được một container tham chiếu, dù container đó đã dừng. Đây là cơ chế bảo vệ để tránh tình trạng layer ghi bị treo lơ lửng không còn chỗ trỏ đến.

Cách Sửa Nhanh: Xóa Container Đang Chặn Trước

Tìm container nào đang giữ image:

docker ps -a --filter ancestor=<image_name_or_id> --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

Hoặc tra trực tiếp container ID từ thông báo lỗi:

docker inspect 9f8e7d6c5b4a --format '{{.Name}} — {{.State.Status}}'

Sau khi xác nhận có thể xóa an toàn:

docker rm 9f8e7d6c5b4a
docker rmi <image_name_or_id>

Xong. Xóa container sẽ giải phóng tham chiếu, và lệnh rmi sẽ thực thi thành công.

Khi Có Nhiều Container Đã Dừng

Sau một ngày build liên tục hoặc chạy CI pipeline, docker ps -a có thể liệt kê 50–100 container đã dừng, mỗi cái đang giữ tham chiếu đến image nguồn. Xóa từng cái một không khả thi. Hãy xóa tất cả cùng lúc:

# Xóa tất cả container đã dừng
docker container prune

# Bỏ qua xác nhận
docker container prune -f

Sau đó thử xóa image lại:

docker rmi <image_name_or_id>

Phương Án Mạnh Tay: Xóa Cưỡng Bức Image

Bỏ qua quy trình hai bước bằng cờ -f:

docker rmi -f <image_name_or_id>

Cờ -f thực sự làm gì: nó gỡ tag và xóa image, nhưng layer ghi của container đã dừng vẫn còn lại dưới dạng tham chiếu treo. Container vẫn xuất hiện trong docker ps -a, lúc này trỏ đến một image bị hỏng. Bản ghi ma này có thể gây nhầm lẫn về sau. Chỉ dùng force khi cần dọn dẹp toàn bộ hệ thống — với việc dọn dẹp thông thường, cách hai bước gọn gàng hơn.

Dọn Dẹp Toàn Bộ Hệ Thống

Muốn xóa sạch mọi thứ không dùng đến chỉ với một lệnh? docker system prune xử lý container đã dừng, image treo, network không dùng, và build cache cùng lúc:

# An toàn: chỉ xóa tài nguyên không dùng/treo
docker system prune

# Mạnh tay: còn xóa cả image không được container đang chạy nào dùng
docker system prune -a

# Bỏ qua xác nhận
docker system prune -a -f

Cẩn thận với cờ -a. Nó xóa cả các base image đã cache — như node:20-alpine hay python:3.12-slim — vốn mất thời gian pull về. Bạn sẽ phải tải lại chúng ở lần build tiếp theo. Chỉ chạy -a khi bạn thực sự muốn bắt đầu từ trạng thái hoàn toàn sạch.

Dọn Dẹp Theo Từng Thành Phần

# Xóa tất cả container đã dừng
docker container prune -f

# Xóa image treo (không có tag, <none>:<none>)
docker image prune

# Xóa tất cả image không dùng
docker image prune -a

# Xóa volume không dùng
docker volume prune -f

# Xóa network không dùng
docker network prune -f

Kiểm Tra Kết Quả

Xác nhận cả container lẫn image đã thực sự bị xóa:

# Không trả về kết quả nào
docker ps -a | grep 9f8e7d6c5b4a

# Không trả về kết quả nào
docker images | grep <image_name>

# Kiểm tra image treo còn sót lại
docker images -f dangling=true

Thấy các dòng <none>:<none> trong lệnh cuối? Dọn sạch chúng:

docker image prune -f

Ngăn Tình Trạng Tích Tụ

Hình thành các thói quen này trong quy trình làm việc và bạn sẽ hiếm khi gặp lỗi này nữa:

  • Dùng --rm cho các container dùng một lần — chúng tự xóa khi thoát: docker run --rm myimage
  • Trong CI pipeline, thêm docker system prune -f như một bước post-build trước khi job kết thúc
  • Dọn dẹp project Compose bằng docker compose down --rmi all thay vì chỉ dùng docker compose down — lệnh này xóa cả container lẫn image trong một lần
  • Trên các build server chạy liên tục, lên lịch chạy docker system prune -a -f hàng tuần qua cron; nếu không kiểm soát, Docker có thể ngốn 20–40 GB dung lượng đĩa trong một tháng

Tóm Tắt

image is being used by stopped container có nghĩa là vẫn còn bản ghi container trên đĩa đang giữ tham chiếu đến image đó. Cách sửa: docker rm <container_id>, rồi docker rmi <image>. Cần dọn một đống container? docker container prune rồi docker image prune giải quyết xong trong hai lệnh.

Related Error Notes