1. 概述

Docker 提供了多种方式来列出和过滤处于不同状态的容器,甚至可以自定义输出格式。本文将介绍如何使用 docker container ls(或 docker ps)命令来查看和筛选容器。

2. 列出容器

要列出 Docker 容器,可以使用 docker psdocker container ls 命令。这两个命令功能一致,只是写法不同。

2.1. 命令别名

从 Docker 1.13 开始,Docker 将命令统一归类到其操作对象下。因此,除了 docker ps,还可以使用 docker container listdocker container ls 命令。

虽然三个命令功能一致,但推荐使用新的 docker container 命令结构,更直观清晰。

2.2. 查看运行中的容器

默认情况下,docker container ls 会列出所有正在运行的容器:

$ docker container ls

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                NAMES
1addfea727b3        mysql:5.6            "docker-en.."   2 seconds ago       Up 1 second         0.0.0.0:32801->3306/tcp              dazzling_hellman
09c4105cb356        nats:2.1.0-scratch   "/nats-…"       17 minutes ago      Up 17 minutes       4222/tcp, 6222/tcp, 8222/tcp         nats-1
4cf774b9e4a4        redis:5              "docker-…"      30 minutes ago      Up 30 minutes       0.0.0.0:32787->6379/tcp              redis-2

以上输出显示了三个正在运行的容器:MySQL、NATS 和 Redis。

2.3. 查看所有容器(包括已停止)

默认只显示运行中的容器。若要查看所有容器(包括停止的),加上 -a--all

$ docker container ls -a

CONTAINER ID        IMAGE                STATUS
1addfea727b3        mysql:5.6            Up 4 hours
32928d81a65f        mysql:5.6            Exited (1) 4 hours ago
09c4105cb356        nats:2.1.0-scratch   Up 4 hours
16d3c67ebd40        postgres:11          Exited (0) 4 hours ago
4cf774b9e4a4        redis:5              Up 4 hours

这里可以看到两个已经停止的容器:MySQL 和 PostgreSQL。

2.4. 查看最近创建的容器

要查看最近的 n 个容器,使用 -n <number>--last <number>

$ docker container ls -n 2

CONTAINER ID        IMAGE               STATUS
1addfea727b3        mysql:5.6           Up 4 hours
32928d81a65f        mysql:5.6           Exited (1) 4 hours ago

也可以使用 -l--latest 查看最新的一个容器:

$ docker container ls --latest

CONTAINER ID        IMAGE               STATUS
1addfea727b3        mysql:5.6           Up 4 hours

2.5. 禁用输出截断

默认情况下,如果字段内容过长,Docker 会截断显示。可以通过 --no-trunc 禁用截断:

$ docker container ls --latest --no-trunc

CONTAINER ID                                                       COMMAND
1addfea727b38f484a2e0023ed7f47dcb9bbfc6e053f094c349391bb38cb3af7   "docker-entrypoint.sh mysqld"

2.6. 静默模式(仅显示容器 ID)

使用 -q--quiet 可仅显示容器 ID:

$ docker container ls -q

1addfea727b3
09c4105cb356
4cf774b9e4a4

结合 --no-trunc 可显示完整 ID:

$ docker container ls --quiet --no-trunc

1addfea727b38f484a2e0023ed7f47dcb9bbfc6e053f094c349391bb38cb3af7
09c4105cb3567ba0070dacf7381b9946165908c819c0841cffaa1855766537c7
443fc0c41710ee3811e72fe5079bf4696b9318e0754c38eeab1c960f5c5a7007
b06cfe3053e521704c67a1902a7302665ae05f66ef592419f32b8c73b2a066fd
4cf774b9e4a487a2ba658de37273994161378cffe7e69fe5c928ad29e6946372

静默模式常用于将容器 ID 传给其他命令,例如强制删除所有容器:

$ docker container rm -f $(docker container ls -aq)

⚠️ 使用时务必小心,避免误删。

2.7. 查看容器大小

使用 -s--size 可查看容器及其镜像的磁盘占用:

$ docker container ls --latest -s

CONTAINER ID        IMAGE               SIZE
1addfea727b3        mysql:5.6           2B (virtual 256MB)
  • 2B 表示容器可写层占用大小
  • 256MB 表示镜像大小

2.8. 自定义输出格式

可以通过 --format 使用 Go 模板自定义输出格式:

$ docker container ls --format "{{.ID}} -> Based on {{.Image}}, named {{.Names}}, ({{.Status}})"

1addfea727b3 -> Based on mysql:5.6, named dazzling_hellman, (Up 3 hours)
09c4105cb356 -> Based on nats:2.1.0-scratch, named nats-1, (Up 4 hours)
4cf774b9e4a4 -> Based on redis:5, named redis-2, (Up 4 hours)

也可以输出为表格格式:

$ docker container ls --format "table {{.ID}}\t{{.Image}}\t{{.Names}}"

CONTAINER ID        IMAGE                NAMES
1addfea727b3        mysql:5.6            dazzling_hellman
09c4105cb356        nats:2.1.0-scratch   nats-1
4cf774b9e4a4        redis:5              redis-2

模板支持的字段如下:

字段名 含义
.ID 容器 ID
.Image 镜像名和标签
.Command 启动命令
.CreatedAt 创建时间
.Running 已运行时间
.Ports 端口映射
.Status 容器状态
.Size 容器和镜像磁盘大小
.Names 容器名称
.Labels 容器标签
.Mounts 挂载卷
.Networks 所属网络

2.9. 高级过滤

除了基本的运行/停止状态过滤,还可以通过 -f--filter 实现更复杂的筛选。

按退出状态过滤

$ docker container ls --filter "status=exited"

CONTAINER ID        IMAGE               STATUS
32928d81a65f        mysql:5.6           Exited (1) 8 hours ago
16d3c67ebd40        postgres:11         Exited (0) 9 hours ago

多条件过滤

$ docker container ls --filter "status=exited" --filter "exited=1"

CONTAINER ID        IMAGE               STATUS
32928d81a65f        mysql:5.6           Exited (1) 8 hours ago

按容器状态过滤

支持的状态包括:created, restarting, running, removing, paused, exited, dead

例如,查看被暂停的容器:

$ docker container pause redis-2
$ docker container ls --filter "status=paused"

CONTAINER ID        IMAGE               STATUS
4cf774b9e4a4        redis:5             Up 45 minutes (Paused)

按名称过滤

$ docker container ls -a --filter "name=pg"

CONTAINER ID        IMAGE               STATUS
16d3c67ebd40        postgres:11         Exited (0) 9 hours ago

按基础镜像过滤

$ docker container ls -a --filter "ancestor=postgres"

CONTAINER ID        IMAGE               STATUS
16d3c67ebd40        postgres:11         Exited (0) 9 hours ago

按创建时间过滤

  • before: 查看某个容器之前创建的容器
  • since: 查看某个容器之后创建的容器
$ docker container ls --filter "before=nats-1"

CONTAINER ID        IMAGE               STATUS
4cf774b9e4a4        redis:5             Up 52 minutes (Paused)

$ docker container ls --filter "since=nats-1"

CONTAINER ID        IMAGE               STATUS
2fdc65a6effb        mysql:5.6           Exited (137) 4 days ago
1addfea727b3        postgres:11         Exited (0) 3 days ago

3. 小结

通过 docker container ls 命令,我们可以灵活地列出和过滤容器,包括运行状态、退出码、创建时间、名称、镜像等多个维度。结合 -q--format--filter 等参数,可以满足自动化脚本和运维场景的需求。

如需更详细信息,建议查阅 Docker 官方文档


原始标题:Listing Docker Containers