Hướng Dẫn Dọn Dẹp Docker: Xóa Ảnh, Container và Volume Không Sử Dụng

Ngày đăng: July 17, 2025

Ubuntu

description image

Xóa Tất Cả Ảnh, Container, Volume và Mạng Không Dùng Hoặc Treo

Docker cung cấp một lệnh duy nhất để dọn dẹp bất kỳ tài nguyên nào — ảnh, container, volume và mạng — mà đang <em>treo</em> (không được gắn tag hoặc không liên kết với container):

docker system prune

Để xóa thêm các container đã dừng và tất cả ảnh không dùng (không chỉ ảnh treo), thêm cờ -a vào lệnh:

docker system prune -a

Xóa Ảnh Docker

Xóa một hoặc nhiều ảnh cụ thể

Sử dụng lệnh docker images với cờ -a để tìm ID của các ảnh bạn muốn xóa. Lệnh này hiển thị tất cả ảnh, kể cả các lớp ảnh trung gian. Khi đã xác định được ảnh muốn xóa, bạn có thể truyền ID hoặc tag cho lệnh docker rmi:

Danh sách:

docker images -a

Xóa:

docker rmi Image Image

Lưu ý: Cờ -a hoặc --all trong lệnh docker images hiển thị tất cả ảnh Docker, kể cả ảnh trung gian không được tag. Theo mặc định, docker images chỉ hiện ảnh có ít nhất một tag. Nhưng có thể tồn tại ảnh không có tag vẫn chiếm dung lượng ổ cứng. Cờ -a giúp xác định các ảnh có thể xóa để tiết kiệm dung lượng. Khi dùng với docker rmi, cờ -f hoặc --force cho phép xóa ảnh không có tag.

Xóa ảnh Docker treo

Ảnh Docker gồm nhiều lớp. Ảnh treo là các lớp không liên quan đến bất kỳ ảnh có tag nào. Chúng không còn tác dụng và chiếm dung lượng. Dùng cờ filter -f với giá trị dangling=true cho lệnh docker images để tìm ảnh treo. Khi chắc chắn muốn xóa, dùng lệnh docker image prune:

Danh sách:

docker images -f dangling=true

Xóa:

docker image prune

Lưu ý: Nếu bạn build ảnh mà không gắn tag, ảnh sẽ nằm trong danh sách ảnh treo vì không liên kết với ảnh được tag. Bạn có thể tránh việc này bằng cách gắn tag khi build hoặc gắn tag sau với lệnh docker tag.

Xóa ảnh theo mẫu

Bạn có thể tìm ảnh theo mẫu bằng cách kết hợp docker imagesgrep. Khi có danh sách như ý, dùng awk truyền ID cho docker rmi. Lưu ý các công cụ grep và awk không phải của Docker và không có sẵn trên mọi hệ thống:

Danh sách:

docker images -a | grep "pattern"

Xóa:

docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi

Xóa tất cả ảnh

Liệt kê tất cả ảnh bằng cờ -a với docker images. Khi chắc chắn muốn xóa tất cả, dùng cờ -q để lấy ID truyền cho docker rmi:

Danh sách:

docker images -a

Xóa:

docker rmi $(docker images -a -q)

Xóa Container

Xóa một hoặc nhiều container cụ thể

Dùng docker ps -a để tìm tên hoặc ID container bạn muốn xóa:

Danh sách:

docker ps -a

Xóa:

docker rm ID_or_Name ID_or_Name

Xóa container khi thoát

Nếu biết trước rằng container không cần giữ sau khi thoát, bạn có thể chạy docker run --rm để tự động xóa container khi nó thoát:

Chạy và Xóa:

docker run --rm image_name

Xóa tất cả container đã thoát

Dùng docker ps -a với filter trạng thái để tìm container có trạng thái exited. Dùng cờ -q để lấy ID truyền cho lệnh docker rm:

Danh sách:

docker ps -a -f status=exited

Xóa:

docker rm $(docker ps -a -f status=exited -q)

Xóa container dùng nhiều filter

Docker cho phép dùng nhiều filter bằng cách lặp cờ filter. Ví dụ muốn xóa các container có trạng thái created hoặc exited:

Danh sách:

docker ps -a -f status=exited -f status=created

Xóa:

docker rm $(docker ps -a -f status=exited -f status=created -q)

Xóa container theo mẫu

Tìm container theo mẫu bằng cách kết hợp docker psgrep. Khi có danh sách, dùng awkxargs truyền ID cho docker rm. Lưu ý các công cụ grep và awk không phải của Docker và không có sẵn trên mọi hệ thống:

Danh sách:

docker ps -a | grep "pattern"

Xóa:

docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm

Dừng và xóa tất cả container

Xem tất cả container với docker ps -a. Khi chắc chắn muốn xóa, dùng cờ -q lấy ID truyền cho docker stopdocker rm:

Danh sách:

docker ps -a

Xóa:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Xóa Volumes

Xóa một hoặc nhiều volume cụ thể

Dùng lệnh docker volume ls để tìm tên volume muốn xóa. Sau đó dùng docker volume rm để xóa:

Danh sách:

docker volume ls

Xóa:

docker volume rm volume_name volume_name

Xóa volume treo

Volume tồn tại độc lập với container, nên khi container bị xóa, volume không tự động xóa. Volume nào không liên kết với container gọi là volume treo. Dùng filter để tìm volume treo bằng docker volume ls -f dangling=true. Nếu muốn xóa toàn bộ volume treo, dùng lệnh docker volume prune:

Danh sách:

docker volume ls -f dangling=true

Xóa:

docker volume prune

Xóa container và volume kèm theo

Nếu bạn tạo volume không đặt tên, bạn có thể xóa nó cùng lúc với container bằng cờ -v. Lưu ý chỉ áp dụng với volume không tên. Khi container xóa thành công, ID container hiển thị, còn volume không tên bị xóa lặng lẽ. Volume có tên vẫn tồn.

Xóa:

docker rm -v container_name

So Sánh docker rm vs docker rmi vs docker prune

Lệnh Mô tả Đối tượng Cờ
docker rm Xóa một hoặc nhiều container Container -f ép buộc xóa, -v xóa volume
docker rmi Xóa một hoặc nhiều ảnh Ảnh -f ép buộc xóa
docker prune Xóa tài nguyên không dùng hoặc treo Ảnh, Container, Volume, Mạng -a xóa tất cả tài nguyên không dùng, -f ép buộc

Lưu ý: Cờ -f dùng để xóa mà không hỏi xác nhận. Cờ -a dùng để xóa tất cả tài nguyên không dùng, bao gồm cả tài nguyên treo.

Lỗi Thường Gặp và Gỡ Rối

Xử lý đồng bộ khi nhiều container chia sẻ volume

Khi nhiều container chia sẻ volume, có thể xảy ra lỗi đồng bộ nhiều luồng, dẫn đến hỏng dữ liệu hoặc hành vi không mong muốn. Các chiến lược xử lý:

  • Dùng Volume có tên: Kiểm soát và quản lý dữ liệu chia sẻ tốt hơn. Ví dụ cấu hình Docker Compose:
version: '3.8'
services:
  app:
    image: myapp
    volumes:
      - myvolume:/app/node_modules
volumes:
  myvolume:
  • Thực hiện khóa tệp: Sử dụng cơ chế khóa tệp, ví dụ flock hoặc lockfile trong mã ứng dụng.
  • Dùng Docker Compose: Quản lý đa container và đồng bộ volume. Ví dụ:
version: '3.8'
services:
  app:
    image: myapp
    volumes:
      - myvolume:/app/node_modules
    depends_on:
      - db
  db:
    image: mydb
    volumes:
      - myvolume:/var/lib/mysql
volumes:
  myvolume:

Gỡ rối vấn đề hiệu năng do lớp ảnh quá nhiều

Lớp ảnh dư thừa gây nghẽn hiệu năng, đặc biệt khi build và deploy. Các bước xử lý:

  • Phân tích lớp ảnh: Dùng docker history <image> xem các lớp:
docker history myapp
  • Tối ưu Dockerfile: Gộp các lệnh RUN nhiều dòng thành một để giảm số lớp, ví dụ:
RUN apt update && apt install -y python3 python3-pip
  • Dùng build đa giai đoạn: Giúp tạo ảnh nhỏ và hiệu quả hơn, chỉ copy những thứ cần thiết.
FROM scratch AS base
WORKDIR /app
COPY go.mod ./
COPY go.sum ./
RUN go mod download

FROM base AS builder
RUN go build -o myapp

FROM scratch
COPY --from=builder /app/myapp .
CMD ["./myapp"]

Sửa lỗi container is running khi cố xóa container đang chạy

Khi xóa container đang chạy, lỗi container is running có thể xảy ra. Cách giải quyết:

  1. Dừng container rồi xóa:
docker stop <container_id>
docker rm <container_id>
  1. Ép buộc xóa ngay trong một lệnh:
docker rm -f <container_id>
  1. Dừng và xóa tất cả container:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
  1. Dùng Docker Compose:
docker-compose down
  1. Nếu dùng Docker Desktop, dùng giao diện GUI để click chuột phải trên container chạy, chọn Stop rồi Remove.

FAQs

  1. Làm sao xóa tất cả container đã dừng?

Dùng:

docker-compose down

Hoặc dùng:

docker system prune -a
  1. docker system prune làm gì?

Xóa tất cả container đã dừng, mạng không được container nào dùng, và nếu có -a thì xóa thêm ảnh không dùng.

  1. Có thể xóa container đang chạy không?

Có, dùng docker rm -f <container_id> để ép buộc xóa.

  1. Làm sao giải phóng dung lượng ổ cứng Docker?

Dùng các lệnh:

  • docker system prune -a
  • docker system prune -a -v
  • docker volume prune -a
  • docker network prune -a
  1. docker rmdocker rmi khác nhau thế nào?

docker rm xóa container, còn docker rmi xóa ảnh.

  1. Làm sao xóa hoàn toàn ảnh Docker?

Dùng:

docker rmi <image-id>
  1. Làm sao xóa ảnh Docker không dùng?

Dùng:

docker image prune

hoặc với tất cả ảnh:

docker image prune --all
  1. Xóa hết ảnh, container, volume, mạng cùng lúc?

Dùng:

docker system prune --all --volumes
  1. Làm sao xoá file trong ảnh Docker?

Chạy container từ ảnh:

docker run -it <image-id> /bin/bash

Xóa file trong container, sau đó commit thành ảnh mới:

docker commit <container-id> <new-image-name>
  1. Xóa tất cả container đã dừng?
docker container prune

hoặc bỏ qua xác nhận:

docker container prune -f
  1. Xóa container cũ theo trạng thái?
docker ps -a --filter "status=exited" --filter "status=created"
docker rm $(docker ps -a -q --filter "status=exited" --filter "status=created")
  1. Ảnh Docker lưu ở đâu?
  • Linux: /var/lib/docker
  • MacOS: trong VM của Docker Desktop
  • Windows: trong WSL2 VM hoặc C:\ProgramData\DockerDesktop

Kiểm tra với:

docker info | grep "Docker Root Dir"
  1. Xóa container tự động khi kết thúc?

Dùng cờ --rm khi chạy:

docker run --rm <image-id>

Container sẽ tự xóa ngay khi dừng.

Kết luận

Hướng dẫn này trình bày một số lệnh thường dùng để xóa ảnh, container và volume trong Docker. Có nhiều tổ hợp và cờ khác nhau bạn có thể tham khảo thêm trong tài liệu chính thức Docker cho các lệnh docker system prune, docker rmi, docker rmdocker volume rm. Nếu bạn có đề xuất về các công việc dọn dẹp phổ biến khác, hãy góp ý trong phần bình luận.

Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly
Chia sẻ

0 câu trả lời