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
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ệnhdocker 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ớidocker rmi
, cờ-f
hoặc--force
cho phép xóa ảnh không có tag.
Ả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
.
Bạn có thể tìm ảnh theo mẫu bằng cách kết hợp docker images
và grep. 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
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)
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
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
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)
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)
Tìm container theo mẫu bằng cách kết hợp docker ps
và grep
. Khi có danh sách, dùng awk
và xargs
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
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 stop
và docker rm
:
Danh sách:
docker ps -a
Xóa:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
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
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
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
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.
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ý:
version: '3.8'
services:
app:
image: myapp
volumes:
- myvolume:/app/node_modules
volumes:
myvolume:
flock
hoặc lockfile
trong mã ứng dụng.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:
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ý:
docker history <image>
xem các lớp:docker history myapp
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
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 /app/myapp .
CMD ["./myapp"]
container is running
khi cố xóa container đang chạyKhi xóa container đang chạy, lỗi container is running
có thể xảy ra. Cách giải quyết:
docker stop <container_id>
docker rm <container_id>
docker rm -f <container_id>
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker-compose down
Dùng:
docker-compose down
Hoặc dùng:
docker system prune -a
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.
Có, dùng docker rm -f <container_id>
để ép buộc xóa.
Dùng các lệnh:
docker system prune -a
docker system prune -a -v
docker volume prune -a
docker network prune -a
docker rm
và docker rmi
khác nhau thế nào?docker rm
xóa container, còn docker rmi
xóa ảnh.
Dùng:
docker rmi <image-id>
Dùng:
docker image prune
hoặc với tất cả ảnh:
docker image prune --all
Dùng:
docker system prune --all --volumes
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>
docker container prune
hoặc bỏ qua xác nhận:
docker container prune -f
docker ps -a --filter "status=exited" --filter "status=created"
docker rm $(docker ps -a -q --filter "status=exited" --filter "status=created")
/var/lib/docker
C:\ProgramData\DockerDesktop
Kiểm tra với:
docker info | grep "Docker Root Dir"
Dùng cờ --rm
khi chạy:
docker run --rm <image-id>
Container sẽ tự xóa ngay khi dừng.
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 rm
và docker 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.