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.
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ế.
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.
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:
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:
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:
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:
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:
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:
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.
Bạn sẽ thấy đầu ra tương tự như sau trong terminal:
Hình 7 - Thông điệp đầu ra khi prune image
Sau đó, không còn image nào trong Docker Desktop:
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:
Sau khi chạy, bạn sẽ thấy đầu ra tương tự sau đây:
Hình 10 - Thông điệp đầu ra khi prune volume
Giờ thì không còn volume nào:
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ó:
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:
Bất kỳ network nào gắn với các container từng chạy trước đó giờ đã biến mất:
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:
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:
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:
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.
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Được hỗ trợ bởi
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ả:
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>Được hỗ trợ bởi
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:
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.
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.
Tìm hiểu về Docker và khám phá tầm quan trọng của nó trong bộ công cụ của chuyên gia dữ liệu. Tìm hiểu về Docker container, Docker image và nhiều nội dung khác.
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 prunelà dọn dẹp sự lộn xộn đó và thu hồi bộ nhớ.Tuy vậy,
docker prunecò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
prunecho 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:-ahoặc--allxó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).--filtercho phép bạn chỉ định giá trị lọc.-fhoặc--forcebỏ qua lời nhắc xác nhận.--volumescũng prune các volume ẩn danh cùng với container, network, image và build cache.Theo mặc định,
docker system prunesẽ nhắc bạn xác nhận vì đây là thao tác có thể gây phá hủy: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:
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:--filtercho phép bạn chỉ định cặp khóa-giá trị để kiểm soát container nào bị xóa.-fhoặc--forcebỏ qua lời nhắc xác nhận.Đây là danh sách các container không chạy:
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: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:
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:
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 prunexó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
-ahoặc--allxóa tất cả image không dùng thay vì chỉ image dangling.--filtercho phép bạn chỉ định cặp khóa-giá trị để kiểm soát image nào bị xóa.-fhoặc--forcebỏ 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:
Hình 6 - Danh sách Docker image
Để xóa tất cả chỉ với một lệnh, chạy:
Bạn sẽ thấy đầu ra tương tự như sau trong terminal:
Hình 7 - Thông điệp đầu ra khi prune image
Sau đó, không còn image nào trong Docker Desktop:
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 prunexó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:
-ahoặc--allxóa tất cả volume không dùng thay vì chỉ volume ẩn danh.--filtercho phép bạn chỉ định cặp khóa-giá trị để kiểm soát volume nào bị xóa.-fhoặc--forcebỏ 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:Hình 9 - Danh sách Docker volume
Lệnh sau sẽ xóa tất cả volume cục bộ:
Sau khi chạy, bạn sẽ thấy đầu ra tương tự sau đây:
Hình 10 - Thông điệp đầu ra khi prune volume
Giờ thì không còn volume nào:
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 prunexó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:
--filtercho phép bạn chỉ định cặp khóa-giá trị để kiểm soát network nào bị xóa.-fhoặc--forcebỏ 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ó:
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:
Sau khi thực thi, bạn sẽ thấy đầu ra như sau:
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:
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 prunegiú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 prunean 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 prunechỉ xóa image dangling, vàdocker volume prunechỉ 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 -fsẽ 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
prunenà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:
Bạn sẽ thấy đầu ra tương tự như sau:
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:
Đầu ra sẽ có cấu trúc tương tự như trên:
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:
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
prunethườ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 prunetrong 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 prunetrong môi trường sản xuất, luôn kiểm tra tài nguyên hệ thống bằngdocker 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 prunebao 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 prunevớ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:
Khắc phục sự cố với Docker Prune
Các lệnh
docker prunelà 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:
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):
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ả:
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:
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 prunelà 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 lstrướ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: