---
title: "如何为 Docker 扫地"
date: 2018-07-10T19:09:07.000Z
author: Z.SHINCHVEN
tags: [Docker]
canonical: https://atlassc.net/2018/07/11/clean-docker
---
## docker system prune

使用[docker system prune](https://docs.docker.com/engine/reference/commandline/system_prune/)命令是目前最便捷的清理方式

### 清理未被使用的containers、networks、images，可选清理volumes



```bash
# 为防止数据丢失，该命令**默认不清理volumes**
docker system prune

# 清理所有未被使用的资源，包括未被使用的volumes
# 🚨 🚨 🚨 可能造成数据丢失
docker system prune -a --volumes
```

### 仅清理未被使用的 images

```bash
docker image prune
```

### 仅清理未被使用的 container

```bash
docker container prune
```

### 仅清理未被使用的 volumes

```bash
# 🚨 🚨 🚨 可能造成数据丢失
docker volume prune
```

## 为什么需要为 Docker 扫地？（旧的解决方案）

相同名字和 tag 的 Docker image 在更新以后，旧的 image 并不会被删除( docker rmi )，一般只会被删除 tag，如果你也像我们一样在测试环境中快速迭代版本，那用不了多久就会产生很多 tag 为 none 的无用 image，它们会占用很多磁盘空间；

在日常使用中，也可能产生很多已停止的 container，它们有些是由于手动运行而忘记关掉的，有些是由于其他原因挂掉了而保留下来的“尸体”；

这些 untagged image 和 stopped container 都是我们要清理的对象；

## 如何快速清理？

如果你确定这些 image 和 container 都是可以被清理掉的， 那么可以使用以下这些命令来进行快速清理。

### 清理掉所有未被使用的 image

```bash
docker images -q -f dangling=true | xargs --no-run-if-empty docker rmi
```

### 清理掉所有 untagged image

```bash
docker rmi $(docker images | grep "<none>" | awk "{print $3}")
docker rmi $(docker images | grep "YOUR_KEYWORD" | awk "{print $3}")
```

### 根据关键字清理 container

```bash
docker rm $(docker ps -a | grep 'YOUR_KEYWORD' | awk '{print $1}')
```

### 清理掉所有 stopped container

```bash
docker ps -q -f status=exited | xargs --no-run-if-empty docker rm
```

### 使用 docker-compose 来管理 container

在使用 docker-compose down 或者 docker-compose up （更新）时，旧的 container 会自动被删除掉。

## 注意保护你的数据！

- 在使用 docker 的时候，无论是 image 还是 container 都不应该用来保存数据和文件；
- 在使用 docker 的时候，image 和 container 应该被视为被编译后的程序和文件，它们极易在迭代的时候被抛弃和删除掉；
- 如果你的程序会生产数据和文件，请一定要通过 volume 映射到宿主机的磁盘上，或者存储于外部数据库，如果你的数据库也是通过 docker 运行，请一定要将数据库存储的文件也映射到宿主机上；
