0

这是我想要完成的事情:

运行 Docker 并能够从 containerd 的 API 管理其图像/容器。这纯粹是一种教育练习。

我试过的:

  1. 启动 dockerd
  2. 已验证我有一个工作守护进程:
$ docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
mcr.microsoft.com/dotnet/runtime   latest              ec54a6c985a0        11 days ago         186MB
  1. 安装了 nerdctl以用作 containerd 的 CLI。
  2. 尝试连接到 Docker 管理的 containerd 的同一个套接字和命名空间,但没有得到任何结果:
$ nerdctl --address /var/run/docker/containerd/containerd.sock -n moby images
REPOSITORY    TAG    IMAGE ID    CREATED    SIZE
  1. 我也尝试过直接从 Go 执行此操作,但仍然没有得到任何结果:
package main

import (
    "context"
    "log"

    "github.com/containerd/containerd"
    "github.com/containerd/containerd/namespaces"
)

func main() {
    if err := test(); err != nil {
        log.Fatal(err)
    }
}

func test() error {
    client, err := containerd.New("/var/run/docker/containerd/containerd.sock")
    if err != nil {
        return err
    }
    defer client.Close()

    ctx := namespaces.WithNamespace(context.Background(), "moby")

    images, err := client.ListImages(ctx)
    if err != nil {
        return err
    }
    log.Printf("%v images\n", len(images))

    return nil
}

我获得成功连接的事实表明事情正在正确的轨道上。我只是不明白为什么在 Docker 命令和直接对 containerd 的调用之间没有看到相同的结果。

4

1 回答 1

0

从 Docker 维护者 Sebastiaan van Stijn 那里得到了答案:

dockerd 使用 containerd 的运行时组件,但不是(还没有?)图像存储和快照器,这就是为什么你看不到图像,只有容器

于 2021-03-24T13:13:56.837 回答