Chuyển đến nội dung chính

Xóa Image Docker: Cách loại bỏ Image không dùng và "dangling"

Hướng dẫn này chỉ cho bạn chính xác cách xóa Docker image an toàn và hiệu quả để thu hồi dung lượng, tránh rác build và ngăn lỗi liên quan đến lưu trữ!
· 10 phút đọc

Khám phá cùng AI

Bạn dùng Docker và thường xuyên hết dung lượng đĩa? Bạn không đơn độc đâu.

Docker image là nền tảng tạo nên container, nhưng chúng có thể nhanh chóng tích tụ và chiếm nhiều dung lượng. Kích thước image có thể từ vài MB đến vài GB, nên việc dọn dẹp định kỳ là cần thiết để hệ thống vận hành tối ưu.

Tin vui là Docker cung cấp vài lệnh giúp bạn loại bỏ image không cần thiết và thu hồi dung lượng. Hiểu các lệnh này và khi nào nên dùng sẽ giúp bạn nói lời tạm biệt với các cảnh báo thiếu bộ nhớ lưu trữ.

Trong bài hướng dẫn này, tôi sẽ đưa bạn qua nhiều cách xóa Docker image, cách xử lý lỗi thường gặp khi xóa, và chia sẻ các thực tiễn tốt để duy trì môi trường Docker sạch sẽ.

>Hoàn toàn mới với Docker? Hướng dẫn thực hành về container này sẽ giúp bạn bắt đầu trong chớp mắt.

Docker Image là gì?

Docker image là một gói phần mềm nhẹ, độc lập và có thể thực thi, chứa mọi thứ cần để chạy một ứng dụng - mã nguồn, runtime, thư viện, biến môi trường, và tệp cấu hình. 

Hãy hình dung nó như ảnh chụp nhanh hay mẫu dùng để tạo container.

>Docker không chỉ dành cho Kỹ sư Phần mềm - Các Nhà khoa học Dữ liệu cũng rất ưa chuộng!

Docker image được xây dựng theo lớp, mỗi lớp biểu diễn một tập thay đổi đối với hệ thống tệp. Khi bạn pull một image từ Docker Hub hoặc xây dựng bằng Dockerfile, bạn thực chất đang tải về hoặc tạo ra một chồng lớp phối hợp với nhau. Các lớp này được cache giúp việc build và chia sẻ image hiệu quả hơn, nhưng đồng thời cũng tiêu tốn dung lượng lưu trữ trên máy của bạn.

Image trở nên đặc biệt gây phiền toái khi bạn phát triển ứng dụng tích cực. Bạn thường xuyên build lại image với thay đổi nhỏ, tạo nhiều phiên bản để kiểm thử, và pull các phụ thuộc mà có thể không bao giờ được tự động dọn dẹp. 

Chỉ trong chốc lát, bạn có hàng chục hay hàng trăm image ngốn hàng gigabyte không gian SSD quý giá - và có hạn.

>Nếu bạn làm về Khoa học Dữ liệu và Máy học, bạn nên biết 12 Docker image này.

Tại sao nên xóa Docker image?

Nói đơn giản, Docker image có thể “ăn” dung lượng cực kỳ mạnh, và dung lượng đĩa của bạn là hữu hạn.

Xóa Docker image không cần thiết mang lại nhiều lợi ích quan trọng:

  • Trước hết, nó thu hồi dung lượng lưu trữ, đặc biệt quan trọng nếu bạn làm việc trên laptop dung lượng hạn chế hoặc môi trường CI/CD có ràng buộc lưu trữ. Bằng cách nào đó, lỗi "No space left on device" luôn xuất hiện đúng lúc tệ nhất.
  • Dọn dẹp image cũng giúp loại bỏ phiên bản lỗi thời có thể gây nhầm lẫn cho developer hoặc quy trình triển khai. Không gì tệ hơn việc vô tình dùng image cũ chỉ vì thẻ latest trỏ nhầm.
  • Ngoài ra, danh sách image lộn xộn khiến bạn khó xác định thứ thật sự cần. Khi chạy docker images và thấy đầy màn hình các repository, tag, và ID, việc tìm đúng image sẽ tốn thời gian. Dọn dẹp thường xuyên giúp môi trường làm việc gọn gàng và đầu ra lệnh dễ đọc hơn. Đây là cải thiện nhỏ về chất lượng trải nghiệm nhưng rất đáng giá theo thời gian.

Tiếp theo, tôi sẽ chỉ bạn vài cách tiếp cận để xóa Docker image.

Xóa Docker Image

Giờ bạn đã hiểu Docker image là gì và vì sao cần quản lý chúng, hãy đi vào quy trình xóa thực tế. 

Docker cung cấp vài lệnh giúp bạn quản lý image, từ liệt kê đến xóa những thứ không cần.

Kiểm tra Docker image hiện có

Trước khi xóa, bạn cần biết thứ gì đang chiếm dung lượng trên hệ thống. Lệnh docker images là bước đầu trong quy trình dọn dẹp.

docker images

Lệnh này liệt kê toàn bộ Docker image cùng các thông tin hữu ích như:

  • Tên repository
  • Tag
  • ID image
  • Ngày tạo 
  • Kích thước

Hình 1 - Các Docker image hiện có

Hình 1 - Các Docker image hiện có

Nhìn vào cột kích thước có thể khiến bạn “giật mình”. Như thấy ở Hình 1, image Oracle database chiếm hơn 15GB!

Nếu muốn sắp xếp image theo kích thước để tìm “thủ phạm” chiếm chỗ lớn nhất:

docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -h

Hình 2 - Các Docker image được sắp theo kích thước

Hình 2 - Các Docker image được sắp theo kích thước

Đây là dạng tổng quan gọn hơn vì không bao gồm mọi thuộc tính của image.

Xóa một Docker image cụ thể

Khi đã xác định được image không cần, bạn có thể xóa từng cái một bằng lệnh docker rmi (viết tắt của "remove image").

Bạn có thể xóa theo ID hoặc theo cặp repository:tag:

# Xóa theo ID image
docker rmi 4e7024df2f20

# Xóa theo repository:tag
docker rmi nginx:latest

Hình 3 - Hai cách xóa từng Docker image

Hình 3 - Hai cách xóa từng Docker image

Cũng cần lưu ý rằng Docker sẽ không cho phép xóa image đang được container sử dụng. Bạn sẽ gặp thông báo lỗi như sau:

Hình 4 - Cố gắng xóa Docker image đang được sử dụng

Hình 4 - Cố gắng xóa Docker image đang được sử dụng

Nếu gặp trường hợp này, bạn cần dừng và xóa các container phụ thuộc trước khi xóa image, hoặc dùng tùy chọn force (tôi sẽ đề cập sau).

Xóa nhiều Docker image

Xóa từng image một có thể mất công, đặc biệt khi dọn dẹp lớn. May mắn là Docker cho phép xóa nhiều image chỉ với một lệnh.

Bạn có thể cung cấp danh sách ID image, cách nhau bởi dấu cách:

docker rmi postgres:latest mariadb:latest

Hình 5 - Xóa nhiều Docker image

Hình 5 - Xóa nhiều Docker image

Hoặc, cho các tình huống nâng cao, bạn kết hợp docker images với lọc và pipe. Ví dụ sau sẽ xóa tất cả image có thẻ latest:

docker rmi $(docker images --filter=reference="*:latest" -q)

Hình 6 - Xóa tất cả Docker image có một tag cụ thể

Hình 6 - Xóa tất cả Docker image có một tag cụ thể

Tất nhiên, ngoại trừ các image đang được container chạy sử dụng.

Hãy cẩn trọng với các lệnh xóa hàng loạt, vì chúng không hỏi xác nhận. Luôn kiểm tra kỹ tiêu chí lọc trước khi nhấn Enter.

Xóa image "dangling" và image không dùng

Khi bạn rebuild một image, Docker tạo lớp mới cho phần thay đổi và tái sử dụng lớp cache cho phần không đổi. Các lớp riêng của phiên bản trước trở thành "dangling" – tồn tại trên đĩa nhưng không thuộc bất kỳ image đã đặt tên nào.

Bạn có thể xác định image dangling với:

docker images -f "dangling=true"

Hình 7 - Liệt kê Docker image dangling

Hình 7 - Liệt kê Docker image dangling

Giờ hãy chạy lệnh prune để xóa tất cả cùng lúc:

docker image prune

Hình 8 - Dọn dẹp image bằng prune

Hình 8 - Dọn dẹp image bằng prune

Lệnh này sẽ yêu cầu xác nhận trước khi tiếp tục. Nếu bạn chắc chắn muốn xóa tất cả:

docker image prune -f

Để dọn dẹp mạnh tay hơn, bạn có thể xóa cả image dangling và image không dùng (không được container nào sử dụng):

docker image prune -a

Hình 9 - Xóa tất cả image không dùng

Hình 9 - Xóa tất cả image không dùng

Lệnh cuối này có thể giải phóng đáng kể dung lượng, nhưng hãy dùng cẩn trọng, vì nó sẽ xóa mọi image không được container đang chạy hoặc đã dừng tham chiếu.

>Lệnh Docker Prune chính xác là gì? Chúng tôi có một bài viết riêng với đầy ví dụ.

Giờ bạn đã biết cách xóa Docker image, hãy cùng xem một số lỗi thường gặp và cách xử lý.

Xử lý lỗi khi xóa Docker Image

Giống như mọi thứ trong phát triển phần mềm, đôi lúc bạn sẽ gặp lỗi khi cố xóa Docker image. 

Hầu hết các lỗi này xuất hiện là có lý do tốt — cơ chế bảo vệ của Docker nhằm ngăn bạn vô tình phá vỡ thứ quan trọng. Hãy cùng xem các lỗi thường gặp và cách khắc phục.

Lỗi: Image đang được container sử dụng

Lỗi phổ biến nhất khi xóa Docker image sẽ trông như thế này:

Error response from daemon: conflict: unable to delete 64ba095c0f0e (cannot be forced) - image is being used by running container 0284660ca006

Điều này xảy ra vì kiến trúc Docker có mối quan hệ phụ thuộc chặt giữa container và image. Container về bản chất là một thể hiện đang chạy của image với một lớp ghi riêng ở trên. 

Vì sao Docker ngăn việc xóa? Đơn giản — nếu bạn xóa image khi container dựa trên nó vẫn đang chạy, container đó sẽ sập ngay. Ngay cả container đã dừng cũng vẫn tham chiếu image cha vì có thể được khởi động lại sau này.

Để xóa image như vậy, trước hết hãy liệt kê tất cả container (kể cả đã dừng) dùng image đó:

docker ps -a --filter ancestor=64ba095c0f0e

Hình 10 - Tất cả container đang dùng image

Hình 10 - Tất cả container đang dùng image

Sau đó bạn có thể dừng tất cả container:

docker stop 0284660ca006

Hình 11 - Dừng container

Hình 11 - Dừng container

Tiếp theo, xóa các container đã dừng:

docker rm 0284660ca006

Hình 12 - Xóa container

Hình 12 - Xóa container

Cuối cùng, dùng lệnh rmi quen thuộc để xóa image:

docker rmi 64ba095c0f0e

Hình 13 - Xóa Docker image

Hình 13 - Xóa Docker image

Hoặc, nếu thích gói gọn trong một lệnh shell, dùng lệnh này:

docker ps -a --filter ancestor=090040f97aa1 -q | xargs docker rm -f && docker rmi 090040f97aa1

Hình 14 - Thực hiện mọi thứ trong một lệnh shell

Hình 14 - Thực hiện mọi thứ trong một lệnh shell

Dễ hơn nhiều, phải không?

Buộc xóa Docker image

Nếu bạn hoàn toàn chắc chắn muốn xóa image bất chấp phụ thuộc, Docker cung cấp cờ -f hoặc --force:

docker rmi -f 64ba095c0f0e

Hình 15 - Buộc xóa Docker image

Hình 15 - Buộc xóa Docker image

Tùy chọn force cho Docker biết phải xóa image ngay cả khi nó đang được container hoặc image khác tham chiếu. 

Tuy nhiên, nó sẽ không xóa image đang được container chạy tham chiếu.

Buộc xóa nên là lựa chọn cuối cùng, như khi debug chính Docker hoặc khi bạn chắc chắn phụ thuộc có thể phá vỡ an toàn. Trong môi trường production, gần như không bao giờ là lựa chọn đúng.

Hãy nhớ, các kiểm soát phụ thuộc của Docker tồn tại có lý do. Làm việc thuận theo chúng sẽ mang lại trải nghiệm Docker ổn định và dễ dự đoán hơn.

Thực tiễn tốt để quản lý Docker Image

Quản lý Docker image không phải việc làm một lần - đó là trách nhiệm liên tục. 

Thiết lập thói quen tốt và tuân theo thực tiễn chuẩn sẽ giúp bạn tránh các đợt dọn dẹp khẩn cấp khi dung lượng đĩa bất ngờ về 0. Trong phần này, tôi sẽ đưa ra vài chiến lược giúp bạn duy trì môi trường Docker sạch.

>Đang tìm hướng dẫn đầy đủ để học Docker? hướng dẫn cho chuyên gia dữ liệu của chúng tôi là điểm bắt đầu tốt.

Dọn dẹp định kỳ

Giống như bạn không để chén bát chất đống hàng tuần, bạn cũng không nên để Docker image không dùng tích tụ vô thời hạn trên hệ thống.

Lịch bảo trì định kỳ là cách đơn giản nhất để ngăn image phình to. Tùy mức độ sử dụng Docker, có thể là hàng tuần, hàng tháng, hoặc hàng quý. 

Trong các phiên dọn dẹp này, bạn nên:

  1. Xem lại image với docker images và xác định đối tượng cần xóa.
  2. Kiểm tra các image bạn không nhận ra hoặc ít dùng gần đây.
  3. Tìm các phiên bản trùng lặp của cùng một ứng dụng.
  4. Xóa image không cần bằng các lệnh đã đề cập.

Nhiều đội phát triển cũng tích hợp dọn dẹp image vào pipeline CI/CD. Ví dụ, bạn có thể cấu hình Jenkins hoặc GitHub Actions để tự động dọn các image build cũ hơn một khoảng thời gian nhất định.

Lệnh sau sẽ chỉ hiển thị các image cũ hơn 30 ngày:

docker images --format "{{.ID}}\t{{.CreatedAt}}" | awk '$2 < "'$(date -d '30 days ago' +'%Y-%m-%d')'"' | cut -f1

Sử dụng dọn dẹp image (pruning)

Docker cung cấp các lệnh prune tích hợp có thể tự động hóa phần lớn công việc dọn dẹp thủ công.

Lệnh docker system prune xóa tất cả container đã dừng, image dangling, và network không dùng trong một lần:

docker system prune

Để dọn dẹp mạnh hơn, đồng thời xóa các image không dùng:

docker system prune -a

Bạn còn có thể thu hồi dung lượng từ build cache:

docker builder prune

Các lệnh này rất phù hợp để viết script. Dưới đây là ví dụ script dọn dẹp đơn giản bạn có thể chạy định kỳ:

#!/bin/bash
# Dừng tất cả container
docker stop $(docker ps -q)

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

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

# Hiển thị mức sử dụng đĩa còn lại
docker system df

Hình 16 - Script tự động dọn dẹp Docker

Hình 16 - Script tự động dọn dẹp Docker

Chỉ cần nhớ dùng cờ -f một cách cẩn trọng trong script tự động, vì nó bỏ qua yêu cầu xác nhận.

Giữ phiên bản image có tổ chức

Chiến lược tagging tốt sẽ giúp giảm thiểu tích tụ Docker image không cần thiết.

Thay vì luôn dùng thẻ latest (có thể trở nên mơ hồ theo thời gian), hãy cân nhắc các cách sau:

  • Dùng phiên bản semver cho image:
myapp:1.0.0
myapp:1.0.1
myapp:1.1.0
  • Bao gồm thông tin build trong tag:
myapp:build-2025-04-06
myapp:commit-a7f3d9e
  • Thêm hậu tố môi trường hoặc mục đích:
myapp:1.0.0-dev
myapp:1.0.0-test
myapp:1.0.0-prod

Với đội ngũ lớn, hãy cân nhắc áp dụng chính sách registry cho Docker image để tự động gom rác (garbage-collect) image cũ sau một thời gian. Cả Docker Hub và các registry riêng như Harbor đều có tính năng quản lý vòng đời image.

Bằng cách kết hợp các thực tiễn này – dọn dẹp định kỳ, prune tự động, và tagging có tổ chức – bạn sẽ duy trì môi trường Docker lành mạnh hơn nhiều và tránh được lỗi “no space left on device” đáng sợ.

Tổng kết về xóa Docker Image

Nếu bạn là developer làm việc với container, quản lý Docker image đúng cách là kỹ năng bắt buộc phải có.

Sức mạnh của Docker đến từ khả năng cô lập và đóng gói ứng dụng hiệu quả, nhưng lợi thế này có thể nhanh chóng trở thành bất lợi nếu không bảo trì đúng cách.

Bạn đã hiểu vì sao Docker image theo thời gian có thể gây vấn đề, ngốn dung lượng đĩa quý giá và làm bừa bộn môi trường phát triển. Bạn đã thấy các lệnh để kiểm tra và xóa image, từ nhắm mục tiêu cụ thể với docker rmi đến dọn dẹp hàng loạt bằng các lệnh prune. Bạn cũng đã thấy các lỗi thường gặp trong quá trình xóa và cách khắc phục.

Nếu bạn muốn học thêm về Docker và container hóa, các khóa học sau nên là điểm dừng tiếp theo của bạn:

FAQs

Tôi có thể khôi phục Docker image sau khi xóa không?

Không. Khi bạn xóa Docker image bằng docker rmi, không thể khôi phục trừ khi bạn có bản sao lưu hoặc có thể pull lại từ registry. Luôn đảm bảo bạn xóa đúng image, đặc biệt trong môi trường production. Với image bạn build cục bộ, có thể cần build lại từ Dockerfile.

Docker image "dangling" là gì và làm sao để xóa?

Image dangling là các lớp không thuộc bất kỳ image có tag nào, thường được tạo khi bạn rebuild image nhiều lần. Xác định chúng với docker images -f "dangling=true" và xóa cùng lúc bằng docker image prune.

Làm sao nhanh chóng giải phóng dung lượng từ Docker?

Cách nhanh nhất để thu hồi dung lượng là dùng docker system prune -a, lệnh này xóa tất cả container đã dừng, network không dùng, image dangling và image không dùng. Hãy cẩn thận vì nó xóa mọi image không được bất kỳ container nào sử dụng.

Tôi nên dọn dẹp Docker image bao lâu một lần?

Tần suất phụ thuộc vào mức độ bạn dùng Docker. Với môi trường phát triển build image thường xuyên, nên dọn hàng tuần. Với hệ thống ít hoạt động hơn, dọn hàng tháng hoặc hàng quý là đủ. Hãy cân nhắc thiết lập script dọn dẹp tự động để nhất quán.

Sự khác biệt giữa xóa (removing) và dọn dẹp (pruning) Docker image là gì?

Xóa (removing) là nhắm vào các image cụ thể do bạn chọn, trong khi prune dọn dẹp tự động tất cả image không dùng hoặc dangling dựa trên tiêu chí nhất định.

Dario Radečić

Tác giả

Dario Radečić

Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.

Chủ đề

Liên quan