如何在 CLI 中使用 ctr 在 containerd 中 运行 docker 图像?

How to run docker images in containerd using ctr in CLI?

正在探索如何使用 containerd 代替 dockerd。这仅供学习,并作为 cli 工具,而不是与任何管道或自动化一起使用。

到目前为止,关于在 cli 中使用 containerd(通过 ctr)的文档非常有限。甚至官方文档都在使用 Go lang 直接利用 containerd

我学到的是 ctr 命令扮演着 docker 命令控制 containerd 的角色。到目前为止,我已经创建了一个 docker 图像并将其导出为 .tar 格式。现在使用 ctr i import hello.tar 我已将其导入为图像。

现在 ctr i ls 给我以下输出:

REF                                     TYPE                                       DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/library/hello-java-app:latest application/vnd.oci.image.manifest.v1+json sha256:ef4acfd85c856ea020328959ff3cac23f37fa639b7edfb1691619d9bfe1e06c7 628.7 MiB linux/amd64 -

尝试 运行 容器要求我提供图像 ID:

root@slave-node:~/images/sample# ctr run
ctr: image ref must be provided
root@slave-node:~/images/sample# ctr run docker.io/library/hello-java-app:latest
ctr: container id must be provided

我不确定从哪里获取图像 ID。是否有任何与 ctrcontainerd 相关的文档对初学者有帮助?

只需 运行将图像作为容器就足够了。

ctr run命令创建容器并执行

ctr run <imageName> <uniqueValue>

e.g., ctr run docker.io/library/hello-java-app:latest v1 --rm

这将使用打印语句执行我的基本 docker java 图像:

~~~~
HelloWorld from Java Application running in Docker.
~~~~

遵循的步骤:

1 - 一个 java 文件:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("~~~~\nHelloWorld from Java Application running in Docker.\n~~~~");
    }
}

2 - 图片:

FROM java:8
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]

3 - 构建图像并导出为 .tar

  • docker build -t hello-java-app .
  • docker save -o ~/images/sample/hello-java-app.tar hello-java-app

4 - 将图像 (.tar) 导入 containerd:

  • ctr i import hello-java-app.tar
unpacking docker.io/library/hello-java-app:latest (sha256:ef4acfd85c856ea020328959ff3cac23f37fa639b7edfb1691619d9bfe1e06c7)...done
  • ctr i ls
REF                                     TYPE                                       DIGEST                                                                  SIZE      PLATFORMS   LABELS
docker.io/library/hello-java-app:latest application/vnd.oci.image.manifest.v1+json sha256:ef4acfd85c856ea020328959ff3cac23f37fa639b7edfb1691619d9bfe1e06c7 628.7 MiB linux/amd64 -

5 - 运行 图片:

  • ctr run docker.io/library/hello-java-app:latest v1 --rm
~~~~
HelloWorld from Java Application running in Docker.
~~~~

I am still unsure of the use of creating a container. The run command creates a container and executes it once. ctr c create just creates a container which can then be listed with ctr c ls but I am not able to utilize them in any meaningful way. Can anyone clarify its purpose?


PS: 如果没有 --rm 标志,则需要为每个 run 输入一个新的唯一值,因为保留了旧容器,我们得到一个错误:ctr: snapshot "v1": already exists