如何移除旧的Docker容器

如何移除旧的Docker容器

技术背景

在使用Docker进行开发和部署的过程中,随着时间的推移,系统中会积累大量不再使用的旧容器。这些旧容器不仅占用磁盘空间,还可能导致管理上的混乱。因此,定期清理旧容器是保持系统整洁和高效的重要操作。

实现步骤

1. 使用 docker container prune 移除所有停止的容器

从Docker 1.13.x版本开始,可以使用 docker container prune 命令移除所有停止的容器:

1
docker container prune

执行该命令后,Docker会提示确认操作,输入 y 并回车即可完成移除。

2. 使用 docker system prune 清理所有未使用的资源

docker system prune 命令可以清理所有未使用的容器、网络、镜像(包括悬空和未引用的),并可选择清理卷:

1
docker system prune

若要同时移除所有未使用的镜像(包括有容器关联的),可以加上 -a 选项:

1
docker system prune -a

执行该命令时,同样会有确认提示,输入 y 并回车。

3. 过滤移除特定条件的容器

  • 移除数周前停止的容器
1
docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm
  • 移除在特定容器之前创建的容器
1
docker rm $(docker ps -f before=<container-ID> -q)
  • 移除在特定容器之后创建的容器
1
docker rm $(docker ps -f since=<container-ID> -q)

4. 按数量移除旧容器

移除最旧的5个容器:

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

5. 按时间范围移除容器

移除超过24小时的容器:

1
sudo docker container prune --filter "until=24h"

核心代码

以下是一个清理停止容器和悬空镜像的脚本示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
# Cleanup docker files: stopped containers and dangling images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

stopped_containers() {
docker ps -q -f status=exited
}

dangling_images() {
docker images -q -f "dangling=true"
}

# Dry-run.
if [ "$1" = "-n" ]; then
echo "==> Would stop containers:"
stopped_containers
echo "==> And images:"
dangling_images
exit
fi

# Remove stopped containers
if [ -n "$(stopped_containers)" ]; then
docker rm $(stopped_containers)
else
echo "No containers to remove."
fi

# Remove dangling images
if [ -n "$(dangling_images)" ]; then
docker rmi $(dangling_images)
else
echo "No images to remove."
fi

最佳实践

  • 定期清理:设置定时任务,定期执行清理命令,如使用 cron 任务每天执行一次 docker system prune -a
  • 使用标签管理:在创建容器和镜像时,使用有意义的标签,方便后续筛选和管理。
  • 谨慎使用 -a 选项docker system prune -a 会移除所有未使用的镜像,包括有容器关联的,使用前需确认不会误删重要镜像。

常见问题

1. 移除容器时提示“Error: Impossible to remove a running container, please stop it first”

这是因为要移除的容器正在运行,需要先停止容器再进行移除操作。可以使用以下命令停止所有运行的容器:

1
docker stop $(docker ps -q)

然后再执行移除命令。

2. 命令在Windows系统中无法正常工作

部分命令在Windows系统中可能需要调整语法,例如使用 FOR 循环来移除所有容器:

1
FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

在PowerShell中可以使用:

1
docker rm @(docker ps -aq)

3. 移除镜像时提示有容器依赖

需要先移除依赖该镜像的容器,再移除镜像。可以使用 docker ps -a 查看依赖的容器,并使用 docker rm 移除这些容器,然后再移除镜像。


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