Docker cung cấp tất cả công cụ cần thiết để bạn dọn dẹp hệ thống từ dòng lệnh. Hướng dẫn dạng mẹo này cung cấp tài liệu tham khảo nhanh các lệnh hữu ích để giải phóng dung lượng đĩa và giữ hệ thống gọn gàng bằng cách loại bỏ các hình ảnh, container và volume Docker không sử dụng.
Cách sử dụng hướng dẫn này:
Lưu ý: Cú pháp thay thế lệnh,
command $(command)
được sử dụng trong các lệnh có sẵn trên nhiều shell phổ biến như bash, zsh, và Windows Powershell.
Docker cung cấp một lệnh duy nhất để dọn dẹp bất kỳ tài nguyên nào — images, containers, volumes, và networks — mà là dangling (không được gắn thẻ hoặc không liên kết với container nào):
docker system prune
Để đồng thời xóa thêm các container đã dừng và tất cả các image không dùng (không chỉ các image dangling), thêm cờ -a
vào lệnh:
docker system prune -a
Dùng lệnh docker images -a
để tìm ID của các ảnh bạn muốn xóa. Lệnh này sẽ hiển thị tất cả ảnh, bao gồm 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 của chúng cho docker rmi
:
Liệt kê:
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ả các ảnh Docker, kể cả ảnh trung gian chưa được tham chiếu bởi thẻ nào. Theo mặc định,docker images
chỉ hiển thị ảnh có ít nhất một thẻ. Tuy nhiên, có thể có những ảnh không có thẻ vẫn chiếm dung lượng đĩa. Cờ-a
rất hữu ích để nhận diện các ảnh có thể bị xóa để tiết kiệm dung lượng. Khi dùng với lệnhdocker rmi
, cờ-f
hoặc--force
có thể dùng để xóa ảnh không có thẻ.
Docker images gồm nhiều lớp. Image dangling là các lớp không có liên quan đến bất kỳ image gắn thẻ nào. Chúng không còn hữu ích và chiếm dung lượng đĩa. Bạn có thể tìm chúng bằng cách dùng cờ lọc -f dangling=true
trong lệnh docker images
. Khi chắc chắn muốn xóa, bạn dùng lệnh:
Liệt kê:
docker images -f dangling=true
Xóa:
docker image prune
Lưu ý: Nếu bạn xây dựng một image mà không gắn thẻ, ảnh sẽ xuất hiện trong danh sách ảnh dangling vì không được liên kết với ảnh có thẻ. Bạn có thể tránh điều này bằng cách gắn thẻ khi xây dựng và có thể gắn thẻ lại ảnh bằng lệnh
docker tag
.
Bạn có thể tìm tất cả ảnh phù hợp với một mẫu chuỗi bằng cách kết hợp docker images
và grep
. Khi đã xác định được ảnh muốn xóa, dùng awk
để truyền ID cho docker rmi
. Lưu ý, các tiện ích này không được cung cấp bởi Docker và không phải lúc nào cũng có trên tất cả hệ thống:
Liệt kê:
docker images -a | grep "pattern"
Xóa:
docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi
Tất cả các image Docker trên hệ thống có thể được liệt kê bằng cách thêm -a
cho lệnh docker images
. Khi muốn xóa hết, dùng -q
để truyền ID ảnh cho docker rmi
:
Liệt kê:
docker images -a
Xóa:
docker rmi $(docker images -a -q)
Dùng lệnh docker ps -a
để tìm tên hoặc ID của container muốn xóa:
Liệt kê:
docker ps -a
Xóa:
docker rm ID_or_Name ID_or_Name
Nếu bạn biết khi tạo container không muốn giữ lại sau khi kết thúc, có thể chạy:
Chạy và Xóa:
docker run --rm image_name
Bạn có thể dùng lệnh docker ps -a
lọc container theo trạng thái: created
, restarting
, running
, paused
, hoặc exited
. Để xem container exited
, dùng cờ lọc -f status=exited
. Khi xác nhận muốn xóa, dùng -q
để lấy ID và truyền cho docker rm
:
Liệt kê:
docker ps -a -f status=exited
Xóa:
docker rm $(docker ps -a -f status=exited -q)
Docker cho phép kết hợp nhiều bộ lọc bằng cách dùng nhiều lần cờ -f
. Ví dụ, muốn xóa container có trạng thái created
hoặc exited
:
Liệt kê:
docker ps -a -f status=exited -f status=created
Xóa:
docker rm $(docker ps -a -f status=exited -f status=created -q)
Tương tự với hình ảnh, dùng docker ps
kết hợp grep
để tìm container phù hợp mẫu. Sau khi xác nhận, dùng awk
và xargs
để truyền ID cho docker rm
:
Liệt kê:
docker ps -a | grep "pattern"
Xóa:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
Xem danh sách container với docker ps -a
. Khi chắc chắn muốn xóa hết, dùng -q
để lấy ID rồi truyền cho docker stop
và docker rm
:
Liệt kê:
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:
Liệt kê:
docker volume ls
Xóa:
docker volume rm volume_name volume_name
Vì volume tồn tại độc lập với container, khi xóa container, volume không tự xóa. Volume không liên kết với container nào gọi là volume dangling. Dùng lệnh docker volume ls
với bộ lọc để tìm chúng. Khi hài lòng với danh sách, dùng docker volume prune
để xóa:
Liệt kê:
docker volume ls -f dangling=true
Xóa:
docker volume prune
Nếu bạn tạo volume không tên, có thể xóa cùng lúc container với cờ -v
. Chỉ áp dụng cho volume không tên. Khi xóa thành công container, ID container được hiển thị. Volume không tên sẽ bị xóa âm thầm, volume có tên thì vẫn cò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 | Containers | -f để xóa bắt buộc, -v xóa volume |
docker rmi |
Xóa một hoặc nhiều image | Images | -f để xóa bắt buộc |
docker prune |
Xóa các tài nguyên không dùng hoặc dangling | Images, Containers, Volumes, Networks | -a xóa tất cả tài nguyên không dùng, -f xóa bắt buộc |
Lưu ý: Cờ
-f
dùng để bắt buộc xóa tài nguyên 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ả dangling.
Khi nhiều container dùng chung volumes, có thể gặp lỗi đồng bộ dẫn đến hỏng dữ liệu hoặc hành vi không mong muốn. Có thể xử lý bằng các cách:
version: '3.8'
services:
app:
image: myapp
volumes:
- myvolume:/app/node_modules
volumes:
myvolume:
Khóa file: Dùng cơ chế khóa file để đảm bảo chỉ một container truy cập file cùng lúc, ví dụ flock
hoặc lockfile
trong mã nguồn.
Dùng Docker Compose: Quản lý multi-container dễ dàng hơn, 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:
Nhiều lớp ảnh gây hiệu năng chậm khi build và deploy. Các bước xử lý:
docker history myapp
Thay vì:
RUN apt update && apt install -y python3
RUN apt install -y python3-pip
Dùng:
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"]
Khi cố xóa container đang chạy, gặp lỗi container is running
. Các cách khắc phục:
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
docker system prune -a
docker system prune
có tác dụng gì?Xóa tất cả container đã dừng và mạng không dùng. Dùng -a
thêm xóa hình ảnh không dùng giúp giải phóng không gian đĩa.
Có thể dùng docker rm -f <container_id>
để ép xóa container đang chạy.
docker system prune -a
: Xóa toàn bộ ảnh không dùng.docker system prune -a -v
: Xóa ảnh và volume không dùng.docker volume prune -a
: Xóa volume không dùng.docker network prune -a
: Xóa mạng không dùng.docker rm
và docker rmi
?docker rm
xóa container, còn docker rmi
xóa hình ảnh.
docker rmi <image-id>
docker image prune
hoặc để xóa tất cả ảnh không dùng:
docker image prune --all
docker system prune --all --volumes
Lưu ý: Lệnh này xóa sạch tất cả, bao gồm container đã dừng và volume.
Không thể thay đổi trực tiếp image, mà tạo image mới sau khi xóa file trong container:
docker run -it <image-id> /bin/bash
# Xóa file trong container
Sau đó commit container thành image mới:
docker commit <container-id> <new-image-name>
docker container prune
Nhấn xác nhận hoặc dùng -f
để bỏ qua xác nhận.
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
Xem đường dẫn bằng:
docker info | grep "Docker Root Dir"
Dùng cờ --rm
khi tạo container:
docker run --rm <image-id>
Container sẽ tự động bị xóa ngay khi dừng.
Hướng dẫn này trình bày các lệnh phổ biến để xóa images, containers và volumes trong Docker. Còn nhiều tổ hợp và cờ khác có thể dùng. Chúc các bạn thành công!