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

Bha*_*Yes 8 containers docker containerd

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

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

我学到的是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 -
Run Code Online (Sandbox Code Playgroud)

尝试运行容器要求我提供图像 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
Run Code Online (Sandbox Code Playgroud)

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

仅将图像作为容器运行对我来说就足够了。

Bha*_*Yes 9

ctr run命令创建一个容器并执行它

ctr run <imageName> <uniqueValue>
Run Code Online (Sandbox Code Playgroud)

例如,ctr 运行 docker.io/library/hello-java-app:latest v1 --rm

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

~~~~
HelloWorld from Java Application running in Docker.
~~~~
Run Code Online (Sandbox Code Playgroud)

步骤如下:

1 - 一个java文件:

ctr run <imageName> <uniqueValue>
Run Code Online (Sandbox Code Playgroud)

2 - 图像:

FROM java:8
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]
Run Code Online (Sandbox Code Playgroud)

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
~~~~
HelloWorld from Java Application running in Docker.
~~~~
Run Code Online (Sandbox Code Playgroud)
  • ctr i ls
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("~~~~\nHelloWorld from Java Application running in Docker.\n~~~~");
    }
}
Run Code Online (Sandbox Code Playgroud)

5 - 运行图像:

  • ctr run docker.io/library/hello-java-app:latest v1 --rm
FROM java:8
COPY HelloWorld.java .
RUN javac HelloWorld.java
CMD ["java", "HelloWorld"]
Run Code Online (Sandbox Code Playgroud)

我仍然不确定创建容器的用途。run 命令创建一个容器并执行一次。ctr c create只是创建一个容器,然后可以将其列出,ctr c ls但我无法以任何有意义的方式利用它们。任何人都可以澄清其目的吗?


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

  • 如何在“ctr run”命令中使用经典的 docker 选项,例如转发端口 (-p) 或分离容器 (-d) 或绑定卷 (-v) (2认同)