如何移除旧的 Docker 容器

如何移除旧的 Docker 容器

技术背景

在使用 Docker 进行开发和部署过程中,会产生大量的容器。随着时间推移,一些容器不再使用,它们会占用磁盘空间和系统资源。因此,及时清理旧的 Docker 容器是很有必要的。

实现步骤

Docker 1.13.x 及以上版本

移除所有停止的容器

可以使用 docker container prune 命令,该命令能移除所有停止的容器,且在所有平台上的工作方式相同:

1
docker container prune

清理所有未使用的资源

使用 docker system prune 命令,它能在一个命令中清理所有未使用的容器、网络、镜像(包括悬空和未引用的),还可选择清理卷:

1
docker system prune

旧版本 Docker

可以将 Docker 命令与其他 Unix 命令组合使用。例如,清理数周前的旧容器:

1
docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

其他移除方式

移除所有非运行容器

1
docker rm $(docker ps -q -f status=exited)

移除所有容器(包括运行和停止的)

1
docker rm -f $(docker ps -a -q)

移除特定时间之前或之后创建的容器

  • 移除在某个容器之前创建的容器:
1
docker rm $(docker ps -f before=9c49c11c8d21 -q)
  • 移除在某个容器之后创建的容器:
1
docker rm $(docker ps -f since=a6ca4661ec7f -q)

移除 5 个最旧的容器

1
docker rm `docker ps -aq | tail -n 5`

移除所有未标记的镜像

1
docker rmi $(docker images -q --filter "dangling=true")

核心代码

清理脚本示例

可以将以下脚本添加到 ~/.bashrc~/.profile 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Use `docker-cleanup --dry-run` to see what would be deleted.
function docker-cleanup {
EXITED=$(docker ps -q -f status=exited)
DANGLING=$(docker images -q -f "dangling=true")

if [ "$1" == "--dry-run" ]; then
echo "==> Would stop containers:"
echo $EXITED
echo "==> And images:"
echo $DANGLING
else
if [ -n "$EXITED" ]; then
docker rm $EXITED
else
echo "No containers to remove."
fi
if [ -n "$DANGLING" ]; then
docker rmi $DANGLING
else
echo "No images to remove."
fi
fi
}

移除所有容器和镜像的基本步骤脚本

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 1. List all the containers
docker ps -aq

# 2. Stop all running containers
docker stop $(docker ps -aq)

# 3. Remove all containers
docker rm $(docker ps -aq)

# 4. Remove all images
docker rmi $(docker images -q)

最佳实践

  • 定期使用 docker system prunedocker container prune 清理未使用的资源。
  • 在部署脚本中添加清理代码,只保留最近的几个容器和镜像,以便回滚。
  • 使用过滤功能,如 docker ps -q -f status=exited,精确移除特定状态的容器。

常见问题

移除运行中的容器报错

当尝试移除运行中的容器时,会收到错误信息,需要先停止容器:

1
Error: Impossible to remove a running container, please stop it first

解决方法是先停止容器,再进行移除操作:

1
2
docker stop <CONTAINER_ID>
docker rm <CONTAINER_ID>

没有匹配的容器时 docker rmdocker rmi 报错

当使用过滤条件没有匹配到容器时,docker rmdocker rmi 会报错。可以使用脚本检查是否有匹配的容器,避免报错:

1
2
3
4
5
6
EXITED=$(docker ps -q -f status=exited)
if [ -n "$EXITED" ]; then
docker rm $EXITED
else
echo "No containers to remove."
fi

如何移除旧的 Docker 容器
https://119291.xyz/posts/how-to-remove-old-docker-containers/
作者
ww
发布于
2025年6月23日
许可协议