如何使用 docker network prune 命令删除未使用的网络

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何通过使用 docker network prune 命令来有效管理你的 Docker 网络。我们将首先创建几个自定义网络,以模拟一个包含多个网络的真实场景。

创建这些网络后,你将学习如何列出并识别当前哪些网络未被使用。最后,你将练习使用 docker network prune 命令来删除这些未使用的网络,包括如何应用过滤器以进行更有针对性的清理。这种实践经验将使你具备保持 Docker 环境整洁和优化的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/ls -.-> lab-555178{{"如何使用 docker network prune 命令删除未使用的网络"}} docker/ps -.-> lab-555178{{"如何使用 docker network prune 命令删除未使用的网络"}} docker/rm -.-> lab-555178{{"如何使用 docker network prune 命令删除未使用的网络"}} docker/prune -.-> lab-555178{{"如何使用 docker network prune 命令删除未使用的网络"}} docker/network -.-> lab-555178{{"如何使用 docker network prune 命令删除未使用的网络"}} end

创建一些自定义网络

在这一步中,你将学习如何在 Docker 中创建自定义网络。默认情况下,Docker 提供了三种网络:bridgehostnone。不过,你可以创建自己的自定义网络,以隔离容器并控制它们之间的通信方式。

要创建自定义网络,我们使用 docker network create 命令。让我们创建一个名为 my-network-1 的桥接网络。

docker network create my-network-1

你应该会看到类似以下的输出,表明网络已成功创建:

<network_id>

现在,让我们再创建一个名为 my-network-2 的桥接网络。

docker network create my-network-2

同样,你应该会看到一个网络 ID 作为输出。

我们可以使用 docker network ls 命令列出所有可用网络,以此验证这些网络是否已创建。

docker network ls

输出将显示一个网络列表,其中包括默认网络以及我们刚刚创建的两个自定义网络(my-network-1my-network-2)。

列出网络以识别未使用的网络

在这一步中,你将学习如何列出 Docker 网络,并识别当前没有被任何容器使用的网络。这对于清理你的 Docker 环境和释放资源非常有用。

在上一步中,我们已经使用 docker network ls 命令列出了所有网络。让我们再次运行该命令,查看当前状态。

docker network ls

输出会显示每个网络的网络 ID、名称、驱动程序和作用域。注意,我们创建的 my-network-1my-network-2 网络也在列表中。

要识别未使用的网络,我们可以使用带有 --dry-run 标志的 docker network prune 命令。这个标志可以让我们查看哪些网络会被删除,但实际上并不会删除它们。

docker network prune --dry-run

该命令的输出将列出未连接到任何运行中容器且会被清理的网络。由于我们还没有将任何容器连接到 my-network-1my-network-2,它们应该会出现在预演(dry run)的输出中。

让我们运行一个连接到 my-network-1 的简单容器,看看这会如何影响 docker network prune --dry-run 的输出。我们将使用非常小的 hello-world 镜像。首先,拉取该镜像:

docker pull hello-world

现在,使用这个镜像运行一个容器,并将其连接到 my-network-1-d 标志表示以分离模式(在后台)运行容器。

docker run -d --network my-network-1 hello-world

你会看到一个容器 ID 作为输出。

现在,让我们再次运行 docker network prune --dry-run 命令。

docker network prune --dry-run

这一次,my-network-1 不应该出现在待清理的网络列表中,因为它正在被运行中的 hello-world 容器使用。未被使用的 my-network-2 应该仍然会被列出。

要停止并删除 hello-world 容器,首先使用 docker ps 查找其 ID。

docker ps

然后,使用 docker stop <container_id> 停止容器,并使用 docker rm <container_id> 删除它。将 <container_id> 替换为 docker ps 输出中的实际 ID。

docker stop <container_id>
docker rm <container_id>

现在,如果你再次运行 docker network prune --dry-runmy-network-1my-network-2 都应该被列为待清理的网络,因为它们不再被使用。

清理所有未使用的网络

在这一步中,你将学习如何使用 docker network prune 命令删除所有未使用的网络。该命令可用于清理 Docker 环境,通过删除当前未连接到任何容器的网络来释放资源。

在清理之前,让我们再次列出网络,查看当前存在哪些网络。

docker network ls

你应该会看到默认网络(bridgehostnone)以及我们在第一步中创建的自定义网络(my-network-1my-network-2)。由于我们在上一步中停止并删除了 hello-world 容器,现在 my-network-1my-network-2 应该都未被使用。

要清理所有未使用的网络,只需运行不带任何标志的 docker network prune 命令。Docker 会提示你确认该操作。

docker network prune

你会看到一条请求确认的消息,如下所示:

WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N]

输入 y 并按回车键,继续进行清理操作。

输出将列出已删除的网络以及回收的总空间。

现在,让我们再次列出网络,确认 my-network-1my-network-2 已被删除。

docker network ls

现在,你应该只会在列表中看到默认网络(bridgehostnone)。

使用过滤器清理未使用的网络

在这一步中,你将学习如何使用过滤器清理未使用的网络。过滤器允许你根据特定条件(如标签或创建时间)有选择地删除网络。

首先,让我们创建几个带有标签的新网络,以便演示过滤功能。我们将创建带有 env=dev 标签的 network-a 和带有 env=test 标签的 network-b

docker network create --label env=dev network-a
docker network create --label env=test network-b

你应该会看到这两个命令输出的网络 ID。

现在,让我们列出网络,查看新创建的带有标签的网络。

docker network ls

你应该会在列表中看到 network-anetwork-b

要根据过滤器清理网络,我们在 docker network prune 命令中使用 --filter 标志。例如,要清理所有带有 env=dev 标签的未使用网络,我们可以使用过滤器 label=env=dev

让我们先进行一次预演(dry run),看看使用这个过滤器会清理哪些网络。

docker network prune --filter label=env=dev --dry-run

输出应该显示 network-a 是会被清理的网络,因为它带有 env=dev 标签且当前未被使用。

现在,让我们实际清理带有 env=dev 标签的未使用网络。

docker network prune --filter label=env=dev

你会被提示进行确认。输入 y 并按回车键。

输出将显示 network-a 已被删除。

让我们再次列出网络,确认 network-a 已被删除,但 network-b(带有 env=test 标签)仍然存在。

docker network ls

你应该会在列表中看到 network-b,但看不到 network-a

你还可以根据其他条件进行过滤,例如在特定时间之前创建的网络。不过,按标签过滤是管理网络的一种常见且有用的方法。

总结

在本次实验中,你学习了如何管理 Docker 网络,特别关注了识别和删除未使用的网络。你首先使用 docker network create 命令创建了自定义桥接网络,展示了如何在默认网络之外添加新网络。然后,你使用 docker network ls 命令列出了所有可用网络,并验证了自定义网络的创建。

随后,你探索了如何识别未使用的网络。你了解到 docker network prune 命令,特别是带有 --dry-run 标志的该命令,是一个很有价值的工具,可用于预览哪些网络未连接到任何容器,从而确定哪些网络可以删除。在实际删除任何网络之前,这一步对于了解清理操作的影响至关重要。