如何使用 docker container prune 命令清理已停止的容器

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何通过使用 docker container prune 命令有效管理 Docker 环境,清理已停止的容器。我们将首先创建并停止多个容器来模拟真实场景。接着,你将探索多种清理这些已停止容器的方法,包括:移除所有容器、移除特定时间前创建的容器,以及根据标签(label)选择性移除容器。通过这个动手实践,你将掌握保持 Docker 系统整洁和优化的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/run -.-> lab-555117{{"如何使用 docker container prune 命令清理已停止的容器"}} docker/ps -.-> lab-555117{{"如何使用 docker container prune 命令清理已停止的容器"}} docker/stop -.-> lab-555117{{"如何使用 docker container prune 命令清理已停止的容器"}} docker/rm -.-> lab-555117{{"如何使用 docker container prune 命令清理已停止的容器"}} docker/pull -.-> lab-555117{{"如何使用 docker container prune 命令清理已停止的容器"}} docker/prune -.-> lab-555117{{"如何使用 docker container prune 命令清理已停止的容器"}} end

创建并停止容器

在本步骤中,我们将学习如何创建和停止 Docker 容器。Docker 容器是轻量级、可移植且自包含的单元,包含了运行应用程序所需的一切。

首先,让我们拉取一个用于创建容器的 Docker 镜像。我们将使用 ubuntu 镜像,这是一个最小化的 Ubuntu 操作系统。

docker pull ubuntu

你将看到镜像正在下载的输出信息。

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

获取镜像后,让我们基于它创建并运行一个容器。使用 docker run 命令,其中 -d 参数表示在后台运行容器(分离模式),--name 参数为容器指定名称。

docker run -d --name my-ubuntu-container ubuntu sleep infinity

该命令从 ubuntu 镜像创建名为 my-ubuntu-container 的容器,并在其中执行 sleep infinity 命令。sleep infinity 命令会使容器持续运行。

你将看到一长串字符作为输出,这是容器 ID。

<container_id>

使用 docker ps 命令验证容器是否正在运行。

docker ps

该命令列出所有运行中的容器。你应该能看到 my-ubuntu-container 在列表中。

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container

现在创建第二个容器,这次不指定名称,Docker 会自动生成名称。

docker run -d ubuntu sleep infinity

同样会输出容器 ID。

<container_id>

再次运行 docker ps 查看两个运行中的容器。

docker ps

现在应该能看到两个容器。

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <random_name>

现在停止名为 my-ubuntu-container 的容器。使用 docker stop 命令后接容器名称或 ID。

docker stop my-ubuntu-container

输出容器名称表示已成功停止。

my-ubuntu-container

再次运行 docker psmy-ubuntu-container 不再显示,因为该命令只列出运行中的容器。

docker ps

要查看所有容器(包括已停止的),使用 docker ps -a 命令。

docker ps -a

现在能看到两个容器,其中 my-ubuntu-container 的状态为 Exited

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Up X minutes                          <random_name>

最后,使用容器 ID 停止第二个容器。ID 可通过 docker ps -a 获取,将 <container_id> 替换为实际 ID。

docker stop <container_id>

输出容器 ID 表示操作成功。

<container_id>

最后运行 docker ps -a 确认两个容器均已停止。

docker ps -a

两个容器的状态现在都应为 Exited

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              <random_name>

清理所有已停止的容器

在前一步骤中,我们创建并停止了两个容器。已停止的容器仍会占用磁盘空间和资源。本步骤将学习如何使用 docker container prune 命令移除所有已停止的容器。

首先,列出所有容器(包括已停止的),查看待移除的容器。

docker ps -a

你将看到前一步骤中停止的两个容器。

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              <random_name>

现在执行清理命令。docker container prune 命令会移除所有已停止的容器。

docker container prune

Docker 会要求确认操作。输入 y 并按回车键继续。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

你将看到被移除容器的信息及回收的空间总量。

Deleted Containers:
<container_id>
<container_id>

Total reclaimed space: XMB

再次列出所有容器,验证已停止容器是否被移除。

docker ps -a

此时应无任何输出,表明已不存在任何容器(包括运行中和已停止的)。

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES

清理特定时间前创建的已停止容器

在前一步骤中,我们学习了如何清理所有已停止的容器。有时你可能只想清理特定时间前创建的容器,这在保留新容器的同时清理旧容器时非常有用。本步骤将学习如何结合 --filter 参数和 until 过滤器来清理指定时间前创建的已停止容器。

首先创建几个容器并停止它们,作为清理对象。

docker run -d --name container-old-1 ubuntu sleep infinity
docker run -d --name container-old-2 ubuntu sleep infinity

等待几秒后,再创建一个"较新"的容器。

sleep 5
docker run -d --name container-new-1 ubuntu sleep infinity

现在停止所有容器。

docker stop container-old-1 container-old-2 container-new-1

列出所有容器查看状态和创建时间。

docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}"

输出应类似如下(创建时间会有所不同):

container-old-1	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC
container-old-2	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC
container-new-1	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC

现在清理指定时间前创建的已停止容器。使用带 until 过滤器的 docker container prune 命令,该过滤器接受时间戳或时间间隔参数。本例使用时间间隔参数,清理 10 秒前创建的容器。

docker container prune --filter "until=10s"

Docker 会要求确认操作。输入 y 并按回车键。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

输出将显示被清理的旧容器,新容器不应出现在删除列表中。

Deleted Containers:
<container_id_old_1>
<container_id_old_2>

Total reclaimed space: XMB

再次列出所有容器,验证只有旧容器被清理。

docker ps -a --format "{{.Names}}\t{{.Status}}"

此时应仅显示状态为 Exitedcontainer-new-1

container-new-1	Exited (0) X seconds ago

清理带有特定标签的已停止容器

在前面的步骤中,我们学习了如何清理所有已停止容器以及基于创建时间的容器。本步骤将探索另一种实用的容器筛选清理方式:使用标签(labels)。标签是你可以附加到 Docker 对象(包括容器)上的键值对,用于组织和管理这些对象。

首先创建几个带有不同标签的容器。

docker run -d --name container-label-app --label app=frontend ubuntu sleep infinity
docker run -d --name container-label-env --label env=development ubuntu sleep infinity
docker run -d --name container-no-label ubuntu sleep infinity

现在停止所有容器。

docker stop container-label-app container-label-env container-no-label

列出所有容器及其标签,查看已应用的标签。

docker ps -a --format "{{.Names}}\t{{.Labels}}"

输出应类似如下:

container-label-app	app=frontend
container-label-env	env=development
container-no-label

现在仅清理带有 app=frontend 标签的已停止容器。我们将使用带 label 过滤器的 --filter 参数。

docker container prune --filter "label=app=frontend"

Docker 会要求确认操作。输入 y 并按回车键。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

输出将显示带有 app=frontend 标签的容器已被移除。

Deleted Containers:
<container_id_app_frontend>

Total reclaimed space: XMB

再次列出所有容器,确认仅移除了带有 app=frontend 标签的容器。

docker ps -a --format "{{.Names}}\t{{.Labels}}"

此时应仅显示带有 env=development 标签和无标签的容器。

container-label-env	env=development
container-no-label

你还可以通过给标签过滤器添加 ! 前缀来清理不带有特定标签的容器。让我们清理不带有 env=development 标签的容器。

docker container prune --filter "label!=env=development"

输入 y 并按回车键确认移除操作。

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

输出将显示不带有 env=development 标签的容器已被移除。

Deleted Containers:
<container_id_no_label>

Total reclaimed space: XMB

最后再次列出所有容器,确认仅剩带有 env=development 标签的容器。

docker ps -a --format "{{.Names}}\t{{.Labels}}"

此时应仅显示 container-label-env 容器。

container-label-env	env=development

总结

在本实验中,我们学习了如何使用 docker rundocker stop 命令创建和停止 Docker 容器,以及如何使用 docker ps 列出运行中的容器。随后我们探索了 docker container prune 命令来高效清理已停止的容器。具体内容包括:清理所有已停止容器、使用 --filter until 选项移除特定时间前创建的容器,以及通过 --filter label 选项基于标签选择性清理容器。这些步骤展示了在 Docker 环境中管理和清理已停止容器的实用方法。