如何按名称过滤 Docker 容器

DockerBeginner
立即练习

介绍

Docker 已经成为开发人员和 IT 专业人士的必备工具,它提供了一个强大的平台,用于容器化应用程序。在本教程中,我们将探讨如何按名称过滤 Docker 容器,这是有效管理 Docker 环境的关键技能。通过本指南,你将能够根据容器的名称高效地定位和管理特定的容器,从而使你能够优化你的 Docker 工作流程。

使用 docker ps 查看 Docker 容器

在我们可以过滤 Docker 容器之前,我们首先需要了解如何在系统上查看正在运行的容器。为此,最基本的命令是 docker ps

理解 docker ps 命令

docker ps 命令列出系统上所有正在运行的 Docker 容器。当你运行此命令时,你将看到有关每个容器的信息,包括:

  • 容器 ID:容器的唯一标识符
  • 镜像(Image):用于创建容器的 Docker 镜像
  • 命令(Command):在容器内运行的命令
  • 创建时间(Created):容器的创建时间
  • 状态(Status):容器的当前状态
  • 端口(Ports):任何端口映射
  • 名称(Names):容器的名称

让我们运行 docker ps 命令来查看所有正在运行的容器:

docker ps

你应该看到类似这样的输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS     NAMES
54a76e95d987   alpine    "sleep 1000"             About a minute ago   Up About a minute             db-server
26f8c661f7a5   alpine    "sleep 1000"             About a minute ago   Up About a minute             utility-alpine
a3bb567cc561   redis     "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp  cache-server
f1d07c98e753   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web-frontend

查看所有容器

默认情况下,docker ps 仅显示正在运行的容器。要查看所有容器,包括已停止的容器,请使用 -a 标志:

docker ps -a

此命令将显示所有容器,无论其状态如何。当你想要查看已经退出的或已暂停的容器时,这很有用。

仅查看容器 ID

如果你只需要容器 ID,可以使用 -q 标志:

docker ps -q

这仅输出容器 ID,当你需要将它们传递给其他命令时,这很有用。

在进入下一步的过滤之前,在你的终端中尝试这些命令,以熟悉基本的容器列表功能。

按名称进行基本的容器过滤

现在我们了解了如何列出 Docker 容器,让我们学习如何按名称过滤它们。当你运行多个容器时,找到特定的容器可能具有挑战性。Docker 提供了过滤功能,使这项任务变得更加容易。

使用 --filter 选项

docker ps 命令支持通过 --filter-f 选项进行过滤。按名称过滤的基本语法是:

docker ps --filter name=<container-name>

让我们尝试过滤名称中包含 "web" 的容器:

docker ps --filter name=web

你应该看到类似这样的输出:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f1d07c98e753   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   80/tcp    web-frontend

请注意,web-frontendweb-backend 容器都显示出来了,因为它们的名称中都包含单词 "web"。

过滤精确的名称

要过滤具有精确名称的容器,你可以使用全名:

docker ps --filter name=web-frontend

此命令将仅显示名为 "web-frontend" 的容器:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
d6fe891c1f04   nginx     "/docker-entrypoint.…"   12 minutes ago   Up 12 minutes   80/tcp    web-frontend

使用多个过滤器

你可以通过添加多个 --filter 选项来应用多个过滤器。例如,要查找名称中包含 "web" 且从 "nginx" 镜像构建的所有容器:

docker ps --filter name=web --filter ancestor=nginx

结果应该与我们的第一个过滤器相同,因为两个 "web" 容器都使用 nginx 镜像:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f1d07c98e753   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 15 minutes   80/tcp    web-frontend

按名称的开头过滤容器

如果你想过滤名称以特定字符串开头的容器,你可以使用这样的模式:

docker ps --filter name=^db

此命令将显示名称以 "db" 开头的容器:

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
54a76e95d987   alpine    "sleep 1000"  16 minutes ago   Up 16 minutes             db-server

在你的终端中尝试这些过滤命令,以练习按名称查找特定容器。

高级过滤和格式化输出

现在我们已经掌握了基本的名称过滤,让我们探索一些更高级的技术,用于过滤和格式化 docker ps 命令的输出。这些技能将帮助你更有效地管理你的 Docker 环境。

结合多个过滤条件

Docker 允许你结合多个过滤条件来缩小你的结果范围。例如,要查找名称中包含 "web" 且当前正在运行的所有容器:

docker ps --filter name=web --filter status=running

这将显示所有名称中包含 "web" 的正在运行的容器:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
f1d07c98e753   nginx     "/docker-entrypoint.…"   25 minutes ago   Up 25 minutes   80/tcp    web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   25 minutes ago   Up 25 minutes   80/tcp    web-frontend

使用 --format 选项进行自定义输出

docker ps 命令支持使用 --format 选项和 Go 模板进行自定义输出格式化。这允许你仅显示你需要的、以你想要的格式显示的信息。

例如,仅显示容器名称及其状态:

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

你将看到一个简化的输出,如下所示:

NAMES               STATUS
db-server           Up 26 minutes
utility-alpine      Up 26 minutes
cache-server        Up 26 minutes
web-backend         Up 26 minutes
web-frontend        Up 26 minutes

结合过滤和格式化

你可以结合过滤和格式化来获得你确切需要的信息:

docker ps --filter name=web --format "table {{.Names}}\t{{.Image}}\t{{.Status}}"

这将显示一个表格,其中包含名称、镜像和名称中包含 "web" 的容器的状态:

NAMES               IMAGE               STATUS
web-backend         nginx               Up 27 minutes
web-frontend        nginx               Up 27 minutes

使用类似正则表达式的过滤

Docker 的过滤系统支持一些类似正则表达式的模式。例如,要查找名称包含 "web" 或 "cache" 的容器:

docker ps --filter name=web --filter name=cache

这将显示 web 容器和 cache 容器:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
a3bb567cc561   redis     "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes   6379/tcp   cache-server
f1d07c98e753   nginx     "/docker-entrypoint.…"   30 minutes ago   Up 30 minutes   80/tcp     web-backend
d6fe891c1f04   nginx     "/docker-entrypoint.…"   30 minutes ago   Up 30 minutes   80/tcp     web-frontend

实用示例:容器管理脚本

让我们创建一个简单的脚本,演示如何在实际场景中使用过滤。创建一个名为 container-stats.sh 的新文件,内容如下:

nano container-stats.sh

添加以下脚本:

#!/bin/bash
## This script displays container names, images and status for a filtered set of containers

echo "Web containers:"
docker ps --filter name=web --format "{{.Names}} - {{.Image}} - {{.Status}}"

echo -e "\nCache and database containers:"
docker ps --filter name=cache --filter name=db --format "{{.Names}} - {{.Image}} - {{.Status}}"

保存文件(Ctrl+O,Enter,然后 Ctrl+X)并使其可执行:

chmod +x container-stats.sh

现在运行脚本以查看过滤和格式化的容器信息:

./container-stats.sh

你应该看到类似这样的输出:

Web containers:
web-backend - nginx - Up 35 minutes
web-frontend - nginx - Up 35 minutes

Cache and database containers:
cache-server - redis - Up 35 minutes
db-server - alpine - Up 35 minutes

此脚本演示了如何使用容器过滤来以更具可读性和实用性的方式组织和呈现有关你的 Docker 环境的信息。

容器过滤的实际应用

在这一步,我们将探讨容器过滤的实际应用,以执行常见的 Docker 管理任务。这些示例演示了如何在实际场景中使用过滤,使容器管理更有效率。

查找并重启特定容器

假设你需要重启所有与 web 相关的容器。你可以使用名称过滤来识别它们,然后重启它们:

## 首先,识别 web 容器
docker ps --filter name=web

## 现在,逐个重启它们
docker restart web-frontend
docker restart web-backend

运行这些命令后,你应该看到每个容器已重启的确认信息:

web-frontend
web-backend

查找并删除具有特定名称模式的所有容器

如果你需要删除具有特定名称模式的所有容器,你可以将过滤与容器删除结合起来:

## 警告:这仅用于演示。在真实环境中,
## 确保你知道你要删除的内容!

## 列出名称中包含 "utility" 的容器
docker ps -a --filter name=utility

你应该看到你的 utility 容器:

CONTAINER ID   IMAGE     COMMAND         CREATED          STATUS          PORTS     NAMES
26f8c661f7a5   alpine    "sleep 1000"    45 minutes ago   Up 45 minutes             utility-alpine

要删除它,你通常会使用:

## 我们实际上不会运行此命令来保留我们的实验环境
## docker rm -f $(docker ps -aq --filter name=utility)

相反,让我们看看这个命令是如何工作的:

## 仅获取将受影响的 ID
docker ps -aq --filter name=utility

这将输出容器 ID:

26f8c661f7a5

使用过滤来监控特定的容器组

容器过滤对于有针对性的监控很有用。让我们创建一个简单的监控脚本,检查我们的 web 容器的状态:

nano web-monitor.sh

添加以下脚本:

#!/bin/bash
## This script checks the status of web containers and reports if any are not running

echo "=== Web Container Status Check ==="
docker ps -a --filter name=web --format "{{.Names}}: {{.Status}}"

## Count stopped web containers
STOPPED=$(docker ps -a --filter name=web --filter status=exited --format "{{.Names}}" | wc -l)

if [ $STOPPED -gt 0 ]; then
  echo -e "\nWARNING: $STOPPED web containers are not running!"
else
  echo -e "\nAll web containers are running normally."
fi

保存文件(Ctrl+O,Enter,然后 Ctrl+X)并使其可执行:

chmod +x web-monitor.sh

现在,运行脚本以查看你的 web 容器的状态:

./web-monitor.sh

你应该看到类似这样的输出:

=== Web Container Status Check ===
web-backend: Up 50 minutes
web-frontend: Up 50 minutes

All web containers are running normally.

在 CI/CD 管道中使用过滤

在 CI/CD 管道中,过滤容器对于自动化测试和部署至关重要。让我们创建一个脚本,模拟一个仅针对具有特定名称模式的容器的部署过程:

nano deploy-update.sh

添加以下脚本:

#!/bin/bash
## This script simulates updating all containers of a specific type

TARGET_CONTAINERS=$1

if [ -z "$TARGET_CONTAINERS" ]; then
  echo "Usage: $0 <container-name-pattern>"
  exit 1
fi

echo "Preparing to update containers matching pattern: $TARGET_CONTAINERS"
echo "Containers affected:"
docker ps --filter name=$TARGET_CONTAINERS --format "{{.Names}}"

echo -e "\nIn a real deployment, this would:"
echo "1. Pull the latest images"
echo "2. Stop each container"
echo "3. Start new containers with the updated images"
echo "4. Verify the containers are running correctly"

echo -e "\nSimulation completed successfully!"

保存文件(Ctrl+O,Enter,然后 Ctrl+X)并使其可执行:

chmod +x deploy-update.sh

现在,让我们模拟更新我们的 web 容器:

./deploy-update.sh web

你应该看到类似这样的输出:

Preparing to update containers matching pattern: web
Containers affected:
web-backend
web-frontend

In a real deployment, this would:
1. Pull the latest images
2. Stop each container
3. Start new containers with the updated images
4. Verify the containers are running correctly

Simulation completed successfully!

这些实际示例演示了如何将容器过滤集成到你的 Docker 工作流程中,以使容器管理更有效率和自动化。

总结

在这个实验中,你已经学会了如何通过名称有效地过滤 Docker 容器,这是管理任何规模的 Docker 环境的必备技能。让我们回顾一下我们所涵盖的内容:

  1. 基本容器列表:你学习了如何使用 docker ps 命令来查看正在运行的容器及其各种选项,例如 -a 用于显示所有容器。

  2. 基本名称过滤:你发现了如何使用 --filter name= 选项通过名称查找容器,包括完全匹配和部分匹配。

  3. 高级过滤和格式化:你探索了如何结合多个过滤器,并使用 --format 选项自定义输出,以仅显示你所需的信息。

  4. 实际应用:你创建了脚本,演示了容器过滤在监控、管理和部署任务中的实际应用。

这些技能将帮助你更有效地管理 Docker 环境,尤其是在容器数量不断增长的情况下。容器过滤在开发、测试和生产环境中特别有价值,在这些环境中,你需要快速识别和管理特定容器。

在你继续你的 Docker 之旅时,请考虑探索名称过滤之外的其他过滤选项,例如按卷、网络或标签进行过滤。这些额外的过滤技术可以进一步增强你的容器管理能力。