docker ps -f 高效过滤容器:告别 grep 的低效操作!

441 阅读4分钟

在管理 Docker 容器时,快速找到所需容器的信息是非常重要的。常见的方法包括使用 docker ps 命令结合 grep 进行过滤,或者使用 docker ps -f 命令进行过滤。让我们对这两种方法进行对比,看看哪种方法更高效、更简洁。

使用 docker ps | grep "my-app"

这种方法通过 docker ps 列出所有容器,然后使用 grep 进行文本匹配过滤:

docker ps -a | grep "my-app"

优点:

  • 简单直观,可以直接过滤出包含特定字符串的所有行。
  • 对于熟悉 Unix 工具链的人来说,grep 是一个非常常见的工具。

缺点:

  • 不能区分容器名称、镜像名称、状态等字段,匹配不够精确。
  • 依赖于 docker ps 输出的格式,容易受到输出变化的影响。
  • 当容器数量很多时,性能较低,因为需要处理所有容器的信息。

使用 docker ps -a -f ""

这种方法使用 Docker 提供的过滤选项,直接在 Docker 层面进行过滤, 如:

docker ps -f "name=my-app"

优点:

  • 过滤条件更加精准,可以指定具体的字段(如容器名称-name、镜像名称等)。
  • 性能更高,因为过滤在 Docker 层面完成,不需要处理所有容器的信息。
  • 语法简洁明了,易于理解和使用。

缺点:

  • 需要记住 Docker 的过滤选项语法,对于初学者可能有一定的学习成本。

示例对比

假设有以下容器在运行:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         NAMES
a1b2c3d4e5f6   nginx:latest   "nginx -g 'daemon of…"   3 minutes ago   Up 3 minutes   my-nginx-container
b2c3d4e5f6a1   my-app:1.0     "/bin/sh -c 'python …"   5 minutes ago   Up 5 minutes   my-app-container-1
c3d4e5f6a1b2   ubuntu:18.04   "bash"                   10 minutes ago  Up 10 minutes  test-my-app

1. 使用 docker ps | grep "my-app"

docker ps | grep "my-app"

输出:

plaintext
Copy code
b2c3d4e5f6a1   my-app:1.0     "/bin/sh -c 'python …"   5 minutes ago   Up 5 minutes   my-app-container-1
c3d4e5f6a1b2   ubuntu:18.04   "bash"                   10 minutes ago  Up 10 minutes  test-my-app

2. 使用docker ps -f 匹配过滤:

根据容器名称模糊匹配过滤

docker ps -f "name=my-app"

输出:

CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         NAMES
b2c3d4e5f6a1   my-app:1.0  "/bin/sh -c 'python …"   5 minutes ago   Up 5 minutes   my-app-container-1
c3d4e5f6a1b2   ubuntu:18.04 "bash"                  10 minutes ago  Up 10 minutes  test-my-app

根据标签(label)过滤容器

docker build --label color=blue打包镜像后,使用此镜像运行的容器也将带上这些color标签(label)。

以下过滤器将匹配带有color标签的容器,无论其值是什么。

$ docker ps --filter "label=color"

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
673394ef1d4c        busybox             "top"               47 seconds ago      Up 45 seconds                           nostalgic_shockley
d85756f57265        busybox             "top"               52 seconds ago      Up 51 seconds                           high_albattani

以下过滤器将带有color标签和blue值的容器进行匹配。

$ docker ps --filter "label=color=blue"

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
d85756f57265        busybox             "top"               About a minute ago   Up About a minu

根据镜像名称和tag名称过滤容器

过滤条件使用ancestor根据容器的镜像匹配容器。过滤器支持以下镜像表示:

  • image
  • image:tag
  • image:tag@digest
  • short-id
  • full-id

如果您未指定tag,则latest为标签的默认值。例如,要筛选使用最新ubuntu映像的容器:

$ docker ps --filter ancestor=ubuntu

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
919e1179bdb8        ubuntu-c1           "top"               About a minute ago   Up About a minute                       admiring_lovelace
5d1e4a540723        ubuntu-c2           "top"               About a minute ago   Up About a minute                       admiring_sammet
82a598284012        ubuntu              "top"               3 minutes ago        Up 3 minutes                            sleepy_bose
bab2a34ba363        ubuntu              "top"               3 minutes ago        Up 3 minutes                            focused_yonath

根据ubuntu版本22.04镜像匹配容器:

$ docker ps --filter ancestor=ubuntu:22.04

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
82a598284012        ubuntu:22.04        "top"               3 minutes ago        Up 3 minutes                            sleepy_bose

以下根据镜像中的文件层(layer)d0e008c6cf02或在其层堆栈中包含此层的镜像来匹配容器。

$ docker ps --filter ancestor=d0e008c6cf02

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
82a598284012        ubuntu:22.04        "top"               3 minutes ago        Up 3 minutes  

目前docker ps --filter支持的过滤器有:

筛选描述
id容器 ID
name容器名称
label表示键或键值对的任意字符串。表示为<key><key>=<value>
exited表示容器退出代码的整数。仅适用于--all
status以下之一createdrestartingrunningremovingpausedexiteddead
ancestor筛选共享给定镜像作为祖先的容器。表示为<image-name>[:<tag>]<image id><image@digest>
before或者since过滤在给定容器 ID 或名称之前或之后创建的容器
volume过滤已安装给定卷或绑定安装的运行容器。
network过滤连接到给定网络的运行容器。
publish或者expose过滤发布或暴露指定端口的容器。表示为<port>[/<proto>]<startport-endport>/[<proto>]
health根据容器的健康检查状态进行过滤。startinghealthyunhealthy之一none
isolationdefault仅限 Windows 守护程序。 、process或之一hyperv
is-task过滤作为服务“任务”的容器。布尔选项(truefalse

结论

虽然 docker ps | grep 是一种简单的过滤方法,但在处理大量容器时,它的效率和精确度不如 docker ps -f。通过使用 docker ps -f,你可以更加精确和高效地找到你需要的容器信息。为提高工作效率,建议在日常 Docker 管理中采用 docker ps -f 进行容器过滤。