简介
在这个实验中,你将学习如何通过使用 docker network prune
命令来有效管理你的 Docker 网络。我们将首先创建几个自定义网络,以模拟一个包含多个网络的真实场景。
创建这些网络后,你将学习如何列出并识别当前哪些网络未被使用。最后,你将练习使用 docker network prune
命令来删除这些未使用的网络,包括如何应用过滤器以进行更有针对性的清理。这种实践经验将使你具备保持 Docker 环境整洁和优化的技能。
在这个实验中,你将学习如何通过使用 docker network prune
命令来有效管理你的 Docker 网络。我们将首先创建几个自定义网络,以模拟一个包含多个网络的真实场景。
创建这些网络后,你将学习如何列出并识别当前哪些网络未被使用。最后,你将练习使用 docker network prune
命令来删除这些未使用的网络,包括如何应用过滤器以进行更有针对性的清理。这种实践经验将使你具备保持 Docker 环境整洁和优化的技能。
在这一步中,你将学习如何在 Docker 中创建自定义网络。默认情况下,Docker 提供了三种网络:bridge
、host
和 none
。不过,你可以创建自己的自定义网络,以隔离容器并控制它们之间的通信方式。
要创建自定义网络,我们使用 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-1
和 my-network-2
)。
在这一步中,你将学习如何列出 Docker 网络,并识别当前没有被任何容器使用的网络。这对于清理你的 Docker 环境和释放资源非常有用。
在上一步中,我们已经使用 docker network ls
命令列出了所有网络。让我们再次运行该命令,查看当前状态。
docker network ls
输出会显示每个网络的网络 ID、名称、驱动程序和作用域。注意,我们创建的 my-network-1
和 my-network-2
网络也在列表中。
要识别未使用的网络,我们可以使用带有 --dry-run
标志的 docker network prune
命令。这个标志可以让我们查看哪些网络会被删除,但实际上并不会删除它们。
docker network prune --dry-run
该命令的输出将列出未连接到任何运行中容器且会被清理的网络。由于我们还没有将任何容器连接到 my-network-1
或 my-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-run
,my-network-1
和 my-network-2
都应该被列为待清理的网络,因为它们不再被使用。
在这一步中,你将学习如何使用 docker network prune
命令删除所有未使用的网络。该命令可用于清理 Docker 环境,通过删除当前未连接到任何容器的网络来释放资源。
在清理之前,让我们再次列出网络,查看当前存在哪些网络。
docker network ls
你应该会看到默认网络(bridge
、host
、none
)以及我们在第一步中创建的自定义网络(my-network-1
和 my-network-2
)。由于我们在上一步中停止并删除了 hello-world
容器,现在 my-network-1
和 my-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-1
和 my-network-2
已被删除。
docker network ls
现在,你应该只会在列表中看到默认网络(bridge
、host
、none
)。
在这一步中,你将学习如何使用过滤器清理未使用的网络。过滤器允许你根据特定条件(如标签或创建时间)有选择地删除网络。
首先,让我们创建几个带有标签的新网络,以便演示过滤功能。我们将创建带有 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-a
和 network-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
标志的该命令,是一个很有价值的工具,可用于预览哪些网络未连接到任何容器,从而确定哪些网络可以删除。在实际删除任何网络之前,这一步对于了解清理操作的影响至关重要。