4

我有多个 Docker 映像和容器在 VM 上运行。但是像“runc list”这样的命令没有列出任何这些。

如何让 runc/containerd 知道我现有的 docker 镜像?

4

1 回答 1

5

运行时(runc)使用所谓的运行时根目录来存储和获取有关容器的信息。在这个根目录下,runc放置子目录(每个容器一个),每个子目录都包含state.json容器状态描述所在的文件。

运行时根目录的默认位置是/run/runc(对于非无根容器)或$XDG_RUNTIME_DIR/runc(对于无根容器)——后者通常也指向/run(例如/run/user/$UID/runc)下的某个位置。

当容器引擎调用runc时,它可能会覆盖默认的运行时根目录并指定自定义的(--root选项runc)。Docker 使用这种可能性,例如在我的机器上,它指定/run/docker/runtime-runc/moby为运行时根。

也就是说,要查看您的 Docker 容器,您必须通过指定选项runc list将其指向 Docker 的运行时根目录。--root此外,鉴于 Docker 容器默认不是无根的,您将需要适当的权限来访问运行时根(例如使用sudo)。

所以,这应该是如何工作的:

$ docker run -d alpine sleep 1000
4acd4af5ba8da324b7a902618aeb3fd0b8fce39db5285546e1f80169f157fc69

$ sudo runc --root /run/docker/runtime-runc/moby/ list
ID                                                                 PID         STATUS      BUNDLE                                                                                                                               CREATED                          OWNER
4acd4af5ba8da324b7a902618aeb3fd0b8fce39db5285546e1f80169f157fc69   18372       running     /run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/4acd4af5ba8da324b7a902618aeb3fd0b8fce39db5285546e1f80169f157fc69   2019-07-12T17:33:23.401746168Z   root

至于图像,您无法runc看到它们,因为它根本没有图像的概念 - 相反,它在bundles上运行。创建捆绑包(例如基于图像)是调用者的责任(在您的情况下 - containerd)。

于 2019-07-12T17:35:22.610 回答