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

Docker Prune: Hướng dẫn đầy đủ với ví dụ thực hành

Xóa an toàn container, image, volume và network không dùng chỉ với một lệnh shell. Giữ hệ thống gọn gàng và thu hồi dung lượng đĩa bằng cách loại bỏ tài nguyên Docker không sử dụng.
· 11 phút đọc

Khám phá cùng AI

Nếu bạn làm việc với Docker hằng ngày, bạn sẽ biết nó có thể ngốn dung lượng đĩa nhanh thế nào.  

Theo thời gian, hệ thống sẽ tích tụ các image, container, volume và network không dùng đến. Chúng hầu như nằm im, chiếm dụng bộ nhớ quý giá và có thể cản trở bạn làm việc với dự án hiện tại. May mắn là Docker có sẵn các lệnh dọn dẹp giúp loại bỏ tài nguyên không cần thiết một cách dễ dàng.  

Những lệnh dọn dẹp này thuộc nhóm docker prune, và hôm nay, bạn sẽ tìm hiểu tất cả về chúng. Chúng sẽ nhanh chóng trở thành giải pháp ưa thích để giải phóng dung lượng đĩa.  

Hãy bắt đầu với phần tổng quan ngắn trước khi đi vào các ví dụ thực tế.  

Bạn mới làm quen với Docker? Xem bài hướng dẫn về học Docker từ con số 0 cho chuyên gia dữ liệu để bắt kịp nhanh chóng.  

Docker Prune là gì?  

Thuật ngữ "Docker Prune" thường đề cập đến một tập hợp lệnh được thiết kế để giúp bạn loại bỏ tài nguyên Docker không dùng và không cần thiết.  

Theo thời gian, đặc biệt khi bạn làm nhiều dự án, bạn sẽ tạo vô số image, chạy container, và thiết lập volume cũng như network. Tất cả những thứ này tích tụ trên hệ thống, chiếm một lượng lớn dung lượng đĩa. Mục đích của docker prune là dọn dẹp sự lộn xộn đó và thu hồi bộ nhớ.  

Tuy vậy, docker prune còn nhiều điều hơn bạn nghĩ.  

Nó không chỉ là một lệnh duy nhất. Thực ra bạn có thể chạy một lệnh, nhưng đôi khi bạn cần kiểm soát chi tiết hơn đối với những gì sẽ bị xóa. Đó là lúc bài viết này phát huy tác dụng. Nó sẽ cho bạn thấy cách quản lý việc prune hiệu quả, đảm bảo bạn chỉ xóa đúng thứ mình định xóa, và cách thực hành trong môi trường an toàn để tránh vô tình xóa dữ liệu quan trọng.  

Cũng cần lưu ý rằng các lệnh prune chỉ xóa tài nguyên không được sử dụng hoạt động. Image, volume và network được tham chiếu bởi container đang chạy sẽ không bị xóa. Nói cách khác, việc prune sẽ không ảnh hưởng đến tác vụ đang hoạt động.  

Ở phần tiếp theo, chúng tôi sẽ hướng dẫn bạn qua các loại lệnh prune khác nhau và giải thích cách chúng phù hợp với quy trình làm việc của bạn.  

Muốn thêm Docker vào CV hoặc portfolio? 10 ý tưởng dự án Docker này sẽ giúp bạn sẵn sàng đi làm.

Toàn bộ lệnh Docker Prune với ví dụ thực hành  

Docker cung cấp nhiều lệnh prune cho phép bạn dọn dẹp tài nguyên không dùng riêng lẻ hoặc tất cả cùng lúc. Ở phần này, bạn sẽ tìm hiểu về chúng—qua cả lý thuyết lẫn ví dụ thực hành.  

docker system prune  

Đây là lệnh toàn diện nhất để thu hồi dung lượng đĩa. Nó xóa tất cả container, network, image không dùng và bộ nhớ đệm build trong một thao tác.  

Nếu bạn muốn cách nhanh chóng để giải phóng dung lượng chỉ với một lệnh, đây là lựa chọn nên dùng.  

Bạn có thể truyền các tùy chọn cho lệnh docker system prune:  

  • -a hoặc --all xóa tất cả image không dùng thay vì chỉ những image "dangling" (image không được gắn thẻ hoặc không được container nào tham chiếu).  
  • --filter cho phép bạn chỉ định giá trị lọc.  
  • -f hoặc --force bỏ qua lời nhắc xác nhận.  
  • --volumes cũng prune các volume ẩn danh cùng với container, network, image và build cache.  

Theo mặc định, docker system prune sẽ nhắc bạn xác nhận vì đây là thao tác có thể gây phá hủy:  

Docker system prune confirmation prompt

Hình 1 - Lời nhắc xác nhận docker system prune

Để bỏ qua lời nhắc và xóa tất cả image, container, network và volume không dùng chỉ với một lệnh, chạy:  

docker system prune -a -f --volumes

Remove everything with a single docker system prune command

Hình 2 - Xóa mọi thứ chỉ với một lệnh docker system prune

Nhưng nếu bạn cần kiểm soát chi tiết hơn thì sao? Hãy cùng tìm hiểu ngay sau đây.

docker container prune

Nói ngắn gọn, lệnh này xóa tất cả container đã dừng.

Container đã dừng vẫn tồn tại trên hệ thống cho đến khi được xóa thủ công. Chúng có thể chiếm dung lượng đĩa và khó phát hiện trừ khi bạn dùng công cụ như Bảng điều khiển Docker Desktop.

Giống docker system prune, lệnh này hỗ trợ các tùy chọn:

  • --filter cho phép bạn chỉ định cặp khóa-giá trị để kiểm soát container nào bị xóa.
  • -f hoặc --force bỏ qua lời nhắc xác nhận.

Đây là danh sách các container không chạy:

List of non-running containers

Hình 3 - Danh sách container không chạy

Để xóa code-server (và bất kỳ container đã dừng nào khác), chạy:

docker container prune -f

Lệnh này sẽ không nhắc xác nhận, và sau vài giây, bạn sẽ thấy đầu ra như sau:

Container pruning output message

Hình 4 - Thông điệp đầu ra khi prune container

Và ngay sau đó, không còn container đã dừng nào nữa:

List of non-running containers (2)

Hình 5 - Danh sách container không chạy (2)

Giờ hãy xử lý các image không dùng.

docker image prune

Tương tự lệnh trước, docker image prune xóa các image không dùng.

Theo mặc định, nó chỉ xóa các image "dangling"—image không được gắn thẻ và không gắn với container nào. Bạn có thể dùng cờ tùy chọn để xóa tất cả image không dùng, không chỉ các image dangling.

Dưới đây là danh sách tùy chọn có sẵn

  • -a hoặc --all xóa tất cả image không dùng thay vì chỉ image dangling.
  • --filter cho phép bạn chỉ định cặp khóa-giá trị để kiểm soát image nào bị xóa.
  • -f hoặc --force bỏ qua lời nhắc xác nhận.

Giờ hãy xem nó hoạt động!

Đây là danh sách image hiện có trên hệ thống:

List of Docker images

Hình 6 - Danh sách Docker image

Để xóa tất cả chỉ với một lệnh, chạy:

docker image prune -a -f

Bạn sẽ thấy đầu ra tương tự như sau trong terminal:

Image pruning output message

Hình 7 - Thông điệp đầu ra khi prune image

Sau đó, không còn image nào trong Docker Desktop:

List of Docker images (2)

Hình 8 - Danh sách Docker image (2)

Tiếp theo, xử lý các volume không dùng.

docker volume prune

Đúng như tên gọi, lệnh docker volume prune xóa tất cả volume cục bộ không dùng. Nói cách khác, nó xóa các volume không được container nào tham chiếu.

Theo mặc định, lệnh chỉ xóa volume ẩn danh - các volume không tên do Docker tạo khi container khởi động. Để xóa volume được đặt tên tường minh, bạn cần truyền thêm tùy chọn.

Các tùy chọn bạn có thể dùng:

  • -a hoặc --all xóa tất cả volume không dùng thay vì chỉ volume ẩn danh.
  • --filter cho phép bạn chỉ định cặp khóa-giá trị để kiểm soát volume nào bị xóa.
  • -f hoặc --force bỏ qua lời nhắc xác nhận.

Trên hệ thống của chúng tôi, có một volume do người dùng tạo từ tệp docker-compose.yml:

List of Docker volumes

Hình 9 - Danh sách Docker volume

Lệnh sau sẽ xóa tất cả volume cục bộ:

docker volume prune -a -f

Sau khi chạy, bạn sẽ thấy đầu ra tương tự sau đây:

Volume pruning output message

Hình 10 - Thông điệp đầu ra khi prune volume

Giờ thì không còn volume nào:

List of Docker volumes (2)

Hình 11 - Danh sách Docker volume (2)

Cuối cùng, hãy xem cách xóa network không dùng.

docker network prune

Khi các container Docker giao tiếp với nhau, chúng thường dùng network do người dùng định nghĩa. Tuy nhiên, các network này thường vẫn còn trên hệ thống sau khi các container đó bị xóa.

Lệnh docker network prune xóa các network không còn được container nào sử dụng.

Giống các lệnh prune khác, nó có một vài tùy chọn:

  • --filter cho phép bạn chỉ định cặp khóa-giá trị để kiểm soát network nào bị xóa.
  • -f hoặc --force bỏ qua lời nhắc xác nhận.

Không giống image, container hay volume, bạn không thể xem trực quan các network qua Docker Desktop, nên bạn sẽ cần làm việc trên dòng lệnh. Dưới đây là danh sách network hiện có:

List of Docker networks

Hình 12 - Danh sách Docker network

Để xóa tất cả network không gắn với cài đặt Docker mặc định, chạy:

docker network prune -a -f

Sau khi thực thi, bạn sẽ thấy đầu ra như sau:

Network pruning output message

Hình 13 - Thông điệp đầu ra khi prune network

Bất kỳ network nào gắn với các container từng chạy trước đó giờ đã biến mất:

List of Docker networks

Hình 14 - Danh sách Docker network

Tuy nhiên, lưu ý rằng ba network còn lại là cần thiết để Docker hoạt động đúng và không thể xóa.

Vậy là xong phần sử dụng cơ bản các lệnh docker prune! Tiếp theo, chúng ta sẽ nói về các chủ đề nâng cao như sử dụng các lệnh này an toàn và thực tiễn tốt nhất cho môi trường sản xuất và nhạy cảm.

Sử dụng Docker Prune một cách an toàn  

Các lệnh docker prune giúp nhanh chóng thu hồi dung lượng đĩa, nhưng phải sử dụng thận trọng, đặc biệt trong môi trường sản xuất.  

Vô tình xóa container, image hoặc volume quan trọng có thể gây mất dữ liệu và gián đoạn quy trình quan trọng. Để tránh điều này, tốt nhất là hiểu rõ những gì sẽ bị xóa trước khi chạy bất kỳ lệnh prune nào.  

Phần này giải thích những lưu ý chính khi chạy docker prune an toàn.  

Hiểu rõ những gì sẽ bị xóa  

Các lệnh prune được thiết kế để chỉ xóa tài nguyên không được sử dụng hoạt động.  

Ví dụ, docker image prune chỉ xóa image dangling, và docker volume prune chỉ xóa volume không gắn với bất kỳ container nào. Tuy nhiên, thêm các tùy chọn như -a -f sẽ xóa tất cả image hoặc volume mà không cần nhắc xác nhận.  

Ngoài ra, trong môi trường phức tạp, các phụ thuộc rất dễ bị bỏ sót, vì vậy việc kiểm tra kỹ trước khi prune luôn là thực hành tốt.  

Trước khi chạy bất kỳ lệnh prune nào, bạn nên kiểm tra hệ thống để xem những tài nguyên nào đang được sử dụng. Có nhiều cách để làm điều này, và chúng ta sẽ xem những cách phổ biến nhất trong phần này.  

Dùng lệnh này để xem tất cả container, bao gồm cả container đã dừng:  

docker ps -a

Bạn sẽ thấy đầu ra tương tự như sau:

List of all Docker containers

Hình 15 - Danh sách tất cả Docker container

Tương tự, dùng lệnh này để liệt kê tất cả image, bao gồm cả image không dùng:  

docker images

Đầu ra sẽ có cấu trúc tương tự như trên:  

List of all Docker images

Hình 16 - Danh sách tất cả Docker image

Để kiểm tra volume, chạy lệnh này để liệt kê tất cả volume:  

docker volume ls

List of all Docker volumes

Hình 17 - Danh sách tất cả Docker volume

Hãy xem xét kỹ các đầu ra này để đảm bảo không tài nguyên quan trọng nào bị xóa nhầm.  

Chạy thử (dry run) để an toàn  

Đáng tiếc là Docker vẫn chưa có tùy chọn tích hợp để chạy thử lệnh prune, dù đã được yêu cầu từ nhiều năm trước.  

Vì vậy, bạn phải tự kiểm tra tài nguyên thủ công bằng các lệnh liệt kê ở phần trước trước khi chạy lệnh prune.  

Nếu bạn làm việc trong môi trường nhạy cảm nơi tính bền bỉ của dữ liệu là tối quan trọng, bạn nên luôn tạo bản sao lưu trước khi chạy các lệnh prune ảnh hưởng đến volume.  

Tất nhiên, đây chỉ là các biện pháp phòng ngừa, nhưng chúng tôi hy vọng sẽ sớm thấy tùy chọn dry-run được bổ sung.

Thực tiễn tốt nhất cho Docker Prune  

Để giữ môi trường Docker gọn gàng, điều quan trọng là chạy các lệnh prune thường xuyên—thậm chí tự động hóa chúng.  

Phần này hướng dẫn bạn các thực tiễn tốt nhất để chạy lệnh docker prune trong môi trường sản xuất.  

Sử dụng docker prune thường xuyên  

Theo thời gian, Docker tích tụ các image không dùng, container đã dừng và volume không cần thiết—tất cả đều tiêu tốn đáng kể dung lượng đĩa.  

Chạy các lệnh prune định kỳ giúp môi trường sạch sẽ và tránh sử dụng đĩa quá mức. Bạn nên đưa chúng vào lịch bảo trì của mình.  

Mỗi vài tuần là điểm khởi đầu hợp lý, nhưng nếu thiết lập của bạn thường xuyên tạo và xóa container, hãy cân nhắc lịch dày hơn.  

Thận trọng trong môi trường sản xuất  

Mọi công việc trong môi trường sản xuất đều đòi hỏi sự thận trọng cao, và việc prune Docker cũng không ngoại lệ.  

Chỉ một khoảnh khắc lơ là có thể dẫn đến downtime hoặc mất dữ liệu, và bạn chắc chắn không muốn chịu trách nhiệm cho điều đó. Trước khi chạy các lệnh docker prune trong môi trường sản xuất, luôn kiểm tra tài nguyên hệ thống bằng docker ps -a, docker images, và docker volume ls, như đã giải thích ở phần trước.  

Ngoài ra, nên dùng các lệnh prune cụ thể thay vì docker system prune bao trùm mọi thứ, vì sẽ dễ khôi phục hơn nếu có xóa nhầm.  

Tự động hóa docker prune  

Một thực tiễn tốt khác là hợp lý hóa công tác dọn dẹp bằng cách tự động hóa các lệnh docker prune với tác vụ theo lịch.  

Trên Linux, bạn có thể thiết lập cron job để chạy các lệnh theo định kỳ, trong khi trên Windows, bạn có thể dùng Task Scheduler cho tự động hóa tương tự. Điều này giúp hệ thống gọn gàng mà không cần can thiệp thủ công. Tuy nhiên, trong môi trường sản xuất, hãy đảm bảo việc prune tự động không ảnh hưởng đến tác vụ quan trọng.  

Ví dụ, cron job này trên Linux chạy lệnh prune bao trùm mọi thứ vào nửa đêm Chủ Nhật hằng tuần:

0 0 * * 0 docker system prune -a -f

Khắc phục sự cố với Docker Prune  

Các lệnh docker prune là giải pháp hàng đầu để thu hồi dung lượng đĩa, nhưng không phải lúc nào cũng đủ để đảm bảo đủ chỗ cho việc kéo image mới hoặc chạy container mới.  

Ngoài ra, bạn có thể vô tình xóa tài nguyên quan trọng, nên điều cốt yếu là thảo luận về chiến lược khôi phục.  

Cả hai chủ đề sẽ được đề cập trong phần này.  

Gặp vấn đề về dung lượng đĩa  

Docker image có thể rất lớn—gần đây chúng tôi có một image hơn 13GB—và chắc chắn còn những image lớn hơn ngoài kia. Vì vậy, ngay cả sau khi chạy docker prune, bạn vẫn có thể thấy hệ thống thiếu dung lượng đĩa.  

Để xem chính xác bao nhiêu dung lượng đang được sử dụng bởi image, container và volume, chạy lệnh này:  

docker system df

Space used by Docker

Hình 18 - Dung lượng Docker sử dụng

Khi thu hồi dung lượng bằng các lệnh docker prune, hãy thêm cờ -a để xóa tất cả image, volume hoặc container—không chỉ những cái dangling hoặc ẩn danh. Tất nhiên, hãy lưu ý những nhược điểm tiềm ẩn của cách tiếp cận này.  

Nếu vấn đề dung lượng vẫn còn, lựa chọn duy nhất là tăng dung lượng đĩa khả dụng.  

Khôi phục khi xóa nhầm

Khôi phục nói dễ hơn làm—đó là lý do chúng tôi khuyến nghị hiểu rõ những gì sẽ bị xóa khi prune trước khi chạy lệnh thực tế.  

Tuy vậy, nếu bạn rơi vào tình huống vô tình prune các container, image hoặc volume quan trọng, hãy bắt đầu bằng cách kiểm tra log để xác định những gì đã bị xóa.  

Trên macOS, có thể thực hiện bằng hai lệnh sau (tùy chọn cho Windows và Linux):  

pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")'
/usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"

/usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt

Chạy các lệnh này sẽ lưu 30 phút log gần nhất liên quan Docker vào /tmp/logs.txt. Bạn nên kiểm tra các log này để xác định container hoặc image nào đã bị xóa.  

Với image đã xóa, bạn thường có thể kéo lại từ một registry như Docker Hub. Một lệnh như sau thường hiệu quả:  

docker pull <image_name>

Còn với container đã xóa, bạn có thể luôn tạo lại nếu chúng dựa trên image còn tồn tại:  

docker run --name <container_name> <image_name>

Ngoài ra, bạn có thể khôi phục từ bản sao lưu nếu có, có thể dùng để phục hồi cả dữ liệu volume và container. Trong tương lai, hãy cân nhắc dùng công cụ chụp nhanh (snapshot) volume để ngăn mất dữ liệu.  

Tuy nhiên, chiến lược tốt nhất là kiểm tra các tài nguyên sẽ bị xóa trước khi chạy lệnh prune và chỉ tiếp tục khi bạn hoàn toàn chắc chắn nó sẽ không ảnh hưởng đến quy trình làm việc.  

Tổng kết về Docker Prune  

Tóm lại, nhóm lệnh docker prune là cách mạnh mẽ để thu hồi dung lượng đĩa, nhưng đi kèm rủi ro vô tình xóa tài nguyên bạn cần, dẫn đến mất dữ liệu. Rủi ro này càng lớn khi dùng các cờ tùy chọn -a -f, vốn sẽ xóa mọi thứ một cách cưỡng bức.  

Dù vậy, prune vẫn là phương pháp hàng đầu để giữ hệ thống gọn gàng và có tổ chức.  

Bạn chỉ cần thận trọng, đặc biệt trong môi trường sản xuất. Hãy dùng các lệnh như docker ps -a, docker images, và docker volume ls trước khi prune để liệt kê tất cả container, image và volume. Chỉ chạy lệnh prune sau khi bạn chắc chắn chấp nhận xóa các tài nguyên đã liệt kê (giả sử chúng không được container đang chạy sử dụng).  

Nếu bạn muốn tìm hiểu thêm về Docker, container hóa và điều phối container, hãy xem các khóa học này trên DataCamp:

FAQs

Docker prune có an toàn không?

Nhìn chung là có, nhưng cần sử dụng thận trọng. Nó chỉ xóa tài nguyên không được sử dụng, nhưng chạy mà không kiểm tra có thể dẫn tới xóa nhầm, đặc biệt trong môi trường sản xuất. Các cờ bổ sung như -a -f sẽ cưỡng bức xóa tất cả tài nguyên không dùng. 

Sự khác nhau giữa docker prune và docker rm là gì?

docker prune xóa tất cả tài nguyên không dùng của một loại cụ thể, trong khi docker rm được dùng để xóa thủ công các container hoặc image cụ thể.

Docker system prune có xóa mọi thứ không?

Không, docker system prune xóa container, network, image không dùng và build cache, nhưng không xóa volume có tên trừ khi chỉ định cờ --volumes sau lệnh. 

Image dangling trong Docker là gì?

Image "dangling" là image không được gắn thẻ hoặc không được container nào tham chiếu. Đây thường là image trung gian còn sót lại từ quá trình build và có thể xóa an toàn bằng lệnh docker image prune. 

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