---
title: "Hướng Dẫn Xóa Các Thành Phần Docker Không Dùng"
description: "Docker giúp bạn dễ dàng đóng gói các ứng dụng và dịch vụ trong container để có thể chạy bất cứ đâu. Tuy nhiên, trong quá trình làm việc với Docker, bạn cũng có thể tích lũy quá nhiều hình ảnh, container và volume dữ liệu không dùng khiến hệ thống bị lộn xộn và tốn dung lượng đĩa."
url: https://cloudfly.vn/huong-dan-xoa-cac-thanh-phan-docker-khong-dung
image: https://media.cloudfly.vn/posts/huong-dan-xoa-cac-thanh-phan-docker.png
---

# Hướng Dẫn Xóa Các Thành Phần Docker Không Dùng

![description image](https://media.cloudfly.vn/posts/huong-dan-xoa-cac-thanh-phan-docker.png)
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:**

- Hướng dẫn được trình bày dưới dạng mẹo với các đoạn lệnh dòng lệnh có thể sử dụng độc lập.
- Bạn có thể chuyển đến bất kỳ phần nào liên quan đến nhiệm vụ bạn muốn hoàn thành.

> **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](https://www.zsh.org/), và [Windows Powershell](https://docs.microsoft.com/en-us/powershell/).


## Xóa tất cả các Images, Containers, Volumes, và Networks không dùng hoặc dangling

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):

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

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

## Xóa Docker Images

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

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ê:**

```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ả 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ệnh `docker rmi`, cờ `-f` hoặc `--force` có thể dùng để xóa ảnh không có thẻ.

### Xóa các Docker images danglig (không được gắn 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ê:**

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

**Xóa:**

```bash
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ẻ](https://docs.docker.com/engine/reference/commandline/build/#/tag-image--t) khi xây dựng và có thể gắn thẻ lại ảnh bằng lệnh [`docker tag`](https://docs.docker.com/engine/reference/commandline/tag/).

### Xóa các images theo mẫu

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ê:**

```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ả các images

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ê:**

```bash
docker images -a
```

**Xóa:**

```bash
docker rmi $(docker images -a -q)
```

---

## Xóa Containers

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

Dùng lệnh `docker ps -a` để tìm tên hoặc ID của container muốn xóa:

**Liệt kê:**

```bash
docker ps -a
```

**Xóa:**

```bash
docker rm ID_or_Name ID_or_Name
```

### Xóa container khi thoát

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

```bash
docker run --rm image_name
```

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

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ê:**

```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 bộ lọc

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ê:**

```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ươ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ê:**

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

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

**Liệt kê:**

```bash
docker volume ls
```

**Xóa:**

```bash
docker volume rm volume_name volume_name
```

### Xóa volume dangling

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ê:**

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

**Xóa:**

```bash
docker volume prune
```

### Xóa container cùng volume của nó

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

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

---

## Lỗi phổ biến và nguyên nhân

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

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:

- **Dùng Volume có tên:** Quản lý dữ liệu chia sẻ tốt hơn. Ví dụ trong file Docker Compose:

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

```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ỡ lỗi tắc nghẽn do các lớp ảnh quá nhiều

Nhiều lớp ảnh gây hiệu năng chậm khi build và deploy. Các bước xử lý:

- **Phân tích các lớp ảnh:**

```bash
docker history myapp
```

- **Tối ưu Dockerfile:** Gom các lệnh RUN thành một để giảm số lớp, ví dụ:

Thay vì:

```dockerfile
RUN apt update && apt install -y python3
RUN apt install -y python3-pip
```

Dùng:

```dockerfile
RUN apt update && apt install -y python3 python3-pip
```

- **Dùng Multi-Stage Builds:** Giúp ảnh nhỏ hơn và hiệu quả hơn bằng cách chỉ sao chép phần 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ố gắng xóa container đang hoạt động

Khi cố xóa container đang chạy, gặp lỗi `container is running`. Các cách khắc phục:

1. Dừng container trước rồi xóa:

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

2. Ép xóa ngay bằng:

```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 GUI nhấn chuột phải container đang chạy rồi chọn **"Stop"** rồi **"Remove"**.

---

## FAQs

1. **Làm sao xóa hết container đã dừng trong Docker?**

Dùng:

```bash
docker-compose down
```

hoặc

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

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

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

Có thể dùng `docker rm -f <container_id>` để ép xóa container đang chạy.

4. **Cách giải phóng không gian đĩa trên Docker?**

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

5. **Sự khác nhau giữa `docker rm` và `docker rmi`?**

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

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

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

7. **Xóa ảnh Docker không dùng?**

```bash
docker image prune
```

hoặc để xóa tất cả ảnh không dùng:

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

8. **Xóa tất cả ảnh, container, volume, network?**

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

9. **Làm sao xóa file trong image Docker?**

Không thể thay đổi trực tiếp image, mà tạo image mới sau khi xóa file trong container:

```bash
docker run -it <image-id> /bin/bash
# Xóa file trong container
```

Sau đó commit container thành image mới:

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

10. **Xóa hết container đã dừng?**

```bash
docker container prune
```

Nhấn xác nhận hoặc dùng `-f` để bỏ qua xác nhận.

11. **Xóa container cũ không dùng?**

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

12. **Image Docker lưu ở đâu?**

- Linux: `/var/lib/docker`
- MacOS: trong VM của Docker Desktop
- Windows: trong WSL2 VM hoặc `C:\ProgramData\DockerDesktop`

Xem đường dẫn bằng:

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

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

Dùng cờ `--rm` khi tạo container:

```bash
docker run --rm <image-id>
```

Container sẽ tự động bị xóa ngay khi dừng.

## Kết luận

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!
