1. 概述

Docker 是一种广泛采用的容器化技术。各种应用程序都可以在容器中运行。

虽然我们在启动容器时可以控制容器的名称,但ID由Docker生成。我们可能需要这个ID来在Docker主机上执行某些操作,因此从容器名称查找容器ID是一种非常常见的需求。

在这篇简短的教程中,我们将讨论从容器名称查找容器ID的各种方法。

2. 示例设置

让我们创建几个容器作为示例:

$ docker container run --rm --name web-server-1 -d nginx:alpine
$ docker container run --rm --name web-server-10 -d nginx:alpine
$ docker container run --rm --name web-server-11 -d nginx:alpine

现在, 让我们检查这些容器是否已创建:

$ docker container ls -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
80f1bc1e7feb   nginx:alpine   "/docker-entrypoint.…"   36 seconds ago   Up 36 seconds   80/tcp    web-server-11
acdea168264a   nginx:alpine   "/docker-entrypoint.…"   36 seconds ago   Up 36 seconds   80/tcp    web-server-10
0cbfc6c17009   nginx:alpine   "/docker-entrypoint.…"   37 seconds ago   Up 36 seconds   80/tcp    web-server-1

如您所见,我们使用 nginx 镜像有三个处于 运行 状态的容器。

3. 显示短容器ID

Docker为每个容器分配一个唯一的ID。完整的容器ID是一个包含64个字符的十六进制字符串。然而,在大多数情况下,此容器ID的较短版本就足够了。短容器ID代表完整容器ID的前12个字符。

让我们使用 Docker 的 container ls 子命令显示短容器ID:

$ docker container ls --all --quiet --filter "name=web-server-10"
acdea168264a

在此示例中,我们使用了 –filter 选项,该选项根据条件过滤输出。在我们的情况下,过滤是基于容器名称进行的。

此外,我们还使用了 –all–quiet 选项与命令一起使用。 –all 选项是必需的,以显示所有容器,因为默认情况下,它只会显示正在运行的容器。 –quiet 选项用于仅显示容器ID。

我们还可以使用 grepawk 命令的组合来显示短容器ID:

$ docker container ls --all | grep web-server-10 | awk '{print $1}'
acdea168264a

在这里,awk 命令打印输出的第一列,代表短容器ID。

应注意的是,grepawk 命令可能不在所有平台上可用。因此,这种方法的可移植性较低

4. 显示完整的容器ID

在大多数情况下,短容器ID就足够了。但在罕见情况下,需要完整的容器ID以避免混淆。

我们可以使用 Docker 的 container ls 子命令显示完整的容器ID:

$ docker container ls --all --quiet --no-trunc --filter "name=web-server-10"
acdea168264a08f9aaca0dfc82ff3551418dfd22d02b713142a6843caa2f61bf

在这里,我们使用了命令的 –no-trunc 选项。此选项覆盖默认行为并禁用输出截断。

同样,我们也可以使用 grepawk 命令的组合来达到相同的结果:

$ docker container ls --all --no-trunc | grep web-server-10 | awk '{print $1}'
acdea168264a08f9aaca0dfc82ff3551418dfd22d02b713142a6843caa2f61bf

Docker 的 container inspect 子命令以JSON格式显示关于容器的详细信息。我们可以使用它来显示容器ID:

$ docker container inspect web-server-10 --format={{.Id}}
acdea168264a08f9aaca0dfc82ff3551418dfd22d02b713142a6843caa2f61bf

在这个例子中,我们使用了 –format 选项,该选项使用Go模板从JSON输出中提取 Id 字段。

5. 使用精确匹配显示容器ID

这里,输出显示了三个容器ID。这是因为 web-server-1 名称部分匹配了其他两个容器 - web-server-10web-server-11。为了避免这种情况,我们可以使用正则表达式。

现在,让我们使用正则表达式与容器名称一起:

在本示例中,我们使用了 caret(^) 和 *dollar($) * 符号强制对容器名称进行精确匹配。

类似地,我们可以通过使用 -w 选项与 grep 命令一起使用来实现精确匹配: