# docker container ls

## 用法

```shellscript
docker container ls [OPTIONS]
```

### 别名

别名是较长命令的简短或易于记忆的替代形式。

* `docker container list`
* `docker container ps`
* `docker ps`

## 选项

| 选项             | 默认值  | 描述                                                                                                                                                                                                  |
| -------------- | ---- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `-a, --all`    |      | 显示所有容器（默认仅显示正在运行的容器）                                                                                                                                                                                |
| `-f, --filter` |      | 根据提供的条件过滤输出                                                                                                                                                                                         |
| `--format`     |      | 使用自定义模板格式化输出： `'table'`：以带列标题的表格格式打印输出（默认） `'table TEMPLATE'`：使用给定的 Go 模板以表格格式打印输出 `'json'`：以 JSON 格式打印 `'TEMPLATE'`：使用给定的 Go 模板打印输出。 有关使用模板格式化输出的更多信息，请参阅 <https://docs.docker.com/go/formatting/> |
| `-n, --last`   | `-1` | 显示最后创建的 n 个容器（包含所有状态）                                                                                                                                                                               |
| `-l, --latest` |      | 显示最新创建的容器（包含所有状态）                                                                                                                                                                                   |
| `--no-trunc`   |      | 不截断输出                                                                                                                                                                                               |
| `-q, --quiet`  |      | 仅显示容器 ID                                                                                                                                                                                            |
| `-s, --size`   |      | 显示总文件大小                                                                                                                                                                                             |

## 过滤 (`--filter`)

过滤标志 (`--filter`) 的格式为 `key=value`。如果有多个过滤器，则传递多个标志（例如，`--filter "foo=bar" --filter "bif=baz"`）。

目前支持的过滤器有：

<table><thead><tr><th width="195.875">过滤器</th><th>描述</th></tr></thead><tbody><tr><td><code>id</code></td><td>容器 ID</td></tr><tr><td><code>name</code></td><td>容器名称</td></tr><tr><td><code>label</code></td><td>任意字符串，表示一个键或键值对。格式为 <code>&#x3C;key></code> 或 <code>&#x3C;key>=&#x3C;value></code></td></tr><tr><td><code>exited</code></td><td>表示容器退出代码的整数。仅在使用 <code>--all</code> 时有用。</td></tr><tr><td><code>status</code></td><td><code>created</code>、<code>restarting</code>、<code>running</code>、<code>removing</code>、<code>paused</code>、<code>exited</code> 或 <code>dead</code> 之一</td></tr><tr><td><code>ancestor</code></td><td>筛选共享给定镜像作为祖先的容器。格式为 <code>&#x3C;image-name>[:&#x3C;tag>]</code>、<code>&#x3C;image id></code> 或 <code>&#x3C;image@digest></code></td></tr><tr><td><code>before</code> 或 <code>since</code></td><td>筛选在给定容器 ID 或名称之前或之后创建的容器</td></tr><tr><td><code>volume</code></td><td>筛选已挂载指定卷或绑定挂载的运行中容器</td></tr><tr><td><code>network</code></td><td>筛选连接到指定网络的运行中容器</td></tr><tr><td><code>publish</code> 或 <code>expose</code></td><td>筛选发布或暴露了指定端口的容器。格式为 <code>&#x3C;port>[/&#x3C;proto>]</code> 或 <code>&#x3C;startport-endport>/[&#x3C;proto>]</code></td></tr><tr><td><code>health</code></td><td>根据健康检查状态筛选容器。值为 <code>starting</code>、<code>healthy</code>、<code>unhealthy</code> 或 <code>none</code></td></tr><tr><td><code>isolation</code></td><td><strong>仅限 Windows 守护进程</strong>。值为 <code>default</code>、<code>process</code> 或 <code>hyperv</code></td></tr><tr><td><code>is-task</code></td><td>筛选作为服务“任务”的容器。布尔选项（<code>true</code> 或 <code>false</code>）</td></tr></tbody></table>

### `label` 过滤器

`label` 过滤器根据标签的存在与否或标签及其值进行匹配。

以下过滤器匹配具有 `color` 标签的容器，无论其值是什么：

```bash
$ 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` 的容器：

```bash
$ docker ps --filter "label=color=blue"
CONTAINER ID   IMAGE     COMMAND     CREATED           STATUS            PORTS     NAMES
d85756f57265   busybox   "top"       About a minute ago   Up About a minute             high_albattani
```

### `name` 过滤器

`name` 过滤器匹配容器名称的全部或部分。

以下过滤器匹配名称包含 `nostalgic_stallman` 字符串的所有容器：

```bash
$ docker ps --filter "name=nostalgic_stallman"
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS     NAMES
9b6247364a03   busybox   "top"       2 minutes ago   Up 2 minutes             nostalgic_stallman
```

你也可以过滤名称中的子字符串，如下所示：

```bash
$ docker ps --filter "name=nostalgic"
CONTAINER ID   IMAGE     COMMAND     CREATED        STATUS        PORTS     NAMES
715ebfcee040   busybox   "top"       3 seconds ago  Up 1 second             i_am_nostalgic
9b6247364a03   busybox   "top"       7 minutes ago  Up 7 minutes            nostalgic_stallman
673394ef1d4c   busybox   "top"       38 minutes ago Up 38 minutes           nostalgic_shockley
```

### `exited` 过滤器

`exited` 过滤器按退出状态码匹配容器。例如，要筛选成功退出的容器：

```bash
$ docker ps -a --filter 'exited=0'
CONTAINER ID   IMAGE             COMMAND       CREATED        STATUS                    PORTS                    NAMES
ea09c3c82f6e   registry:latest   /srv/run.sh   2 weeks ago    Exited (0) 2 weeks ago    127.0.0.1:5000->5000/tcp desperate_leakey
106ea823fe4e   fedora:latest     /bin/sh -c... 2 weeks ago    Exited (0) 2 weeks ago                             determined_albattani
48ee228c9464   fedora:20         bash          2 weeks ago    Exited (0) 2 weeks ago                             tender_torvalds
```

你可以使用过滤器定位退出状态码为 137 的容器，这意味着它们被 SIGKILL(9) 杀死。

```bash
$ docker ps -a --filter 'exited=137'
CONTAINER ID   IMAGE          COMMAND          CREATED        STATUS                 PORTS     NAMES
b3e1c0ed5bfe   ubuntu:latest  "sleep 1000"     12 seconds ago Exited (137) 5 seconds ago       grave_kowalevski
a2eb5558d669   redis:latest   "/entrypoint.sh… 2 hours ago    Exited (137) 2 hours ago        sharp_lalande
```

导致 137 状态的事件包括：

* 容器的 init 进程被手动杀死
* `docker kill` 杀死了容器
* Docker 守护进程重启，杀死了所有运行中的容器

### `status` 过滤器

`status` 过滤器按容器状态进行匹配。容器状态的可能值如下：

<table><thead><tr><th width="146.08984375">状态</th><th>描述</th></tr></thead><tbody><tr><td><code>created</code></td><td>从未启动过的容器。</td></tr><tr><td><code>running</code></td><td>正在运行的容器，由 <code>docker start</code> 或 <code>docker run</code> 启动。</td></tr><tr><td><code>paused</code></td><td>已暂停的容器。参见 <code>docker pause</code>。</td></tr><tr><td><code>restarting</code></td><td>由于为该容器指定的重启策略而正在启动的容器。</td></tr><tr><td><code>exited</code></td><td>不再运行的容器。例如，容器内的进程已完成，或使用 <code>docker stop</code> 命令停止了容器。</td></tr><tr><td><code>removing</code></td><td>正在被移除过程中的容器。参见 <code>docker rm</code>。</td></tr><tr><td><code>dead</code></td><td>“僵死”容器；例如，由于外部进程占用资源而仅被部分移除的容器。僵死容器无法被（重新）启动，只能被移除。</td></tr></tbody></table>

例如，筛选正在运行的容器：

```bash
$ docker ps --filter status=running
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
715ebfcee040   busybox   "top"       16 minutes ago   Up 16 minutes             i_am_nostalgic
d5c976d3c462   busybox   "top"       23 minutes ago   Up 23 minutes             top
9b6247364a03   busybox   "top"       24 minutes ago   Up 24 minutes             nostalgic_stallman
```

筛选已暂停的容器：

```bash
$ docker ps --filter status=paused
CONTAINER ID   IMAGE     COMMAND     CREATED           STATUS                      PORTS     NAMES
673394ef1d4c   busybox   "top"       About an hour ago Up About an hour (Paused)             nostalgic_shockley
```

### `ancestor` 过滤器

`ancestor` 过滤器基于容器的镜像或其后代进行匹配。该过滤器支持以下镜像表示形式：

* `image`
* `image:tag`
* `image:tag@digest`
* `short-id`
* `full-id`

如果你不指定标签，则使用 `latest` 标签。例如，筛选使用最新 `ubuntu` 镜像的容器：

```bash
$ 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-c1` 镜像的容器（在此例中，它是 `ubuntu` 的子镜像）：

```bash
$ docker ps --filter ancestor=ubuntu-c1
CONTAINER ID   IMAGE       COMMAND     CREATED           STATUS           PORTS     NAMES
919e1179bdb8   ubuntu-c1   "top"       About a minute ago   Up About a minute             admiring_lovelace
```

匹配基于 `ubuntu` 版本 24.04 镜像的容器：

```bash
$ docker ps --filter ancestor=ubuntu:24.04
CONTAINER ID   IMAGE           COMMAND     CREATED        STATUS        PORTS     NAMES
82a598284012   ubuntu:24.04    "top"       3 minutes ago  Up 3 minutes            sleepy_bose
```

以下命令匹配基于层 `d0e008c6cf02` 或在其层堆栈中包含此层的镜像的容器：

```bash
$ docker ps --filter ancestor=d0e008c6cf02
CONTAINER ID   IMAGE           COMMAND     CREATED        STATUS        PORTS     NAMES
82a598284012   ubuntu:24.04    "top"       3 minutes ago  Up 3 minutes            sleepy_bose
```

### `before` 和 `since` 过滤器

`before` 过滤器仅显示在给定容器 ID 或名称之前创建的容器。例如，假设有以下已创建的容器：

```bash
$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS     NAMES
9c3527ed70ce   busybox   "top"       14 seconds ago  Up 15 seconds            desperate_dubinsky
4aace5031105   busybox   "top"       48 seconds ago  Up 49 seconds            focused_hamilton
6e63f6ff38b0   busybox   "top"       About a minute ago Up About a minute       distracted_fermat
```

使用 `before` 过滤会得到：

```bash
$ docker ps -f before=9c3527ed70ce
CONTAINER ID   IMAGE     COMMAND     CREATED           STATUS            PORTS     NAMES
4aace5031105   busybox   "top"       About a minute ago   Up About a minute            focused_hamilton
6e63f6ff38b0   busybox   "top"       About a minute ago   Up About a minute            distracted_fermat
```

`since` 过滤器仅显示在给定容器 ID 或名称之后创建的容器。例如，使用与 `before` 过滤器相同的容器：

```bash
$ docker ps -f since=6e63f6ff38b0
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS         PORTS     NAMES
9c3527ed70ce   busybox   "top"       10 minutes ago   Up 10 minutes            desperate_dubinsky
4aace5031105   busybox   "top"       10 minutes ago   Up 10 minutes            focused_hamilton
```

### `volume` 过滤器

`volume` 过滤器仅显示挂载了特定卷或在特定路径上挂载了卷的容器：

```bash
$ docker ps --filter volume=remote-volume --format "table {{.ID}}\t{{.Mounts}}"
CONTAINER ID   MOUNTS
9c3527ed70ce   remote-volume

$ docker ps --filter volume=/data --format "table {{.ID}}\t{{.Mounts}}"
CONTAINER ID   MOUNTS
9c3527ed70ce   remote-volume
```

### `network` 过滤器

`network` 过滤器仅显示连接到给定名称或 ID 的网络的容器。

以下过滤器匹配所有连接到名称包含 `net1` 的网络的容器：

```bash
$ docker run -d --net=net1 --name=test1 ubuntu top
$ docker run -d --net=net2 --name=test2 ubuntu top
$ docker ps --filter network=net1
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
9d4893ed80fe   ubuntu    "top"       10 minutes ago   Up 10 minutes             test1
```

`network` 过滤器同时匹配网络的名称和 ID。以下示例显示了使用网络 ID 作为过滤器附加到 `net1` 网络的所有容器：

```bash
$ docker network inspect --format "{{.ID}}" net1
8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5

$ docker ps --filter network=8c0b4110ae930dbe26b258de9bc34a03f98056ed6f27f991d32919bfe401d7c5
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
9d4893ed80fe   ubuntu    "top"       10 minutes ago   Up 10 minutes             test1
```

### `publish` 和 `expose` 过滤器

`publish` 和 `expose` 过滤器仅显示发布了或暴露了给定端口号、端口范围和/或协议的容器。未指定时，默认协议为 `tcp`。

以下过滤器匹配所有发布了 80 端口的容器：

```bash
$ docker run -d --publish=80 busybox top
$ docker run -d --expose=8080 busybox top
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND     CREATED        STATUS        PORTS                    NAMES
9833437217a5   busybox   "top"       5 seconds ago  Up 4 seconds  8080/tcp                 dreamy_mccarthy
fc7e477723b7   busybox   "top"       50 seconds ago Up 50 seconds 0.0.0.0:32768->80/tcp    admiring_roentgen

$ docker ps --filter publish=80
CONTAINER ID   IMAGE     COMMAND     CREATED           STATUS            PORTS                    NAMES
fc7e477723b7   busybox   "top"       About a minute ago   Up About a minute 0.0.0.0:32768->80/tcp    admiring_roentgen
```

以下过滤器匹配所有暴露了 8000-8080 范围内 TCP 端口的容器：

```bash
$ docker ps --filter expose=8000-8080/tcp
CONTAINER ID   IMAGE     COMMAND     CREATED        STATUS        PORTS       NAMES
9833437217a5   busybox   "top"       21 seconds ago Up 19 seconds 8080/tcp    dreamy_mccarthy
```

以下过滤器匹配所有暴露了 UDP 80 端口的容器：

```bash
$ docker ps --filter publish=80/udp
CONTAINER ID   IMAGE     COMMAND     CREATED        STATUS        PORTS     NAMES
```

## 格式化输出 (`--format`)

`--format` 选项使用 Go 模板来美化打印容器输出。

Go 模板的有效占位符如下：

| 占位符           | 描述                                                 |
| ------------- | -------------------------------------------------- |
| `.ID`         | 容器 ID                                              |
| `.Image`      | 镜像 ID                                              |
| `.Command`    | 带引号的命令                                             |
| `.CreatedAt`  | 容器创建时间                                             |
| `.RunningFor` | 容器启动后经过的时间                                         |
| `.Ports`      | 暴露的端口                                              |
| `.State`      | 容器状态（例如；`"created"`、`"running"`、`"exited"`）        |
| `.Status`     | 带有关于持续时间和健康状态详情的容器状态                               |
| `.Size`       | 容器磁盘大小                                             |
| `.Names`      | 容器名称                                               |
| `.Labels`     | 分配给容器的所有标签                                         |
| `.Label`      | 此容器特定标签的值。例如 `'{{.Label "com.docker.swarm.cpu"}}'` |
| `.Mounts`     | 此容器中挂载的卷的名称                                        |
| `.Networks`   | 附加到此容器的网络的名称                                       |

使用 `--format` 选项时，`ps` 命令将输出模板声明的数据，或者在使用 `table` 指令时，包含列标题。

以下示例使用不带标题的模板，为所有正在运行的容器输出由冒号 (`:`) 分隔的 ID 和 Command 条目：

```bash
$ docker ps --format "{{.ID}}: {{.Command}}"
a87ecb4f327c: /bin/sh -c #(nop) MA
01946d9d34d8: /bin/sh -c #(nop) MA
c1d3b0166030: /bin/sh -c yum -y up
41d50ecd2f57: /bin/sh -c #(nop) MA
```

要在表格格式中列出所有带有标签的正在运行的容器，可以使用：

```bash
$ docker ps --format "table {{.ID}}\t{{.Labels}}"
CONTAINER ID   LABELS
a87ecb4f327c   com.docker.swarm.node=ubuntu,com.docker.swarm.storage=ssd
01946d9d34d8
c1d3b0166030   com.docker.swarm.node=debian,com.docker.swarm.cpu=6
41d50ecd2f57   com.docker.swarm.node=fedora,com.docker.swarm.cpu=3,com.docker.swarm.storage=ssd
```

要以 JSON 格式列出所有正在运行的容器，请使用 `json` 指令：

```bash
$ docker ps --format json
{"Command":"\"/docker-entrypoint.…\"","CreatedAt":"2021-03-10 00:15:05 +0100 CET","ID":"a762a2b37a1d","Image":"nginx","Labels":"maintainer=NGINX Docker Maintainers <docker-maint@nginx.com>","LocalVolumes":"0","Mounts":"","Names":"boring_keldysh","Networks":"bridge","Ports":"80/tcp","RunningFor":"4 seconds ago","Size":"0B","State":"running","Status":"Up 3 seconds"}
```
