一、概述
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
镜像,我们有三个处于running
状态的容器。
3. 显示短容器ID
Docker 为每个容器分配一个唯一的ID。完整的容器ID 是64 个字符的十六进制字符串。但是,在大多数情况下,此容器ID 的简短版本就足够了。短容器ID 表示完整容器ID 的前12 个字符。
让我们使用Docker 的container ls
child 命令显示短容器ID:
$ docker container ls --all --quiet --filter "name=web-server-10"
acdea168264a
在此示例中,我们使用了–filter
选项,它根据条件过滤输出。在我们的例子中,过滤是在容器的名称上完成的。
此外,我们还在命令中使用了–all
和–quiet
选项。–all
选项是显示所有容器所必需的,因为默认情况下,它只显示正在运行的容器。–quiet
选项仅用于显示容器ID。
我们还可以使用grep
和awk
命令的组合来显示短容器ID:
$ docker container ls --all | grep web-server-10 | awk '{print $1}'
acdea168264a
在这里,awk
命令打印输出的第一列,它表示短容器ID。
我们应该注意,grep
和awk
命令可能并非在所有平台上都可用。因此这种方法的可移植性较差。
4. 显示完整的容器ID
在大多数情况下,一个简短的容器ID 就足够了。但是,在极少数情况下,需要完整的容器ID 以避免歧义。
我们可以使用Docker 的container ls
child 命令来显示完整的容器ID:
$ docker container ls --all --quiet --no-trunc --filter "name=web-server-10"
acdea168264a08f9aaca0dfc82ff3551418dfd22d02b713142a6843caa2f61bf
在这里,我们在命令中使用了–no-trunc
选项。此选项覆盖默认行为并禁用输出截断。
我们可以使用grep
和awk
命令的组合来获得相同的结果:
$ 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
我们不能在所有场景中都使用基本的grep
或container ls
子命令。例如,如果容器名称部分匹配,这种幼稚的方法将不起作用。让我们看一个例子。
让我们显示web-server-1
容器的ID:
$ docker container ls --all --quiet --filter "name=web-server-1"
80f1bc1e7feb
acdea168264a
0cbfc6c17009
在这里,输出显示了三个容器ID。发生这种情况是因为名称web-server-1
部分匹配其他两个容器-web-server-10
和web-server-11
。为了避免这种情况,我们可以使用正则表达式。
现在,让我们使用带有容器名称的正则表达式:
$ docker container ls --all --quiet --filter "name=^web-server-1$"
0cbfc6c17009
在此示例中,我们使用caret(^)
和dollar($)
符号来强制容器名称完全匹配。
以类似的方式,我们可以在grep
命令中使用-w
选项来强制执行完全匹配:
$ docker container ls --all | grep -w web-server-1 | awk '{print $1}'
0cbfc6c17009
六,结论
在本文中,我们了解了如何使用名称查找容器ID。
首先,我们使用container
ls
child 命令以及grep
和awkcommands
的组合来显示短容器ID。
然后我们使用–no-trunc
选项和container inspect
child 命令来显示完整的容器ID。
最后,我们使用正则表达式来确保容器名称完全匹配。
0 评论