简介
在本实验中,你将学习如何通过使用 docker container prune
命令有效管理 Docker 环境,清理已停止的容器。我们将首先创建并停止多个容器来模拟真实场景。接着,你将探索多种清理这些已停止容器的方法,包括:移除所有容器、移除特定时间前创建的容器,以及根据标签(label)选择性移除容器。通过这个动手实践,你将掌握保持 Docker 系统整洁和优化的技能。
在本实验中,你将学习如何通过使用 docker container prune
命令有效管理 Docker 环境,清理已停止的容器。我们将首先创建并停止多个容器来模拟真实场景。接着,你将探索多种清理这些已停止容器的方法,包括:移除所有容器、移除特定时间前创建的容器,以及根据标签(label)选择性移除容器。通过这个动手实践,你将掌握保持 Docker 系统整洁和优化的技能。
在本步骤中,我们将学习如何创建和停止 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 ps
,my-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}}"
此时应仅显示状态为 Exited
的 container-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 run
和 docker stop
命令创建和停止 Docker 容器,以及如何使用 docker ps
列出运行中的容器。随后我们探索了 docker container prune
命令来高效清理已停止的容器。具体内容包括:清理所有已停止容器、使用 --filter until
选项移除特定时间前创建的容器,以及通过 --filter label
选项基于标签选择性清理容器。这些步骤展示了在 Docker 环境中管理和清理已停止容器的实用方法。