---
title: "Hướng Dẫn Dọn Dẹp Docker: Xóa Ảnh, Container và Volume Không Sử Dụng"
description: "Docker giúp bạn dễ dàng đóng gói ứng dụng và dịch vụ thành các container để chạy ở bất kỳ đâu. Tuy nhiên, trong quá trình sử dụng Docker, bạn có thể tích tụ nhiều ảnh, container, và volume không dùng đến, gây lộn xộn và tốn dung lượng ổ cứng."
url: https://cloudfly.vn/huong-dan-don-dep-docker-xoa-anh-container-va-volume-khong-su-dung
image: https://media.cloudfly.vn/posts/huong-dan-don-dep-docker.png
---

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

![description image](https://media.cloudfly.vn/posts/huong-dan-don-dep-docker.png)
## 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):

```bash
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:

```bash
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:**

```bash
docker images -a
```

**Xóa:**

```bash
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:**

```bash
docker images -f dangling=true
```

**Xóa:**

```bash
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](https://docs.docker.com/engine/reference/commandline/build/#/tag-image--t) 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 images` và [grep](https://linuxhint.com/grep-command-linux/). Khi có danh sách như ý, dùng [awk](https://linuxhint.com/linux_awk_command/) 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:**

```bash
docker images -a | grep "pattern"
```

**Xóa:**

```bash
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:**

```bash
docker images -a
```

**Xóa:**

```bash
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:**

```bash
docker ps -a
```

**Xóa:**

```bash
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:**

```bash
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:**

```bash
docker ps -a -f status=exited
```

**Xóa:**

```bash
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:**

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

**Xóa:**

```bash
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 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:**

```bash
docker ps -a | grep "pattern"
```

**Xóa:**

```bash
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 stop` và `docker rm`:

**Danh sách:**

```bash
docker ps -a
```

**Xóa:**

```bash
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:**

```bash
docker volume ls
```

**Xóa:**

```bash
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:**

```bash
docker volume ls -f dangling=true
```

**Xóa:**

```bash
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:**

```bash
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:

```yaml
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ụ:

```yaml
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:

```bash
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ụ:

```dockerfile
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.

```dockerfile
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:

```bash
docker stop <container_id>
docker rm <container_id>
```

2. Ép buộc xóa ngay trong một lệnh:

```bash
docker rm -f <container_id>
```

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

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

4. Dùng Docker Compose:

```bash
docker-compose down
```

5. 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:

```bash
docker-compose down
```

Hoặc dùng:

```bash
docker system prune -a
```

2. **`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.

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

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

4. **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`

5. **`docker rm` và `docker rmi` khác nhau thế nào?**

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

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

Dùng:

```bash
docker rmi <image-id>
```

7. **Làm sao xóa ảnh Docker không dùng?**

Dùng:

```bash
docker image prune
```

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

```bash
docker image prune --all
```

8. **Xóa hết ảnh, container, volume, mạng cùng lúc?**

Dùng:

```bash
docker system prune --all --volumes
```

9. **Làm sao xoá file trong ảnh Docker?**

Chạy container từ ảnh:

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

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

```bash
docker commit <container-id> <new-image-name>
```

10. **Xóa tất cả container đã dừng?**

```bash
docker container prune
```

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

```bash
docker container prune -f
```

11. **Xóa container cũ theo trạng thái?**

```bash
docker ps -a --filter "status=exited" --filter "status=created"
docker rm $(docker ps -a -q --filter "status=exited" --filter "status=created")
```

12. **Ả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:

```bash
docker info | grep "Docker Root Dir"
```

13. **Xóa container tự động khi kết thúc?**

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

```bash
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 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.
